k) z6 D6 S; m! {/ _" q9 L3 S: _
大概建模一年多了吧,准备趁着这个暑假,把建模的东西整理一下,留个笔记和纪念,万一哪天不会了还能翻翻笔记。众所周知,建模这东西入门不难,网上各种教程一大把一大把,人家写的也很专业,我写的东西基本登不了大雅之堂,跟人家没法比就写点下里巴人的东西吧。2 h* l% m# t) R( a; t. }! T
0 L7 k: O8 E. m& j$ @8 C
1.1.概念引入; u& T9 \+ d! F! \( T4 D# R
) I+ H! q& h5 v
1.11.1 图像处理中的卷积运算。看个图生动形象的理解一下下: , I0 r7 y9 e/ b7 B' ~% `) Q3 n4 f
: u2 X# B7 z C! f- s. @. Z( |( p
* V s1 v4 W$ w1 h O5 l
在设置好矩阵之后,又该如何运算呢,来,看下面的动图。矩阵对应相乘相加得到卷积的结果。比如,对于左上角的元素4而言,它的运算方式就是:1×1+0×1+1×1+0×0+1×1+0×1+1×0+0×0+1×1=41×1+0×1+1×1+0×0+1×1+0×1+1×0+0×0+1×1=4 4 n% @6 w) R7 [1 H7 n9 k
% a. I5 q6 s9 h+ g0 ?9 n' y) v# c
1.21.2 填充padding。上面的操作看着貌似很好,但是有没有缺陷呢?当然有,第一个问题,5×55×5的矩阵和3×33×3的矩阵的卷积结果会得到3×33×3的输出矩阵,也就是原始图像在提取特征的过程中被缩小了,一直卷积的话图像会被一直缩小到一个像素,显然不是想要的结果;第二个问题,原始图像左上角的像素只参与一次运算,而他右边的像素参与了两次运算,是不是不公平?是的。那么如何解决这两个问题呢?4 r K. N, O* l- c9 b7 h
$ D4 S, z# `) a6 O9 N 不失一般性,设原始图像为n×nn×n的矩阵,卷积核为f×ff×f的矩阵,那么输出结果就是(n−f+1)×(n−f+1)(n−f+1)×(n−f+1)的矩阵。言归正传,怎么解决上面的问题呢?答案是填充。在imange矩阵的周围在添加一层像素,使其变成(n+1)×(n+1)(n+1)×(n+1)的矩阵,而填充内容是随意的,如果添加pp层像素,原始图像就会变为(n+2p)×(n+2p)(n+2p)×(n+2p)的矩阵,为了使输出矩阵和原始矩阵的维度相同,就要满足下面的等式:4 E* C C8 s; l/ b; e: l- Y
6 g$ f, ~: f5 I( N+ l; n C
n+2p−f+1=n⇒p=(f−1)/2 9 l% c- M' F! I3 l! dn+2p−f+1=n⇒p=(f−1)/2 & q9 S! z! m* G8 L3 i- N" L& P( i' i 1.31.3 卷积步长stride。上面的例子中,卷积的移动步长是1,当移动步长s=2s=2的时候呢,7×77×7和3×33×3的矩阵卷积输出的结果是3×33×3的矩阵(自己脑补,就不画图了),于是又得到一个规律,卷积输出结果的维度是(n+2p−fs+1)×(n+2p−fs+1)(n+2p−fs+1)×(n+2p−fs+1)。 ; p% z7 b! `5 f$ \6 U, s- F( q) L& U1 B- Z( ]$ O
1.41.4 卷积步长stride。上面的例子中,卷积的移动步长是1,当移动步长s=2s=2的时候呢,7×77×7和3×33×3的矩阵卷积输出的结果是3×33×3的矩阵(自己脑补,就不画图了),于是又得到一个规律,卷积输出结果的维度是(n+2p−fs+1)×(n+2p−fs+1)(n+2p−fs+1)×(n+2p−fs+1)。4 _2 {; s* N# V; ^1 r