mobilenetv2和卷积网络的理解
卷积网络:
conv = tf.nn.conv2d(input, w, strides=[1, d_h, d_w, 1], padding='SAME')
例如:input.shape为(36,64,64,32)代表36个(64,64)的数据,32个输入通道
当卷积核尺寸为(3,3,32,64)代表64个33的卷积核同32个输入通道的数据做卷积,然后输出为64个通道
即每个随机卷积同32个数据卷积之后,返回为一个通道,计算量为32(单一卷积计算量=33h*w)*64
strides=[1,2,2,1]时,结果为(36,32,32,64)
mobilenetv2网络:
bottleneck_dim=round(expansion_ratio*input.get_shape().as_list()[-1])##round 返回浮点数x的四舍五入的值 net = conv_1x1(input, bottleneck_dim, name='pw', bias=bias) net = relu(net) net = dwise_conv(net, strides=[1, stride, stride, 1], name='dw', bias=bias) net = relu(net) net = conv_1x1(net, output_dim, name='pw_linear', bias=bias)
例如:input.shape为(36,64,64,32)
conv_1x1:表明卷积核尺寸为(1,1,32,out_put), strides=[1,1,1,1] 结果为(36,64,64,out_put)##这里out_put的作用是,扩大输出通道,减少因为刚开始数据低输出通道带来的影响,即V1和V2的区别
dwise_conv:卷积核尺寸为(k,k,out_put,1),strides=[1,2,2,1] 结果为(36,32,32,1)
conv_1x1:卷积核尺寸为(1,1,1,output_dim),strides=[1,1,1,1] 结果为(36,32,32,output_dim)
计算量为:out_put x(64x64x1x1)x32+1*(h x w x k x k)out_put+output_dim x(h x w x 1 x 1)x1主要是两点:
Depth-wise convolution之前多了一个11的“扩张”层,目的是为了提升通道数,获得更多特征;
最后不采用Relu,而是Linear,目的是防止Relu破坏特征。
depthwise的结构https://img-blog.****.net/20180123092407142?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk5NTcxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast