问题:计算量很大
以上例中5x5过滤器为例,就需要计算120M次乘法
例 Input: 28x28x192 filter: 5x5 same 32 output:28x28x32
计算次数=5x5x32x28x28x32约等于120M
解决方法:加一个1x1过滤器,也称为bottleneck层(瓶颈层,是网络中是小的层)
28x28x192--conv 1x1x192 16-->28x28x16--conv 5x5x16 32-->28x28x32
计算次数=28x28x192x16 + 5x5x16x28x28x32 约等于12.4M下例中计算量就会降成12.4M
一个更完整些的Inception模块
大型的Inception网络结构:
其实就是把上面的模块重复连接。另外,网络后面几层会有一些分支。它们也和最后的输出一样进行输出,也就是说隐藏层也参与了最后输出的计算,这样可以避免过拟合的问题
小故事:Inception原名是googlenet,是为了向LeNet致敬,而后引用了Inception(盗梦空间),意在建议更深的网络
五、迁移学习
在CV中经常会用到迁移学习:利用已经训练好的网络来学习其它问题。一般推荐使用开源的网络来做,而非从0开始。根据拥有的数据量不同,有不同的处理方式
当数据量很小的时候,可以把最后一层softmax替换掉,而把前面所有的层不变(一般有参数如trainable, freeze可以用于设置参数不变),只训练最后一层
当数据量大一些的时候,可以多训练几层,也就是把前几层freeze,而后面几层进行训练
当数据量很大时,可以对整个网络进行训练,原来训练好的结果作为初始值, 这样就不用用随机初始化
六、数据扩充(augmentation)
对于CV应用,一般来说数据越多,网络性能越好。对于其它应用可能不一定,但是对计算机视觉,数据量是一个重要的因素。数据扩充就是对原有数据进行处理以获得更多的数据
常用的方法
mirror(镜像)/random crop(随机裁剪)/rotation(旋转)/shearing(切变)/local warping(局部扭曲变形)
改变颜色(PCA(主成分分析))
data augmentation(增强)的实现
采用多线程,一个线程读取数据并修改,改后的数据传递给其它线程训练,实现数据处理与网络训练并行
超参数:颜色要改变多少,裁剪什么位置等
七、如何使用开源代码
使用网络框架
尽可能使用开源的实现
使用预训练好的模型,并在自己的数据集上fine-tune