神经网络学习笔记——利用pytorch搭建卷积神经网络(CNN)

目录

一、简介

二、隐藏层介绍

        1、卷积层(Convolutional layer)

        2、池化层(Pooling layer)

        3、全连接层

        4、具体实现代码


一、简介

        卷积神经网络(Convolutional Neural Network,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习的代表算法之一。

        其结构主要分为输入层、隐藏层和输出层。

        对于卷积神经网络而言,其输入层、输出层与平常的神经网络无异。但其隐藏层可以分为三个部分,分别是卷积层(对输入数据进行特征提取)、池化层(特征选择和信息过滤)和全连接层(等价于传统前馈神经网络中的隐藏层)。

二、隐藏层介绍

        1、卷积层(Convolutional layer)

        卷积将输入图像放进一组卷积滤波器,每个滤波器激活图像中的某些特征。

        卷积过程可以提取特征,卷积神经网络是根据特征来完成分类的。

        在Pytorch中,卷积层重要的函数是(二维卷积):

        self.conv2d =nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1,groups=1,bias=True,padding_mode='zeros'),其中:

        1、in_channels:是输入的四维张量[N, C, H, W]中的C了,即输入张量的channels数。这个形参是确定权重等可学习参数的shape所必需的。

        2、out_channels:期望的四维输出张量的channels数。

        3、kernel_size:卷积核的大小,如果卷积滤波器长宽相等,那只需要写kernel_size = 5这样的就行了。如果长宽不同,比如3x5的卷积核,那么写作kernel_size = (3, 5),注意需要写一个tuple,而不能写一个list 。

        4、stride = 1:卷积核在图像窗口上每次平移的间隔,即所谓的步长。

        5、padding = 0:Pytorch与Tensorflow在卷积层实现上最大的差别就在于padding上。
   Padding即所谓的图像填充,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding = 1为例,若原始图像大小为32x32,那么padding后的图像大小就变成了34x34。

        附:图像填充的目的:每卷积一次,图像就会变小,卷积几次图像就会变得非常小,而Padding可以使图像大小保持原有大小;第二点是,图像角落和边缘的像素卷积过程中被使用到的次数非常少,而其他地方的像素被多次重叠使用,丢失了边界上许多信息。所以为了解决上面两个问题,在卷积之前使用pad(填充)周边方式。

        6、dilation = 1:这个参数决定了是否采用空洞卷积默认为1(不采用)。从中文上来讲,这个参数的意义从卷积核上的一个参数到另一个参数需要走过的距离,那当然默认是1了,毕竟不可能两个不同的参数占同一个地方吧(为0)。

        7、groups = 1:决定是否采用分组卷积,现在用的比较多的是groups = in_channel。当groups = in_channel。当groups = in_channel时,是在做的depth-wise conv的,具体思想可以参考MobileNet。

        8、bias = True:即是否要添加偏置参数作为可学习参数的一个,默认为True。
 

        2、池化层(Pooling layer)

        池化层用于在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。常见的池化是最大池化,最大池化指的是取出这些被卷积后的数据的最大值,就是取出其最大特征。
        在Pytorch中,池化层常用 / 重要的函数是(二维自适应最大池化):

        torch.nn.AdaptiveAvgPool2d(output_size)

        3、全连接层

        全连接层与普通神经网络的结构相同

        4、具体实现代码

           卷积层、池化层和全连接层实现代码

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # nn.Sequential是一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,
        # 且以神经网络模块为元素的有序字典也可以作为传入参数,
        # nn.Conv2d 二维卷积,先实例化再使用在Pytorch的nn模块中,不需要手动定义网络层的权重和偏置。
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=16,
                      kernel_size=5, stride=1, padding=2 # 若要保持输出图像大小不变 padding计算公式为 insize+2p-kernel_size+1=outsize
            ),
            nn.ReLU(), # 分段线性函数,所有负值置零,正值不变(单侧抑制)
            nn.MaxPool2d(kerner_size=2) #2x2采样,28/2=14,output shape (16,14,14) maxpooling有局部不变性而且可以提取显著特征的同时降低模型的参数,从而降低模型的过拟合
        )    
        self.conv2 = nn.Sequential(nn.Conv2d(16, 32, 5, 1, 2), #output shape (32,7,7)
                                  nn.ReLU(),
                                  nn.MaxPool2d(2))
        # 因上述几层网络处理后的output为[32,7,7]的tensor,展开即为7*7*32的一维向量,接上一层全连接层,最终output_size应为10,即识别出来的数字总类别数
        # 在二维图像处理的任务中,全连接层的输入与输出一般都设置为二维张量,形状通常为[batch_size, size]
        self.out = nn.Linear(32*7*7, 10) # 全连接层 7*7*32, num_classes

    def forward(self, x):
        x = self.conv1(x) # 卷一次
        x = self.conv2(x) # 卷两次
        x = x.view(x.size(0), -1) #flat (batch_size, 32*7*7) 
        # 将前面多维度的tensor展平成一维 x.size(0)指batchsize的值
        # view()函数的功能根reshape类似,用来转换size大小
        output = self.out(x) # fc out全连接层 分类器
        return output

        

        

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃山竹的开心小迟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值