论文中提到的几个基本原则
规则1:要防止出现特征描述的瓶颈(representational bottleneck)。所谓特征描述的瓶颈就是中间某层对特征在空间维度进行较大比例的压缩(比如使用pooling时或者是降维),导致很多特征丢失。虽然Pooling是CNN结构中必须的功能,但我们可以通过一些优化方法来减少Pooling造成的损失,不知道在哪儿看的,尤其是在前面的层,尽量不要降维,整体的要缓慢地降。
规则2:特征的数目越多收敛的越快。相互独立的特征越多,输入的信息就被分解的越彻底,分解的子特征间相关性低,子特征内部相关性高,把相关性强的聚集在了一起会更容易收敛。这点就是Hebbin原理:fire together, wire together。规则2和规则1可以组合在一起理解,特征越多能加快收敛速度,但是无法弥补Pooling造成的特征损失,Pooling造成的representational bottleneck要靠其他方法来解决。
规则3:可以压缩特征维度数,来减少计算量。inception-v1中提出的用1x1卷积先降维再作特征提取就是利用这点。不同维度的信息有相关性,降维可以理解成一种无损或低损压缩,即使维度降低了,仍然可以利用相关性恢复出原有的信息。
规则4:整个网络结构的深度和宽度(特征维度数)要做到平衡。只有等比例的增大深度和维度才能最大限度的提升网络的性能。
inception v3的特点
1 有几个不同的inception模块
inception模块的特点是有不同size的卷积核在同一个fature map上做卷积,还有的加上平行的pooling,最后组合到一起,作为下一层的输入,这样可以在不同尺寸上获取特征,使特征更加丰富
还有下面这种将大的卷积分解成小的卷积,甚至是3x3的也可以分解为 1x3 3x1两个卷积,大大减少了参数量
2 辅助分类器
可以将梯度更直接得传回到前几层,在实现上只用了一个辅助分类器,计算loss时有一个疑问是,是先把aux的值和pred的值想加再送进loss,还是分别计算aux和pred的loss,再把loss加起来。目前的理解是 aux和 pred如果已经做过softmax那就是后者,如果没有做softmax那就前者。这个时候acc的计算又有了问题,目前是把pred当做和label对比的,不考虑aux,在做猫狗分类的时候又尝试直接去掉辅助分类器,效果也很好,但是并不是说辅助分类器没有用,如果网络很深遇到梯度消失的问题的时候,可以考虑用辅助分类器。
3 Batch_Normalization
batch normal使得在训练的过程中能够使每一层的输入保持相同的分布,通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,大概整个深度学习的基本要素就是分布大致相同就比较好,包括训练集和测试集的数据分布也要大致相同效果才好。下面是官方的一句话:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题
训练过程
本次还是用的猫狗数据集,可能是数据集比较简单,batch-size设置的64,大概20个bacth之后acc就能达到0.95以上,具体运行数据如下