先听了老师的直播课(内容大致和我暑期集训和新生讲的类似?果然是基础吗))然后仔细看了代码,发现基本结构也是相同的,先数据集——定义模型(也就是每一层)——训练——测试。不懂的部分也就是CV图像识别部分了,这部分还在自学看课程中。还有调节模型参数的方法也需要再学习。
一些CNN的笔记:
16. 卷积(本质还是线性计算,channel变,宽高可变可不)
用来检测,提取特征的,比如找图像中老鼠的屁股在哪,是一种运算方式(和下采样等运算类似功能)
其实就是做数学运算(多项式乘法),在一个n*n的卷积patch中,给每个像素分配不同权重(或者相同),遍历每一个像素块,形成模糊的效果(下面是高斯模糊,给中间值更大的权重,模拟更真实的失焦效果),最后的图像中每个像素块的值都是经过patch块卷积后的值
1.最终输出结果和卷积核(kernel_size)都是n*n(长宽)
2.对于原图像,每个channel都要配一个卷积核
3.输出想要得到m个channel,就要m个卷积核(1个卷积核生成channel=1的输出)
16.1. Padding
Padding是什么?如果Output=5*5,Input至少要7*7才可从(0,0)元素就开始做卷积。Padding就是在5*5的基础上加一圈0变成7*7
16.2. Stride
stride:步长。卷积核本来是一步步移动,但stride=2就是两步两步移动了。降低Output的宽高(不降之前和Kernel一个大小)
16.3. 池化层(默认stride = 2,Channel不变,宽高变)
Eg:一个2*2的最大池化层,把Input分隔成4个2*2,每个里面找到最大值拼成2*2
经过最大池化层后宽和高各/2
maxpooling_layer = torch.nn.MaxPool2d(kernel_size = 2)
16.4. 代码+计算公式
# 4个维度确定input
input = torch.Tensor(input).view(batch的大小,channel数,宽度,高度)
# 4个维度确定kernel卷积核
kernel = torch.Tensor([1,2,3,4...9]).view(输出channel数,输入channel数,宽度,高度)
宽高的变化:宽-kernel_size+1