Lingmoumou's Blog

きっといつかって愿うまま

0%

Task5 卷积神经网络基础;leNet;卷积神经网络进阶

卷积神经网络基础

笔记整理

通过观察互相关运算可知,输入数据(这里以二维数组为例)的边缘部分相较于中间部分来说,使用的次数较少,对于一些存储重要信息的边缘数据来说,这无疑是重大的损失,这里可以通过填充来解决这一问题吗??也就是在输入数据的边缘填充0,使得原来的边缘数据中心化???
padding解决不了这个问题,因为padding的内容其实是不包含信息量的0。
这个问题感觉是个不错的思考~但是又感觉很奇怪,平时是遇不到这个问题的。
比如给你一张狗的图片,shape 224224,你换成 222222,你不可能不认识它了。
比如即使你使用77的大卷积核,损失的也仅仅是边缘的3个像素而已。
更何况现在都是3
3的卷积核,那1个像素是不会包含什么重要信息的。

padding的用途之一就是弥补特征提取时可能造成的边缘信息缺失。我们人在观察图片内容的过程,其实也是就是一个特征提取的过程。人在拍摄照片时,习惯将重要的事物放在图片中央,所以,在用卷积操作提取图片特征时,中间运算次数多,两边少,这是能满足大多数图像重要信息提取的。但是,当你的图片中边缘有重要信息,而卷积核又取得相对较大时,为了更好的保留边缘信息,我们可以考虑使用SAME padding,保持特征图不缩小(具体计算公式见我给出的PPT)。楼上这位朋友解释说“padding解决不了这个问题,因为padding的内容其实是不包含信息量的0。”,这不太对。因为他忽略了虽然padding的0不含信息,但是原始图片(或是FM)的边缘是包含信息的啊,而且你认为边缘信息对你当前要处理的任务来说是重要的,所以,你在要SAME padding处理,以尽可能多提取边缘信息啊。

老师提出问题
conv2d.weight.data -= lr conv2d.weight.grad
conv2d.bias.data -= lr
conv2d.bias.grad
上面两行代码,如果删掉.data会发生什么?如果遇到一些问题,如何解决?
经测试:如果删掉.data,也就是代码变为:
conv2d.weight -= lr conv2d.weight.grad
conv2d.bias -= lr
conv2d.bias.grad
会报错:RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.
这里给出一种解决方法:
with torch.no_grad( ):
conv2d.weight -= lr conv2d.weight.grad
conv2d.bias -= lr
conv2d.bias.grad

为什么两个连续的3×3卷积核的感受野与一个5×5卷积核的感受野相同?
比如一个7X7的图像,经过一次55的卷积核后形成一个33的特征图;
同样一个7X7的图像,经过两次次33的卷积核后才形成形成一个33的特征图。

例子中的Kernel都是固定值,但是再torch的nn.Conv2d()中只给出了kernel_size的值,这是为什么,是因为kernel value也是一个学习的变量吗?
kernel_size 是需要手动调整的,但是在训练过程中并不需要学习。
因此kernel_size准确来说是一个超参数,目前越来越趋向于使用小的卷积核,如11,33。

kernel_size(即卷积核大小)这是需要人为设定的参数,该参数是不需要学习的,当然大小不同,卷积结果也是不同的。经过大量实验表明,大多选用1*1、3*3、5*5等尺寸较小且长宽为奇数的卷积核。
对于卷积核内的数值(可以认为是对应卷积作用区域下像素值的权重大小),这个数值是需要学习。当给定kernel_size时,函数即会初始化该卷积核内的数值。

卷积层和池化的区别?
最大的区别是,池化层没有需要学习的特征
卷积层用来学习识别某一种特征
池化层的主要作用是降维
卷积层当设置步长>1时也可以用来完成降维的工作

leNet

笔记整理

在训练测试过程中,每次都对optimizer进行清零处理,为啥结果的acc还是呈现递增的趋势
acc 是 accuracy,准确率,当然是越高越好啦。
optimizer = optim.SGD(net.parameters(), lr=lr),对优化器清零是清除的梯度,防止梯度累加,为下一波梯度计算留空间。而学习的参数并不清零,所以参数越来越优。
和前面梯度优化的例子一样,清零不影响网络的记忆性(不能说是连续的,目前的还很难达到连续性智能)

1、在构建网络时,卷积核应该怎么设置呢?这块可以讲解下吗?还是说可以通过梯度传播调整
2、卷积的时候图像个数增加是因为引入多个卷积核吗?
3、构建网络时时是否每次卷积完毕必须引入池化层?还是说这个看网络设计者的调节

  1. 很多同学都在问这块的问题,如何设计神经网络,其实不是这么课程重点需要关注的问题。
    实际使用时往往不需要你来设计,基本上都是用经典结构,最多是进行一些改造。
    那么到底如何设计呢?这块一两句话肯定说不清,可以按照发展顺序阅读经典论文,去寻求一些模型设计经验的线索。
    LeNet -> AlexNet -> VGG -> GoogleNet -> ResNet -> DenseNet 等等,后面就不说了,还有数不尽的论文等待着去学习。。。
  2. 这个问题提问我没太看明白
  3. 不是每个卷积层后面都要池化,经常是多个卷积层后面接一个池化层。
    池化是为了降维,我们最终希望提取到的是一些抽象的有代表性的特征,而不是很多很多感受野非常小的细节特征,例如纹理,颜色等。
    而且有的网络也会不使用池化层,而是使用步长>1的卷积层来替代pool层完成降维的工作。

池化层可以改变通道数?
池化层不是输入与输出的通道数相同,池化层的内核和padding可以改变特征的宽和高,但是通道数量不是不变的吗?
标准的池化层不改变通道数,手动实现当然更改平均池化或者最大池化运算的通道数层,但效果差异不大,因为可以通过卷积层改变通道数。

这里选择的池化,放大放小的比例,通道数似乎没有明确的说明,原理是什么??
如果是经验数据的话,这个可不可以成为学习的对象,通过调整卷积核和padding的大小能否选择出更好的网络??
当然可以通过调整看看会不会效果更好,这些都是人为设定的。

请问从pooling的6通道变成卷积层的16通道的详细变换过程是怎样的,依据是什么?
通道的数量取决于卷积核的数量,只不过LeNet的作者选择了16个

在卷积、池化的过程中,会出现通到数增加的情况,这应该是为了尽可能地提取特征信息;在leNet网络里面,通道数的变化比例是最优的吗??? 里面是否有理论支持,或者是一个经验数据呢?????
leNet网络里面的通道数变化比例在原始论文没有明确的理论支持,应该是一个经验数据

卷积神经网络进阶

笔记整理

这里的ALNet引入了一个概念,就是按某一个概率p将某处权重置0,那么按这个网络前进后,还可以进行反向传播吗??? 还有就是我们这里按一定规律取消部分神经元的作用,也就相当于采用另一种模型方式,那么我们这里的AlexNet就相当于一个模型集了,这理论上应该可以从多方面提取特征信息;然而就像人的大脑分成很多部分一样,如果我们不是单纯地使用一个简单的概率来规划神经元的使用,而是将不同神经元分成不同的区域或者进行更有效的规划,会不会让AI更连续呢??? 就像张钹院士在18年的一次报告中提到的,对于不满足“5个条件”的数据,也能很好预测
可以,不更新失活单元的权重就行了。

多换一个数据集的话(主要是size的变化),NiN block是不是仅需要改变第一个Convolution的大小,而后续的1x1的Convolution保持不变?
是的,你观察到了卷积和全连接的一个重要的差别,卷积其实不关心特征图的H和W。
如果你从10分类shape2242243的彩色数据集,切换到一个2分类shape1601601的灰度图数据集。
只需要替换第一个卷积的input_channel 和最后一个卷积或者全连接层的output_channel。
而如果你是从彩色数据集换成了彩色数据集,第一个卷积甚至都不需要发生变化。

卷积其实不关心特征图的H和W“的原因是什么呢?
卷积的工作流程是,以一定的卷积核大小,一定的步长,在特征图的不同位置,用同一个卷积核来进行互相关运算。
这就好像是,一个卷积核是用来提取某一种局部特征的,它在图像中的不同位置来寻找是否有符合它所关心的特征的局部区域。
这种工作机制导致了图像的尺寸(宽和高)并不影响卷积运算,只有通道数的变化才会影响。

inception网络第一个77卷积层后面为什么要加relu激活?
或者说b2中1
1卷积和3*3卷积为什么没加relu?还有inception定义中的p1 = F.relu(self.p1_1(x)),F是什么?
F是torch.nn.functional,前面有import torch.nn.functional as F
激活的话

  • 1x1 conv除了改变channel数,还有增加非线性的作用,一般都会跟着一个激活层
  • 其他感觉比较玄学设计,CV里可能跟ReLU可以做到单侧抑制增加稀疏有关吧