深入Mixed层
对同一个卷积层输出,执行各种二次计算,将各种结果堆叠到新输出的depth方向上
Mixed层示例图 # mixed: 35 x 35 x 256.
end_point = 'Mixed_5b'
with tf.variable_scope(end_point):
with tf.variable_scope('Branch_0'):
branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1')
with tf.variable_scope('Branch_1'):
branch_1 = slim.conv2d(net, depth(48), [1, 1], scope='Conv2d_0a_1x1')
branch_1 = slim.conv2d(branch_1, depth(64), [5, 5],
scope='Conv2d_0b_5x5')
with tf.variable_scope('Branch_2'):
branch_2 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1')
branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
scope='Conv2d_0b_3x3')
branch_2 = slim.conv2d(branch_2, depth(96), [3, 3],
scope='Conv2d_0c_3x3')
with tf.variable_scope('Branch_3'):
branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3')
branch_3 = slim.conv2d(branch_3, depth(32), [1, 1],
scope='Conv2d_0b_1x1')
net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3])
end_points[end_point] = net
if end_point == final_endpoint: return net, end_points
avgPooling 和 tf.concat
一般做Pooling的时候,使用的是maxPooling,在Mixed层出现了avgPooling。
除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。
可能avgpooling就是mean pooling吧。
tf.concat函数也是一个重点知识:这里使用concat将张量进行连接。但是具体的连接形状还需要进一步考证。
concatInception V4架构图
v3的架构图,对于mixed的细节并不是很清晰,所以这里找了一张v4的架构图来看一下。
Inception v4看一下右下角,除了参数之外和我们的Mixed模型很像了。(V4比V3更加的深)
filterMixed 层(inception结构)分析
inception结构具有3种不同的形式,(Mixed_5x,Mixed_6x,Mixed_7x),下面就是这3种形式的示例图。
仔细观察,这里有两个特点:
这里使用了很多 1 x 1的卷积核。
一种简单的解释是用来降维。
For example, an image of 200200 with 50 features on convolution with 20 filters of 11 would result in size of 20020020.
但是,1x1卷积核的作用不仅仅于此。
- 特征变换
1x1卷积是在Network in Network 中第一次被提出来,作者的目的是为了得到一个深的网络,但作者并不想直接垂直的堆砌一些layer。作者用了一些1x1,3x3的卷积层,因此
最后的网络架构其实是going wide. 在googlenet中,1x1卷积核有两个作用:
1 为了使得网络更深,作者引入了类似Network in Network 中的"inception module"
2 为了降低维度
3 为了增加更多的非线性变换(eg. RELU) - 其他作用
1 1x1卷积核可以结合max pooling
2 1x1卷积核可以设置大的步长,这样可以在丢失非常少的信息下降低数据的维度
3 取代fc层。
1X1卷积核到底有什么作用呢?
版权所属: http://www.caffecn.cn/?/question/136
- 实现跨通道的交互和信息整合
1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。 - 进行卷积核通道数的降维和升维,减少网络参数
进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。
最近大热的MSRA的ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构。(不然真不敢想象152层的网络要怎么跑起来TAT)
图2或者将 n x n 的卷积核改写为 n x 1 和 1 x n 。
inception结构v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块;
作者:无话可说
链接:https://www.zhihu.com/question/50370954/answer/138938524
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论