卷积神经网络
卷积运算
运算过程:矩阵*filter=新的矩阵
输出矩阵的大小 = (n+2p-f)/s + 1
实现
#python实现函数
Python:conv_forward()
#TensorFlow实现
tensorflow:tf.nn.conv2d()
tf.nn.conv2d(
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
input:[batch, in_height ,in_width, in_channels]
#batch: 样本的数量
#in_height :每个样本的行数
#in_width: 每个样本的列数
#in_channels:每个样本的通道数,如果是RGB图像就是3
filter:[filter_height, filter_width, in_channels, out_channels]
#filter_height:卷积核的高
#filter_width:卷积核的宽
#in_channels:输入的通道数
#out_channels:输出的通道数
strides:[1,stride_h,stride_w,1]步长,即卷积核每次移动的步长
padding:填充模式取值,只能为”SAME”或”VALID”
data_format:输入、输出数据的格式,
若"NHWC", the data is stored in the order of: [batch, height, width, channels];
若"NCHW", the data storage order of: [batch, channels, height, width]
dilations:???
边缘检测
垂直边缘检测
1. filter滤波器
2. sobel filter:鲁棒性更高
3. scharr filter
水平边缘检测
滤波器:水平滤波器
Note:将滤波器中的数当做参数的思想,已经应用于计算机视觉,改变这些数,对具体应用的效果有影响
Padding
引入的padding的原因:
1. 经过filter之后,图像会变小,会丢失边缘的信息
2. 图像左上角的元素只被一个输出所用,边缘部分的信息对输出的影响就变小了
padding的操作:
在原图像的四周边缘填充0
padding分类:
1.指定pad的值
2. Valid:no padding,输出图像会减小
3. Same:pad,输出和输入图像大小一样,padding通常是奇数(这样四周填充的数目相同,且留有中心像素点)
步长stride
filter每次移动的长度
立体卷积
通道数(channels):如图像RGB是三个通道
图中,原图像是6*6*3的一个图像,滤波器是3*3*3,得到的是个4*4的图像。
1. 原图通道数和滤波器通道数一定是相同的
2. 当有多个滤波器时,可以同时检测多个特征(比如同时得到垂直检测特征和水平检测特征),得到的图像的层数等于滤波器的个数
3. 滤波器可以由很多个,10、128等等,表示同时检测多个图像特征
池化层
max pooling(取选中的区域中的最大值作为输出,如上图)
average pooling(取选中的区域中的平均值作为输出)
池化层中的超级参数有:
- f:filter size滤波器的大小
- s: stride步长(常用的f=2,s=2,高和宽各减半 ; f=3,s=2)
- max or average pooling选择最大还是平均池化
Note:池化层中是计算神经网络某一层的静态属性,其中的超级参数不需要学习过程,是通过手工或者交叉验证设置的。
卷积神经网络基本结构
解释:
输入图像(矩阵)–> 卷积层+最大池化层 –> 卷积层+最大池化层 –> 全连接层–>全连接层 –> 全连接层 –>softmax –> 输出
每一层参数情况:
上图是整个卷积神经网络每一层矩阵的大小、矩阵中元素个数(激活值)、参数的个数(池化层是不需要学习过程的,所以参数个数是0)
可以看出:
1. 矩阵和矩阵中的元素个数变小,但是参数个数增多
2. 卷积层中的参数较少,大部分的参数集中在全连接层
3. 激活值(Activation Size)逐渐下降,若下降的太快会对结果有影响
why卷积?
参数共享,稀疏连接可以减少参数