1、Edge detection(边缘检测):
(1)卷积计算:
有一个6*6*1的灰度图像,‘*’表示卷积(convolution),过滤器(filter)为3*3矩阵.
卷积的结果为 4*4的矩阵:
左上角的第一块是通过图像矩阵的左上角3*3区域计算而来.
3*1 + 1*1 + 2*1 +0*0 + 5*0 + 7*0 + 1*-1 +8*-1 +2*-1 = -5
来自:
移动3*3矩阵,计算第1行第2列:
来自:
最终得到结果(一张4*4图片):
卷积计算所用函数:
python:conv_forward
tensorflow:tf.nn.conv2d
输入的图像矩阵:n*n
过滤器矩阵:f*f(f 一般是奇数)
输出的图像矩阵:(n-f+1)*(n-f+1)
(2)垂直边缘检测:
检测结果的白色宽带为垂直边界,但由于图像规模较小,检测结果看上去不够精确,若换为1000*1000的图片,则会更准确.
(3)其它过滤器:
水平过滤器:
Sobel过滤器:
Scharr过滤器:
2、Padding:
(1)举例说明:
在矩阵被压缩过程中,中间区域的元素会被多次使用到,而边缘的元素则使用次数很少, 图像的边缘信息会丢失. 解决方法之一是填充一层像素:将6*6图像填充为8*8
在压缩后得到的图像依然是6*6.
输出的图像矩阵:(n-f+2p+1)*(n-f+2p+1)(其中p是添加的层数)
(2)Valid and Same convolution:
Valid卷积是指不使用Padding;
Same卷积是指使用Padding,使得输出的大小和输入的大小一致,p = (f-1)/2.
3、卷积步长:
输出矩阵大小: (其中 s 是步长)
如果相除的结果不是整数,则向下取整.
4、对RGB图像进行卷积:
RGB图像有三层,假设图像的大小为 6*6*3,过滤器大小为 3*3*3,输出矩阵代销为 4*4*1.
通常情况下,当图片数据含有“高”时,过滤器也要含有相同的“高”(即channels),过滤器可以只关注单层(其余层全为0),也可以把所有层都设置成相同的参数.
如果想同时识别出垂直和水平边界,可以使用两个过滤器,获得两个4*4*1的输出图像,再合并为4*4*2的输出立方体.
总结:
输入图形:n*n*nc (nc 为channel数)
过滤器:f*f*nc
输出图形: (n-f+1)*(n-f+1)*nc' (其中nc'为过滤器个数)
5、单层卷积神经网络:
(1)举例:
(2)参数定义:
如果第 l 层是卷积层:
f[l] = filter size
p[l] = padding
s[l] = stride
nc[l] = number of filters
input shape: nH[l-1] * nW[l-1] * nC[l-1]
output shape: nH[l] * nW[l] * nC[l]
filter shape: f[l] * f[l] * nC[l-1]
weights shape: f[l] * f[l] * nC[l-1] * nC[l]
activations shape (a[l]): nH[l] * nW[l] * nC[l]
nH[l] = (nH[l-1] + 2p[l] - f[l]) / s[l] + 1 取下整数
nW[l] = (nW[l-1] + 2p[l] - f[l]) / s[l] + 1 取下整数
6、简单卷积神经网络示例:
第0层:nH[l0] = nW[0] = 0,nC[0] = 3. 即输入为一个 39*39*3 的图像.
第1层:采用10个过滤器,f[1] = 3,s[1] = 1,p[1] = 0,则下一个激活值规格为37*37*10.
第2层:采用20个过滤器,f[2] = 5,s[2] = 2,p[2] = 0,则下一个激活值规格为17*17*20.
第3层:采用40个过滤器,f[3] = 5,s[3] = 2,p[3] = 0,则下一个激活值规格为7*7*40.
将最后7*7*40个元素展开成长度1960的向量,采用logistic或者softmax得出结果y^.
7、Pooling Layer(池化层):
(1)Max pooling(最大池化):
最大池化:f = 2,s = 2
最大池化的作用:如果过滤器中提取到某个特征,则保留其最大值.
(2)Average pooling(平均池化):
(条件同上)
8、多层卷积神经网络示例: