我们这一篇文章就正式的看一下在卷积神经网络中,一个卷积层是怎么进行运算的。

经典神经网络里的全连接层


在我们之前介绍经典神经网络里,层和层之间都是全连接的。也就是前边一层的每个神经元都会连接到下边一层的每一个神经元。
每一个连接都会有一个weight值w。
前一层所有神经元的输出和对应weight的乘积然后求和,最终还需要加上一个bias值b构成Z函数:
z^{[l]} = w^L*a^{[l-1]}+b{[l]}
然后我们还需要把Z函数的输出经过激励函数来非线性化,成为这一层的输入,比如用ReLU:
a^{[l]} = ReLU(z^{[l]})

这样,上一层的输入a^{[l-1]},经过z函数和a函数的计算,就得到当前层的输出a^{[l]}

卷积层


我们从输入,weight,bias,z函数,a函数,输出分别看一下卷积层和全连接层有什么不同。

输入

卷积层的输入是分不同channel的。每一个channel代表输入的不同feature。在输入层一般有3个channel,分别对应RGB,在中间层,每个channel分别代表当前检测的一种特性,比如横向边缘,竖向边缘,红色边缘。随着层从前向后,feature也由基本feature(比如线)向复杂feature(比如眼睛)发展。

weight值

对于卷积层,weight值是放在Filter里,每个Filter检测输入的一种特性。当Filter检测输入层的不同部分时,这些weight值是共享的,不变的。这个和全连接层有很大不同,全连接层的每个weight值是连接两个神经元之间专用的,不会被共享。

bias值

对于全连接层,bias值是当前层每个神经元对应一个。在卷积层是每个Filter对应一个。

z函数

对于全连接层,z函数是对每一个当前层的神经元来计算,计算方法是前一层的输入与对应weight值相乘,加上当前盛锦苑的bias值。
对于卷积层,z函数实际上被卷积计算所代替,如果输入为多channel,那么Filter也为多channel,但是计算结果只有一个channel。卷积计算的规则为同一channel上对应的输入与Filter的值相乘。之后求和,然后在加上这个Filter对应的bias值。

a函数

对于激活函数,全连接层和卷积层很类似,都是对z函数应用后形成当前层的输出。

输出

和输入类似,卷积层的输出也是分channel的。每个Filter会生成一个channel。当一层应用多个Filter的话就会生成多个输出的channel。

各种维度确定

除了上边的比较外,卷积层还有一些特有的计算,Padding 和 Stride。因为引入了卷积计算,Padding和Stride。导致输出的维度受多因素的影响。我们逐一看一下各种维度的确定:

第l层的一些符号约定:

Filter的矩阵行列数:f^{[l]}
Padding数:p^{[l]}
Stride步长:s^{[l]}
Filter的个数(下标C,代表channel):n_{C}^{[l]}
输出矩阵的高:n_{H}^{[l]}
输出矩阵的宽:n_{W}^{[l]}
根据之前的知识当前层输入的channel数等于上一层的Filter数。

Input维度

n_{H}^{[l-1]}*n_{W}^{[l-1]}*n_{C}^{[l-1]}

Output维度

n_{H}^{[l]}*n_{W}^{[l]}*n_{C}^{[l]}
其中:
n_{H}^{[l]}=\frac{n_{H}^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1
n_{W}^{[l]}=\frac{n_{W}^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1

Filter维度

f^{[l]}*f^{[l]}*n_{C}^{[l-1]}

Weight值的维度

weight值的维度就是filter的维度再乘以filter的个数:
f^{[l]}*f^{[l]}*n_{C}^{[l-1]}*n_{C}^{[l]}

Bias维度

bias是对每个Filter一个,所以它的个数就是当前层的Filter的个数:
n_{C}^{[l]}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: