为了做模型压缩,常见方法将正常卷积换成seperable 卷积(正常卷积和可分离卷积具体见下图)
(1)正常卷积 (2)depthwise 卷积 (3)pointwise 卷积
正常卷积卷积的大小: kernel_size_w * kernel_size_h * input_channel * output_channel
seperable 卷积大小:kernel_size_w * kernel_size_h * input_channel + input_channel * output_channel
moblieNet v2中解释:经过激活层的tensor HxWxD 兴趣流形,可能只分布在激活层的一个低维子空间,利用这一点使用1x1卷积将tensor降维,但由于relu的存在,将为损失较多信息。
上图中,利用MxN的矩阵B将张量(2D,即N=2)变换到M维的空间中,通过ReLUctant后(y=ReLU(Bx)),再用此矩阵之逆恢复原来的张量。(1x1xNxM 的卷积作用后再用relu, 如果输出的dim 比较少的时候,信息丢失严重)。在较低维度的张量表示(兴趣流形)上进行ReLU等线性变换会有很大的信息损耗。 因此在moblieNet v2 中在做depthwise 卷积的时候通过1x1的卷积将channels 数据增多,来方式relu 对信息的损耗。(严重的情况,relu 将损失所有的信息,无论输入是什么输出都为一样的结果)。
因此在训练depthwise 结构的模型时容易出现不收敛的情况,可以通过向moblienet v2中一样将要做relu 层的channels 增多。 或者加上skip-connection 将输入特征和经过relu 的数据结合在一起,会减轻relu 造成的不收敛情况。