LetNet-5/AlexNet 比较久远,其中一些方法现在可能不用了,略过。
VGG-16 值得关注,因为它将网络结构变得简单——层数更多,但是组合单一。
统一的参数:
CONV = 3 × 3 3 \times 3 3×3 filter, s = 1, padding = “same”MAX-POOL = 2 × 2 2 \times 2 2×2, s = 2 (输入减小一半)一共有16层网络有参数需要学习,合计138M参数,整个过程满足输入的 n H ↓ n_H \downarrow nH↓, n W ↓ n_W \downarrow nW↓, n c ↑ n_c \uparrow nc↑的规律。
猜测:可能是低级特征比较少,边缘检测只需要少量filter就可以,而高级组合特征更复杂,需要更多。
增加了一个"short cut/skip connection"(可能看图未必有公式清晰):
z [ l + 1 ] = W [ l + 1 ] a [ l ] + b [ l + 1 ] a [ l + 1 ] = g ( z [ l + 1 ] ) z [ l + 2 ] = W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] a [ l + 2 ] = g ( z [ l + 2 ] ) ⇒ g ( z [ l + 2 ] + a [ l ] ) \begin{matrix} z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]} \\ a^{[l+1]} = g(z{[l+1]}) \\ z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]} \\ a^{[l+2]} = g(z^{[l+2]}) \Rightarrow g(z^{[l+2]} + a^{[l]}) \\ \\ \end{matrix} z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2])⇒g(z[l+2]+a[l])
可以让网络更好的学习到Identity,能够有效解决梯度vanish/explode的问题,从而训练更深的网络。
比如,如果 W [ l + 2 ] W^{[l+2]} W[l+2]出现了梯度消失,那么 a [ l + 2 ] a^{[l+2]} a[l+2]至少也能学会 a [ l + 2 ] = a [ l ] a^{[l+2]} = a^{[l]} a[l+2]=a[l]
网络分为两部分:
Identity Block: 有skip connection的基本模块
Convolutional Block: 输入和输出不匹配时使用
1 × 1 1\times1 1×1 Convolutions:用于 n c n_c nc的压缩,大大减少计算量
网络中的一个基本单元如下2
所有的不同大小的filter都是做的same padding, n H n_H nH与 n W n_W nW保持不变在做 3 × 3 3\times3 3×3和 5 × 5 5\times5 5×5的卷积之前先利用 1 × 1 1\times1 1×1卷积对channel进行压缩,减少后续的计算量pooling做的是特殊的same pooling,再接 1 × 1 1\times1 1×1卷积对 n c n_c nc进行压缩将4种结果连接在一起,形成下一级的输入直接将模块叠加起来,避免用户去手工设计网络,常用节点都已经包含在这一个大模块中了。Use architecture of networks published in the literature
Use open source implementations if possible (复现并不一定容易)
Use pretrained models and fine-tune on your dataset (Transfer Learning)
锁住网络的参数,重新训练输出层(比如softmax层),来完成自己的工作。注
本节图片均来自Coursera课程 week 2 ↩︎
inception block图片来自 A Simple Guide to the Versions of the Inception Network ↩︎