图像的色彩存储的时候是0-255,但我们做deeplearning的时候一般都是在0-1
理解卷积神经网络的作用
在我们之前说到的在80年代,处理一个需要1.6M的MNIST数据集都很困难
当时的科学家就想了一个办法
借鉴人眼的机制 receptive field感受野
当小孩子一眼看到桌子上的时候,他会被桌子上的蛋糕所吸引,因此他的视野里面,虽然说整个视野都能看得到,但第一眼看到的时候,可能是看到的是这个蛋糕,忽略了旁边的东西。当他慢慢回过神来以后,他才开始去关注旁边的一些事物。所以人眼的这样的机制就是一个局部相关性的属性。
当我们看一个风景的时候,我们不是一瞬间把所有风景都纳入眼底的,我们是一下子看一部分,然后有一个不自觉的扫描的过程,只不过因为时间太短了。然后我们把所有的信息综合在一起了,所以我们会觉得看到的是所有的风景,而实际上就是有局部相关性机制的,这种局部相关性我们叫做感受野。
因此当时的计算机学家在80年代就提出了模仿人眼的局部相关性的机制,提出了卷积神经网络。
卷积指的是局部相关性
一次感受的是一个小方块,而不是整个图片的大区间
小窗口移动的时候,权值是共享的
权指共享是什么意思呢
就是这个小窗口会扫过整个大的图片,扫的时候是使用的相同的参数,就是小窗口的权指参数是不变的,这就叫做weight sharing
拿LeNet5为例,这就是一个卷积神经网络,也就是使用了权指共享的网络
一共5层,它的参数量大概是60K
我们之前说的做MNIST的全连接网络是390K,它还是4层的
LeNet5的参数量是它的1/6
局部相关性的共享机制
假设右边这一层是256个点
全连接网络的时候,对于每一个点,都是乘以28*28=784,也就是跟前一层有784根线连接
现在卷积神经网络,对于每个点,只用乘以小窗口的3*3=9,跟前一层只有9根线连接
得到的每个点使用的参数量大大减少
因为它只考虑了跟他局部相关的位置的属性,跟他太远的一些点它没有考虑,都断开了
线性全连接网络 vs 卷积神经网络
左图的一个点的连线与右图的一个点的连线(可以也选右图的黑点比较,都是黑),就可以很形象的看出其参数量的差距了
通过这种方式,我们卷积层的权指的数量会成倍的减少,但仍然考虑到了整个图片的权指的信息。既考虑到整个的属性,又照顾到了跟它局部相关的点
卷积得到的图片叫feature map,因为不同的卷积核会对应不同的feature,有锐化、模糊、边缘检测等等
卷积操作
重叠越多,值越大
卷积神经网络
卷积得到的图片比原图要小
在形状等方面是原图的近似
如果我们在周围补0的话,可以得到28*28的,这就叫做padding操作
kernel卷积核可以理解是观察的视角
用边缘检测的卷积核得到的feature map就是边缘检测的,用模糊的卷积核得到的feature map就是模糊的
用边缘检测的视角得到的feature map就是边缘检测的,用模糊的视角得到的feature map就是模糊的
多kernel核
加入我们的原来图像是(1,28,28),即一个通道,图像尺寸是28*28
卷积核是(7,1,3,3),即由7个核,会得到7个feature map
最后得到的结果是 (7,26,26) ,卷积得到的图像的size会比原图小一些
即这里是7层
多核卷积运算的参数对应关系
one kernel的第一个3是与原图有3个通道对应的
bias的数量=kernel的数量
卷积神经网络的叠加
底层的feature map观察的角度是一些底层的特征,比如观察车的角度、边缘
第二次观察到角度是一些小维的概念,比如车的圆形、弧形、正方形
再高层就是一些更高维的概念,比如车有没有轮子、有没有玻璃
每一层都在前一层提取的特征上提取出更高维的特征
pytorch实现卷积神经网络
nn.Conv2d
nn.Conv2d(1,3,kernel_size=3,stride=1,padding=0)
第一个1是input channel,就是输入图像的通道数
第二个3是指卷积核的数量,也就是out_channel
所以input就是(1,28,28), kernel是(3,1,3,3)
调用一次layer.forward会直接完成一次卷积的前向运算
调整一下stride步长和padding参数
但是还是不推荐调用forward函数,推荐直接使用layer(x), 这相当于调用了__call__函数,里面封装了一些高级特性
F.conv2d
明白一个概念,在卷积神经网络中,权重weight就是我们的卷积核