1.引入
思考这样一个问题:我们要对100010003的图片进行分类,怎么用机器学习完成这样的工作呢?如果用全连接网络(FCN)来实现,这意味着第一层网络会有 3 × 1 0 6 3\times 10^6 3×106这么多个节点,网络的参数量将会是不可接受的。基于此,我们开始研究新的网络
2.卷积
对于前面提到的图像分类问题,我们一般会检测出其边缘,据此来确定图形长什么样子。边缘检测分为垂直边缘检测和水平边缘检测,怎么做边缘检测呢?
通过给图片卷积边缘检测矩阵来检测边缘
[
3
0
1
2
7
4
1
5
8
9
3
1
2
7
2
5
1
3
0
1
3
1
7
8
4
2
1
6
2
8
2
4
5
2
3
9
]
∗
[
1
0
−
1
1
0
−
1
1
0
−
1
]
=
[
−
5
−
4
0
8
−
10
−
2
2
3
0
−
2
−
4
−
7
−
3
−
2
−
3
−
16
]
\left[ \begin{matrix} 3& 0& 1& 2& 7& 4 \\ 1& 5& 8& 9& 3& 1 \\ 2& 7& 2& 5& 1& 3\\ 0& 1& 3& 1& 7& 8\\ 4& 2& 1& 6& 2& 8\\ 2& 4& 5& 2& 3& 9 \end{matrix} \right] * \left[ \begin{matrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{matrix} \right] = \left[ \begin{matrix} -5& -4& 0& 8 \\ -10& -2& 2& 3 \\ 0& -2& -4& -7\\ -3& -2& -3& -16 \end{matrix} \right]
⎣⎢⎢⎢⎢⎢⎢⎡312042057124182315295162731723413889⎦⎥⎥⎥⎥⎥⎥⎤∗⎣⎡111000−1−1−1⎦⎤=⎣⎢⎢⎡−5−100−3−4−2−2−202−4−383−7−16⎦⎥⎥⎤
神经网络中的卷积和数学领域常用的卷积不是一个概念,我们不用翻转矩阵,直接做矩阵的内积就可以了
怎么证明我们的边缘检测是可以work的呢?
用一个具有明显的边缘的图片,卷积我们的边缘检测器,可以得到边缘的位置,边缘图片的矩阵是前500列为1,后500列为0的1000*1000的矩阵,垂直边缘检测矩阵为
[
1
0
−
1
1
0
−
1
1
0
−
1
]
\left[ \begin{matrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{matrix} \right]
⎣⎡111000−1−1−1⎦⎤如下图所示,卷积前和卷积后的结果如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/9e0e02306d49aca965179211b1fd52c3.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/386636b3e1c3f90df9bcc56aa56aa87c.jpeg)
可以看到明显的垂直边缘检测的结果
3.Padding
通过前面的例子,我们发现卷积之后图片的大小会改变,比如上一个section的卷积
(
6
×
6
)
∗
(
3
×
3
)
=
(
4
×
4
)
(6\times 6)*(3\times 3)=(4\times 4)
(6×6)∗(3×3)=(4×4)
实际上我们有结论是
(
n
×
n
)
∗
(
f
×
f
)
=
(
(
n
−
f
+
1
)
×
(
n
−
f
+
1
)
)
(n\times n)*(f\times f)=((n-f+1)\times (n-f+1))
(n×n)∗(f×f)=((n−f+1)×(n−f+1))
这样做会有两个问题:
- 卷积得越多,后面的图片就越小
- 边缘的数据用得少而中间的数据用得多
为了解决这样的问题,我们采用了一种通过填充扩大原来的图像使得最后的图像不变的方法,即将之前的
6
×
6
6\times 6
6×6的矩阵在外侧补零,如下图所示
通过这样的操作同时解决了上面提到的两个问题
在卷积的过程中,有两种填充,valid and same convolutions
- valid: no padding,即不做填充
- same:pad so that output size is the same as the input size.通过填充使得卷积后和卷积前的大小一致
可以计算得到填充的大小为
n
+
2
p
−
f
+
1
=
n
→
p
=
f
−
1
2
n+2p-f+1=n\rightarrow p=\frac{f-1}{2}
n+2p−f+1=n→p=2f−1
一般我们选择卷积核大小是奇数使得原矩阵可以做对称填充,同时使原矩阵填充后在中心
4.Strided convolutions
stride代表卷积核每次移动的步幅,如下图所示
待续。。
一些工具
1.矩阵灰度图化代码
a=[3 0 1 2 7 4;1 5 8 9 3 1;2 7 2 5 1 3;0 1 3 1 7 8;4 2 1 6 2 8;2 4 5 2 3 9];
I=mat2gray(a);%将数值矩阵X转换为灰度图像
figure,imshow(I); %显示转换后的灰度图像