CNN入门+猫狗大战(Dogs vs. Cats)+PyTorch入门

一些修改(修改后的代码)

  1. 修改原 络的输出方式。原 络采用的交叉熵进行Loss计算,而这个函数内部是已经进行了softmax处理的(参考),所以 络中的输出再进行就重复了,故改正。
  2. 增加epoch的训练机制,就是重复的读取数据集n次进行训练,然后保存最后的参数
  3. 优化了,每次可以加载多个图像测试
  4. 调整了image的裁剪方式,先按比例进行图像缩放,然后进行中心裁剪,可以使训练数据更精准,最大可能保证输入图像包含一个完整的猫或狗
  5. 文中用到的模型是自己随意写的,所以性能差,如需提高精度,可以参考我用torchvision自带的ResNet18进行的代码

1.pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()
2.ResNet18实现猫狗大战


CNN入门+猫狗大战+PyTorch实现

  • 写在前面
  • 猫狗大战介绍
  • CNN介绍
    • 卷积结构
    • 卷积(convolution)
    • 激活函数(activation function)
    • 池化(pooling)
    • 全连接(fully connected)
    • 一个简单的CNN
  • 络设计
  • PyTorch实现
    • PyTorch一点介绍
    • 实现步骤
    • 代码实现
      • 准备数据
      • 搭建 络
      • 训练 络
      • 测试 络
    • 代码运行步骤
    • 实验结果
  • 参考

写在前面

深度学习入门教程,参考了许多资料,在PyTorch框架下实现了深度 络的设计和实现,在此总结一下,给初学者提供一点学习思路。
运行环境:
硬件:,,
软件:+++++

猫狗大战介绍

训练集:训练集由标记为catdog的猫狗图片组成,各张,总共张,图片为24位jpg格式,即RGB三通道图像,图片尺寸不一

测试集:测试集由张的cat或dog图片组成,未标记,图片也为24位jpg格式,RGB三通道图像,图像尺寸不一

CNN介绍

CNN(Convolutional Neural Networks)即卷积神经 络,顾名思义是一种神经 络,其基本运算方式为卷积。因 上有大量的CNN原理介绍、中心思想和使用说明,在此只做简要介绍。

卷积结构

如下图所示,一个简单的CNN由输入层,卷积层,池化层,全连接层组成

传统数字图像处理方法中,一般输入图像为灰度图像,通道为1,因此图像卷积操作中卷积核深度为1,为一个()的二维矩阵,而在CNN中,由于每一层(包含彩色图像输入层)图像存在多个通道(feature map),每一个通道图像均需要一个卷积核,分别对各自通道进行卷积,然后将各个通道卷积的结果线性叠加形成新的图像作为卷积结果(feature map),例:设卷积输入层图像为[],输出层图像为[](假设padding,stride,dilation设置满足需求),卷积核size为5,则卷积核的规模为[],卷积核的个数为24
padding:原图像的补0边数,卷积操作中,为了满足原图像边缘位置在卷积后的图像中存在一个对应位置,给原图像增加几条补0边。第一个卷积示意图中虚线边。
stride:卷积操作中每次卷积核滑动的步长
dilation:卷积核的间隔,如一个[]的卷积核,如果dilation为1,则实际卷积过程中卷积核覆盖的区域为[]
图像卷积输出大小计算:不同的卷积核参数导致输出的图像(feature map)大小存在多种可能(指图像的H和W,C不受影响),以PyTorch框架下的设置为例,PyTorch中卷积核需要设置的参数有size,padding,stride和dilation,每个参数包括H,W两个方向。具体如下:

H o u t = [ H i n + 2 × p a d d i n g h d i l a t i o n h × ( s i z e h 1 ) 1 s t r i d e h ] + 1 H_{out}=[frac{H_{in}+2{times}{rm padding}_{h}-{rm dilation_{h}{times}({rm size}_{h}-1)-1}}{{rm stride}_{h}}]+1 Hout/span>=[strideh/span>Hin/span>+2×paddingh/span>/span>dilationh/span>×(sizeh/span>/span>1)/span>1/span>]+1
W o u t = [ W i n + 2 × p a d d i n g w d i l a t i o n w × ( s i z e w 1 ) 1 s t r i d e w ] + 1 W_{out}=[frac{W_{in}+2{times}{rm padding}_{w}-{rm dilation_{w}{times}({rm size}_{w}-1)-1}}{{rm stride}_{w}}]+1 Wout/span>=[stridew/span>Win/span>+2×paddingw/span>/span>dilationw/span>×(sizew/span>/span>1)/span>1/span>]+1

激活函数(activation function)

激活函数主要引入非线性特性,简单的说就是在卷积过程中,所有的运算都是线性运算和线性叠加,无论 络多复杂,输入输出关系都是线性关系,没有激活函数, 络就无法拟合非线性特性的输入输出关系,常用的激活函数有Sigmoid,Tanh,ReLU等。
在CNN中,卷积核的每一次卷积在累加模板内各个位置的乘积后,将累加值输入激活函数,然后将输出值作为卷积结果。

池化(pooling)

下图所示为一个2×2 Max pooling计算示意图

  1. 输入一张128×128的彩色图像,以RGB格式解析数据的话,其形式为一个[]的矩阵;
  2. conv1中,卷积核size为3×3,共6个卷积核,所以conv1的输出图像为6通道(6个feature map)128×128图像(假设padding,stride,dilation设置合理),即conv1的输出为一个[]的矩阵,因为conv1的输入为3通道图像,所以conv1中卷积核的深度为3
  3. 池化层,采用了一个2×2的Max pooling,所以输入图像的通道数不变,尺寸÷2,即输出图像为一个[64×64×6]的矩阵
  4. conv2中,卷积核size为,共12个卷积核,所以conv2的输出图像为12通道(12个feature map)图像,一个[]的矩阵,conv2的卷积核深度和conv1输出图像通道数一致为6
  5. 池化,的Max pooling,输出为一个[]的矩阵
  6. FC1,输入为一个[]的矩阵,输出为一个[]的矩阵,该层首先将输入矩阵展开成一个32×32×12=12288的一维列向量(数组形式),然后将每个数据对128个输出数据做映射,总共是12288×128=个映射关系,每个映射需要一个权重系数,总共是个
  7. FC2,和FC1一样,将维列向量映射至维列向量,10维表示输出目标有10种,每个维度的值表示CNN结构输入图像属于该维目标的可能性(若输出值做了softmax计算)

络设计

  1. Input:图像尺寸为像素,由于训练集和测试集中的图片大小尺寸多样,因此在送入 络前,须将图片调整至200×200像素
  2. conv1:卷积核的规模为[],size大小,深度,数量
  3. 第一次卷积结果:个卷积图像(feature map),像素
  4. Pooling:第一次池化,size大小,Max pooling
  5. 第一次池化结果:图像缩小为像素
  6. conv2:卷积核的规模为[],size大小,深度,数量
  7. 第二次卷积结果:个卷积图像(feature map),

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年5月17日
下一篇 2019年5月17日

相关推荐