Convolutional Neural Networks(CNN)介绍–Pytorch实现

  • A+
所属分类:深度学习
摘要主要介绍Convolutional Neural Networks(CNN)的内容, 文章中会使用Pytorch实现一个识别猫狗的算例。

CNN, 卷积神经网络介绍

卷积神经网络一般是由卷积层池化层全连接层堆叠而成的前馈神经网络结构。卷积神经网络同样使用反向传播算法进行训练。

卷积神经网络在逐层学习过程中,会逐步进行学习。第一层学习比较低层的图片结构,第二层学习依据第一层的结果学习高一级的特征,这样最后一层依据前一层学到的高级特征就能完成我们的学习任务。(如下图所示)

Convolutional Neural Networks(CNN)介绍--Pytorch实现

卷积层

图片在计算机中是通过像素矩阵来进行表示的,每一个像素一个数值,范围为0-255。如下图所示,图片矩阵为499*495的矩阵。

Convolutional Neural Networks(CNN)介绍--Pytorch实现

对于彩色照片,我们通常使用RGB三个信道来进行表示,把三个信道进行叠加,就可以看到彩色的照片了。对于上面的图片,如果是彩色的,就会是(499, 495, 3)

卷积核

内容来源Machines that can see: Convolutional Neural Networks

我们有如下的图像矩阵和卷积核。

Convolutional Neural Networks(CNN)介绍--Pytorch实现

用动图来看一下卷积的过程。

Convolutional Neural Networks(CNN)介绍--Pytorch实现

卷积的过程就是一个简单的乘法和加法的过程。如在左上角的时候,我们可以看到计算步骤为:1×0 +2×1+2×1+1×2=6。

卷积步长

在上面的动图中,卷积步长(Stride)为1。当然,我们可以设置卷积步长为2。步长变大会提升效率

下面是卷积步长为1的情况:

Convolutional Neural Networks(CNN)介绍--Pytorch实现

下面是卷积步长为2的情况:

Convolutional Neural Networks(CNN)介绍--Pytorch实现

边距扩展

边距扩展的由来是因为我们需要控制输出的矩阵的大小。我们会发现,随着卷积步长的增大,输出矩阵在持续变小,于是就有了边距扩展(Padding)的操作。

我们来看一个例子,Half Padding。Half Padding 也叫 Same Padding,它希望得到的输出矩阵尺寸与输入尺寸一致。下图即为我们对5×5的输入矩阵外围补上一圈0后,与3×3的卷积核做卷积运算,最终依然得到5×5的输出矩阵的过程。

Convolutional Neural Networks(CNN)介绍--Pytorch实现

在Pytorch中,padding的计算可以通过下面的公式来得到:

Convolutional Neural Networks(CNN)介绍--Pytorch实现

高维多卷积核过程

对于彩色图片的三维图像矩阵,如m×n×k的矩阵,我们可以选取a×b×k的卷积核。下面我们举一个例子。

下面输入矩阵为553,padding=1,stride=2;两个卷积核为333;进行卷积后,得到了332的输出矩阵。(注意下面在进行计算的时候需要加上b0)

Convolutional Neural Networks(CNN)介绍--Pytorch实现

PyTorch中的实现

在PyTorch中,分别会有nn.Conv1d,nn.Conv2d,nn.Conv3d,分别对应1D, 2D, 3D卷积,可以看下面的图片。

一维卷积

Convolutional Neural Networks(CNN)介绍--Pytorch实现

二维卷积

Convolutional Neural Networks(CNN)介绍--Pytorch实现

三维卷积

Convolutional Neural Networks(CNN)介绍--Pytorch实现

参考链接 : CNN中的1D,2D和3D卷积是什么意思?

池化层

上面介绍了卷积层,接着介绍卷积神经网络中另一个非常重要的层,也就是池化层。池化操作其实就是降采样操作过程。我们都知道,图片是一个非常大的训练数据,所以想达到很好的训练性能,只有卷积层是不够的。池化层通过降采样的方式,在不影响图像质量的情况下,压缩图片,达到减少训练参数的目的。

需要注意的是,往往在几个卷积层之后我们就会引入池化层,池化层没有需要学习的参数,且池化层在每一个深度上独立完成,就是说池化后图像的纵深保持不变。下面介绍两种常用的池化方式(直接看图就可以明白,就不解释了)。

最大值池化

Convolutional Neural Networks(CNN)介绍--Pytorch实现

平均值池化

Convolutional Neural Networks(CNN)介绍--Pytorch实现

PyTorch实现

详细的链接地址如下 : Pytorch_CNN_CAT_DOG

网络结构如下所示:

Convolutional Neural Networks(CNN)介绍--Pytorch实现
  1. class cnn(nn.Module):
  2.     def __init__(self):
  3.         super(cnn, self).__init__()
  4.         # 参数的定义
  5.         # 卷积层+池化层
  6.         self.conv = nn.Sequential(
  7.             # 第一层
  8.             nn.Conv2d(kernel_size=3, in_channels=1, out_channels=32, stride=1, padding=1), # (64, 64, 32)
  9.             nn.ReLU(),
  10.             nn.MaxPool2d(kernel_size=2, stride=1), #(63, 63, 32)
  11.             # 第二层
  12.             nn.Conv2d(kernel_size=3, in_channels=32, out_channels=64, stride=1, padding=1), # (63, 63, 64)
  13.             nn.ReLU(),
  14.             nn.MaxPool2d(kernel_size=2, stride=1), # (62, 62, 64)
  15.             # 第三层
  16.             nn.Conv2d(kernel_size=3, in_channels=64, out_channels=128, stride=1, padding=1), # (62, 62, 128)
  17.             nn.ReLU(),
  18.             nn.MaxPool2d(kernel_size=2, stride=2)# (31, 31, 128)
  19.         )
  20.         # 全连接层
  21.         self.line = nn.Sequential(
  22.             nn.Linear(in_features=123008, out_features=128), # 31*31*128
  23.             nn.Dropout(p=0.6),
  24.             nn.Linear(in_features=128, out_features=2)
  25.         )
  26.     def forward(self, x):
  27.         x = self.conv(x)
  28.         x = x.view(x.size(0), -1) #展开
  29.         x = self.line(x)
  30.         return x

需要注意的只有padding那里的数值。如第一层我们要保持经过卷积运算后图像大小不变,利用上面的公式(在讲边距扩展的时候那里有一个式子),把kernel_size, stride, H(in), H(out)的值确定下来,就能计算padding了。

每一层输出的大小我都标注在旁边了,可以进行查看。

模型的保存于重载

第一种是只保存模型的参数:

  1. # 只保存模型的参数
  2. torch.save(Cnn.state_dict(),'cats_dogs_params.pkl')
  3. # 重载模型参数
  4. Cnn.load_state_dict(torch.load('cats_dogs_params.pkl'))

第二种是保存整个模型:

  1. # 保存整个模型
  2. torch.save(Cnn, 'cats_dogs_params.pth')
  3. # 加载整个模型
  4. model = torch.load('model.pth')

其余过程都类似,具体可以看github仓库中的文件。

参考文章

PyTorch文档 : PyTorch文档

非常好的入门的一个教材:实验楼机器学习

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: