一些修改(修改后的代码)
- 修改原 络的输出方式。原 络采用的交叉熵进行Loss计算,而这个函数内部是已经进行了softmax处理的(参考),所以 络中的输出再进行就重复了,故改正。
- 增加epoch的训练机制,就是重复的读取数据集n次进行训练,然后保存最后的参数
- 优化了,每次可以加载多个图像测试
- 调整了image的裁剪方式,先按比例进行图像缩放,然后进行中心裁剪,可以使训练数据更精准,最大可能保证输入图像包含一个完整的猫或狗
- 文中用到的模型是自己随意写的,所以性能差,如需提高精度,可以参考我用torchvision自带的ResNet18进行的代码
1.pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()
2.ResNet18实现猫狗大战
CNN入门+猫狗大战+PyTorch实现
- 写在前面
- 猫狗大战介绍
- CNN介绍
-
- 卷积结构
- 卷积(convolution)
- 激活函数(activation function)
- 池化(pooling)
- 全连接(fully connected)
- 一个简单的CNN
- 络设计
- PyTorch实现
-
- PyTorch一点介绍
- 实现步骤
- 代码实现
-
- 准备数据
- 搭建 络
- 训练 络
- 测试 络
- 代码运行步骤
- 实验结果
- 参考
写在前面
深度学习入门教程,参考了许多资料,在PyTorch框架下实现了深度 络的设计和实现,在此总结一下,给初学者提供一点学习思路。
运行环境:
硬件:,,
软件:+++++
猫狗大战介绍
训练集:训练集由标记为cat和dog的猫狗图片组成,各张,总共张,图片为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计算示意图
- 输入一张128×128的彩色图像,以RGB格式解析数据的话,其形式为一个[]的矩阵;
- conv1中,卷积核size为3×3,共6个卷积核,所以conv1的输出图像为6通道(6个feature map)128×128图像(假设padding,stride,dilation设置合理),即conv1的输出为一个[]的矩阵,因为conv1的输入为3通道图像,所以conv1中卷积核的深度为3
- 池化层,采用了一个2×2的Max pooling,所以输入图像的通道数不变,尺寸÷2,即输出图像为一个[64×64×6]的矩阵
- conv2中,卷积核size为,共12个卷积核,所以conv2的输出图像为12通道(12个feature map)图像,一个[]的矩阵,conv2的卷积核深度和conv1输出图像通道数一致为6
- 池化,的Max pooling,输出为一个[]的矩阵
- FC1,输入为一个[]的矩阵,输出为一个[]的矩阵,该层首先将输入矩阵展开成一个32×32×12=12288的一维列向量(数组形式),然后将每个数据对128个输出数据做映射,总共是12288×128=个映射关系,每个映射需要一个权重系数,总共是个
- FC2,和FC1一样,将维列向量映射至维列向量,10维表示输出目标有10种,每个维度的值表示CNN结构输入图像属于该维目标的可能性(若输出值做了softmax计算)
络设计
|
- Input:图像尺寸为像素,由于训练集和测试集中的图片大小尺寸多样,因此在送入 络前,须将图片调整至200×200像素
- conv1:卷积核的规模为[],size大小,深度,数量
- 第一次卷积结果:个卷积图像(feature map),像素
- Pooling:第一次池化,size大小,Max pooling
- 第一次池化结果:图像缩小为像素
- conv2:卷积核的规模为[],size大小,深度,数量
-
第二次卷积结果:个卷积图像(feature map),
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!