• pytorch初学笔记(十三):神经网络基本结构之Sequential层的使用以及搭建完整的小型神经网络实战


    目录

    一、Container下Sequential层的介绍

    1.1 作用

     1.2 Example

    二、实战神经网络搭建以及sequential的使用

    2.1 前期准备

    2.1.1 神经网络模型

    2.1.2 求卷积过程中的padding参数

     2.2 网络搭建

    2.3 sequential的使用

    2.4 检验网络正确性

    三、完整代码

    3.1 控制台输出

    3.2  tensorboard可视化


    一、Container下Sequential层的介绍

    Sequential — PyTorch 1.13 documentation

    •  传入参数为module

    CLASS torch.nn.Sequential(*args: Module)

    • 传入参数为有序字典 

    CLASS torch.nn.Sequential(arg: OrderedDict[strModule]

    1.1 作用

     A sequential container. Modules will be added to it in the order they are passed in the constructor.

    构建一个序列化的container,可以把想要在神经网络中添加的操作都放进去,按顺序进行执行。

     1.2 Example

    把卷积、非线性激活、卷积、非线性激活使用sequantial进行组合,一起放在构建的model中。

    1. # Using Sequential to create a small model. When `model` is run,
    2. # input will first be passed to `Conv2d(1,20,5)`. The output of
    3. # `Conv2d(1,20,5)` will be used as the input to the first
    4. # `ReLU`; the output of the first `ReLU` will become the input
    5. # for `Conv2d(20,64,5)`. Finally, the output of
    6. # `Conv2d(20,64,5)` will be used as input to the second `ReLU`
    7. model = nn.Sequential(
    8. nn.Conv2d(1,20,5),
    9. nn.ReLU(),
    10. nn.Conv2d(20,64,5),
    11. nn.ReLU()
    12. )
    13. # Using Sequential with OrderedDict. This is functionally the
    14. # same as the above code
    15. model = nn.Sequential(OrderedDict([
    16. ('conv1', nn.Conv2d(1,20,5)),
    17. ('relu1', nn.ReLU()),
    18. ('conv2', nn.Conv2d(20,64,5)),
    19. ('relu2', nn.ReLU())
    20. ]))

    二、实战神经网络搭建以及sequential的使用

    2.1 前期准备

    2.1.1 神经网络模型

    使用数据集为CIFAR10,其模型结构如下所示。 

     

    1. 输入大小为3*32*32
    2. 经过3次【5*5卷积核卷积-2*2池化核池化】操作后,输出为64*4*4大小
    3. 展平后为1*1024大小
    4. 经过全连接层后输出为1*10

    2.1.2 求卷积过程中的padding参数

     在我们的第一个卷积过程中,输入通道数为3,输出通道数为32,卷积核大小为5,Conv2d所需的前三个参数已设置完成,因为没有使用空洞卷积,所示dilation默认为1,无需设置,步长stride默认为1,下面需要使用公式计算padding和stride的值为多少。

    使用上述公式进行计算,把H,dilation,kernel_size进行代入,设置stride=1,padding求出=2。

    如果保持输入输出的大小不变,则stride=1,padding=2,后面的卷积中都是使用该两个值,无需进行计算。

     2.2 网络搭建

    根据模型中的步骤进行卷积池化和全连接操作。

    1. import torch.nn
    2. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
    3. class Maweiyi(torch.nn.Module):
    4. def __init__(self):
    5. super(Maweiyi, self).__init__()
    6. self.conv1 = Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)
    7. self.maxpool1 = MaxPool2d(kernel_size=2)
    8. self.conv2 = Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2)
    9. self.maxpool2 = MaxPool2d(kernel_size=2)
    10. self.conv3 = Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2)
    11. self.maxpool3 = MaxPool2d(kernel_size=2)
    12. self.flatten = Flatten()
    13. self.linear1 = Linear(in_features=1024, out_features=64)
    14. self.linear2 = Linear(in_features=64, out_features=10)
    15. def forward(self, x):
    16. x = self.conv1(x)
    17. x = self.maxpool1(x)
    18. x = self.conv2(x)
    19. x = self.maxpool2(x)
    20. x = self.conv3(x)
    21. x = self.maxpool3(x)
    22. x = self.linear1(x)
    23. x = self.linear2(x)
    24. return x

    2.3 sequential的使用

    可以看到上面神经网络进行搭建时非常繁琐,在init中进行了多个操作的定以后需要在forward中逐次进行调用,因此我们使用sequential方法,在init方法中直接定义一个model,然后在下面的forward方法中直接使用一次model即可。

    在init方法中:

    self.model1 = Sequential(

         Conv2d(...)

         MaxPool2d(...)

         Linear(...)

    )

    在forward方法中:

     x = self.model(x)

    return x

    1. class Maweiyi(torch.nn.Module):
    2. def __init__(self):
    3. super(Maweiyi, self).__init__()
    4. self.model1 = Sequential(
    5. Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
    6. MaxPool2d(kernel_size=2),
    7. Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
    8. MaxPool2d(kernel_size=2),
    9. Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
    10. MaxPool2d(kernel_size=2),
    11. Flatten(),
    12. Linear(in_features=1024, out_features=64),
    13. Linear(in_features=64, out_features=10)
    14. )
    15. def forward(self, x):
    16. x = self.model1(x)
    17. return x

    2.4 检验网络正确性

     创建输入的tensor,大小为神经网络中一开始输入的大小,为(64,3,32,32),经过神经网络后输出大小应为10。

    使用torch.ones方法进行创建规定大小的tensor

    (21条消息) torch.ones(),torch.add(),torch.zeros(),torch.squeeze()_skycrygg的博客-CSDN博客_torch.add()

      

    1. input = torch.ones((64,3,32,32))
    2. output = maweiyi(input)
    3. print(output.shape)

    输出如下:

    三、完整代码

    3.1 控制台输出

    1. import torch.nn
    2. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
    3. class Maweiyi(torch.nn.Module):
    4. def __init__(self):
    5. super(Maweiyi, self).__init__()
    6. self.model1 = Sequential(
    7. Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
    8. MaxPool2d(kernel_size=2),
    9. Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
    10. MaxPool2d(kernel_size=2),
    11. Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
    12. MaxPool2d(kernel_size=2),
    13. Flatten(),
    14. Linear(in_features=1024, out_features=64),
    15. Linear(in_features=64, out_features=10)
    16. )
    17. def forward(self, x):
    18. x = self.model1(x)
    19. return x
    20. maweiyi = Maweiyi()
    21. print(maweiyi)
    22. input = torch.ones((64,3,32,32))
    23. output = maweiyi(input)
    24. print(output.shape)

     

    3.2  tensorboard可视化

    使用SummaryWriter中的add_gragh方法生成神经网络模型 。

    1. import torch.nn
    2. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
    3. from torch.utils.tensorboard import SummaryWriter
    4. class Maweiyi(torch.nn.Module):
    5. def __init__(self):
    6. super(Maweiyi, self).__init__()
    7. self.model1 = Sequential(
    8. Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),
    9. MaxPool2d(kernel_size=2),
    10. Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),
    11. MaxPool2d(kernel_size=2),
    12. Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),
    13. MaxPool2d(kernel_size=2),
    14. Flatten(),
    15. Linear(in_features=1024, out_features=64),
    16. Linear(in_features=64, out_features=10)
    17. )
    18. def forward(self, x):
    19. x = self.model1(x)
    20. return x
    21. maweiyi = Maweiyi()
    22. print(maweiyi)
    23. input = torch.ones((64,3,32,32))
    24. output = maweiyi(input)
    25. print(output.shape)
    26. writer = SummaryWriter("logs")
    27. writer.add_graph(maweiyi,input)
    28. writer.close()

    输出: 

     

     

  • 相关阅读:
    73个产品小白必备知识,项目管理也可看
    GPT版本通俗简单介绍
    【Andriod】使用adb命令安装和卸载apk的通用python脚本
    linux内存监控
    数千年中东文明史的五个阶段
    开发运维-常用远程桌面开源软件
    java毕业生设计医护监视系统计算机源码+系统+mysql+调试部署+lw
    中小型工业企业的数字化转型之路
    log4j2的使用
    华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯
  • 原文地址:https://blog.csdn.net/weixin_45662399/article/details/128075680