以resnet18为例

分为三个部分:set load model

resnet输入尺寸如何处理 resnet输入图片大小_卷积

 

set

很多数据集都是从dataset里引用的

如果我想改输入图片的大小,比如说将32改为80,会有reshape函数去改变可以用自动填充去看看函数的参数,应该是两个参数,一个是要改为的量,一个是方法(可能是,未验证),一般方法是两个(斜方向)像素点中进行变化,如果是变小的话,也是一定的变化,这些都不是原来的像素点了。

set用的图片格式有两种,一种是pil类中的格式,一种是torch中的tensor,cv2(opencv)中是一个GBR图,需要换顺序,而且还变为一个numpy类型的量(具体有点迷糊了,有时间看看numpy类)

load:

一个是载入功能,一个是打包,打乱功能,这里batch_size=128,也就是参数大小的第一维=128

model:

model:一些变量含义:

in_planes:输入的通道数 planes:输出的通道数 stride:步长padding:补充0的个数(注意是两边加)kernel_size:(卷积核的大小)

resnet输入尺寸如何处理 resnet输入图片大小_ide_02

 

 

 basicblock是一个两层的卷积,2个layer1,2个layer2,2个layer3,2个layer4

一开始输入的是(128,3,32,32)128为批量数,3为rgb所以是3个通道的,32*32为大小

Resnet在CIFAR10上的实践和论文里有明显的差异,用论文里的实现会出现什么问题?为什么?

论文中第一层卷积kernal=7同时有一个最大池化

cifar10中第一次卷积核为3,且没有最大池化

(核大小的差别:重点集中的感觉?可以试试)

(分辨率?(体现的方面))

想要增大图片的大小(分辨率)可以将maxpooling往后放,或者padding增大,但可能会造成边缘没有意义啥的(可以尝试一下)。

经过第一次卷积:

resnet输入尺寸如何处理 resnet输入图片大小_resnet输入尺寸如何处理_03

 

 

 通道变为64,大小为(32+2*1-3+1)/1=32,(128,64,32,32)

卷积核公式:(初始维数+2*padding-kernel_size+1)/stride(向上取整)

而后经过【2,2,2,2】次卷积,就是2个layer1,2个layer2,2个layer3,2个layer4

resnet输入尺寸如何处理 resnet输入图片大小_卷积核_04

 

 

 这里要注意make_layer会有一个shortcut的过程,就是将维数变为一致,因为在forward中最后有一个相加的过程

resnet输入尺寸如何处理 resnet输入图片大小_resnet输入尺寸如何处理_05

 

在stride=1时没有这个过程,在stride=2时存在这个过程。

resnet输入尺寸如何处理 resnet输入图片大小_ide_06

 

 

 两层的stride不同,只有第一层有shortcut的过程

经过layer1:(128,64,32,32)->(128,64,32,32)->(128,64,32,32)

经过layer2:(128,64,32,32)->(128,128,16,16)->(128,128,16,16)

经过layer3:(128,128,16,16)->(128,256,8,8)->(128,256,8,8)

经过layer4:(128,256,8,8)->(128,512,4,4)->(128,512,4,4)

这里都是转录任务

resnet输入尺寸如何处理 resnet输入图片大小_卷积核_07

 这是分类任务

 

resnet输入尺寸如何处理 resnet输入图片大小_卷积核_08

 

out = out.view(out.size(0), -1) 这里out.size(0)是指out第一维的大小(在这为128),-1指直接算出为多少,也可以写为512*4*4,就是一个变化将这个4维向量变为2维向量。(avg_pool2d不太懂)

这里就完成了整个resnet

resnet输入尺寸如何处理 resnet输入图片大小_resnet输入尺寸如何处理_09

 

 

一些需要尝试的地方

  • l  BN单元:BN在现代神经网络的进化中占有重要地位,去除BN,会有什么影响?

加快网络的训练和收敛的速度,即我们可以使用较大的学习率

控制梯度爆炸防止梯度消失

防止过拟合

  • l  隐藏层宽度:Resnet默认具有四个阶段,每个阶段的输入的频道数都不同,试着降低或者提高这些通道,有什么影响?
  • l  训练策略:标准的Resnet训练策略是什么?(CIFAR10)改变这些策略组,会有什么影响?

cifar10:

resnet输入尺寸如何处理 resnet输入图片大小_ide_10

 

这里用的是SGD,试试Adam等

 可以看看这个CosineAnnealingLR

  • l  线性策略(resnet18试试看这个策略用于学习率怎么样)

τ:使训练集遍历几百次
ϵτ:约为ϵ0的1\%1%

ϵ0:检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率[李4]

在τ步迭代之后,一般使ϵ保持常数。