卷积神经网络
- ** 本文为365天深度学习训练营 中的学习记录博客**
- ** 原作者:K同学啊 | 接辅导、项目定制**
>- ** 本文同时也参考了https://www.bilibili.com/video/BV1AJ411Q72b/?vd_source=080c58ed744f7682e4eb0e56a511ad78【子豪兄】深度学习之卷积神经网络
结构介绍
(图片来源:https://www.bilibili.com/video/BV1AJ411Q72b/?vd_source=080c58ed744f7682e4eb0e56a511ad78【子豪兄】深度学习之卷积神经网络)
上图为卷积神经网络的基本架构,简单来说,卷积神经网络分为卷积层、降or下采样层(池化层),再来一层卷积层,再来一层池化层,接着全连接层将之前卷积层和池化层得到的图像的底层的特征和信息进行汇总,最后进行输出。
卷积层用来提取图像的底层特征;
池化层用来防止过拟合,并且减少数据维度;
全连接层用来汇总之前卷积层和池化层得到的图像的底层的特征和信息,最后进行输出。
输出可以是softmax(相当于归一化)输出,比如:dog(0.01),cat(0.04),boat(0.94),bird(0.02);也可以是sigmod输出(二分类输出),比如:是or不是。
卷积层
那么卷积是如何计算的呢?
以下图为例:
当其他的滑动的时候也是这样计算的,比如当滑动到下一个时,output=(-1)×0+0×2+1×3+(-1)×4+0×2+1×0+(-1)×4+0×5+1×6=1,以此类推。
那么输出图片的大小是怎么计算的呢?
计算公式:
输入图片矩阵I大小: w×w
卷积核K : k×k
步长S : s(就是每次滑动的长度)
填充大小(padding): p
输出图片大小为:o×o
根据上图可知:输入图片矩阵为5×5,卷积核为3×3,步长为1,这里我们没有填充补0,因此p=0,因此计算可得o=3,因此,经过卷积层输出的图片大小为3×3。
那么如果有padding呢?
首先先讲一下为何要加padding,对于一张图片,就以上面的那个图为例,第一个数字2,经过卷积核计算只有1次,而对于中间的数字会被计算很多次,这样边缘信息可能就会被忽略掉,因此,会进行填充,在周围一圈补0。
和上面的计算一样,只是在周围补了一圈0罢了。
也就是说卷积这个操作,把大的操作变成小的输出,把大的图变成小的图。
如果用一个卷积核生成一个输出,假设再来一个卷积核还会再来一个输出,有多少个卷积核就有多少个feature map,每一个卷积核都对应一个feature map,生成的很多个小feature map对原始的大原图进行压缩和特征提取就是卷积干的事情。
https://ezyang.github.io/convolution-visualizer/index.html(参考这个网站的图,这里图像是单通道的,卷积核是只有一个)
我们平常看到的图片是RGB三通道的。https://thomelane.github.io/convolutions/2DConvRGB.html
这里呢就是红色的权重和原图红色的通道的像素进行卷积;绿色的权重和原图绿色的通道的像素进行卷积;蓝色的权重和原图蓝色的通道的像素进行卷积然后加在一起作为一个feature map。
卷积层量运算量的计算
池化层
池化层的作用:
- 减少参数量
- 防止过拟合
- 为卷积神经网络带来平移不变性
以下图来解析池化层的作用:
这里有四个大框,分别在大框里面只选一个值作为大框里面的代表值,可以选择大框里面的平均值(平均池化),也可以选择大框里的最大值(最大池化)。减少参数,防止过拟合。如下图所示:
我们平时用的最多的是最大池化,因为往往图片上的一些锐利的尖角,一些高亮的区域都是用最大池化进行捕捉的。
对于池化层的计算涉及以下参数:
kernel_size:最大的窗口大小
stride:窗口的步幅,默认值为kernel_size
padding:填充值,默认为0
dilation:控制窗口中元素步幅的参数
-o:输出大小
-w:输入大小
-k:卷积核大小
-p:填充值的大小
-s:步长大小,stride:窗口的步幅,默认值为kernel_size ,因此这里计算为2
-d: dilation:控制窗口中元素步幅的参数,默认为1
import torch
import torch.nn as nn
m0 = nn.MaxPool2d(2)
input_x = torch.randn(64,30,30)
print("输入数据input_x.shape:",input_x.shape)
output_x = m0(input_x)
print("输出数据output_x.shape:",output_x.shape)
可以利用以上代码验证一下。