首先介绍一下函数的参数列表:
tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_format=None)
除去name参数用以指定该操作的name,data_format指定数据格式,其他共有5个参数
input: 指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]
filter: 相当于CNN中的卷积核,要求是一个4维Tensor,具有[filter_height, filter_width, in_channels, channel_multiplier]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,输入通道数,输出卷积乘子],同理这里第三维in_channels,就是参数value的第四维
strides: 卷积的滑动步长。
padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同边缘填充方式。
rate:空洞卷积,mobile里面用[1,1]
结果返回一个Tensor,shape为[batch, out_height, out_width, in_channels * channel_multiplier],注意这里输出通道变成了in_channels * channel_multiplier
实验代码
import tensorflow as tf
img1 = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
print(img1)
img2 = tf.constant(value=[[[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]]]],dtype=tf.float32)
print(img2)
img = tf.concat(values=[img1,img2],axis=3)
print(img)
filter1 = tf.constant(value=0, shape=[3,3,1,1],dtype=tf.float32)
print(filter1)
filter2 = tf.constant(value=1, shape=[3,3,1,1],dtype=tf.float32)
print(filter2)
filter3 = tf.constant(value=2, shape=[3,3,1,1],dtype=tf.float32)
print(filter3)
filter4 = tf.constant(value=3, shape=[3,3,1,1],dtype=tf.float32)
print(filter4)
filter_out1 = tf.concat(values=[filter1,filter2],axis=2)
print(filter_out1)
filter_out2 = tf.concat(values=[filter3,filter4],axis=2)
print(filter_out2)
filter = tf.concat(values=[filter_out1,filter_out2],axis=3)
print(filter)
out_img = tf.nn.conv2d(input=img, filter=filter, strides=[1,1,1,1], padding='VALID')
print(out_img)
out_img = tf.nn.depthwise_conv2d(input=img, filter=filter, strides=[1,1,1,1], rate=[1,1], padding='VALID')
print(out_img)
sess = tf.Session()
print(sess.run(out_img))
输出结果:
Tensor("Const:0", shape=(1, 4, 4, 1), dtype=float32)
Tensor("Const_1:0", shape=(1, 4, 4, 1), dtype=float32)
Tensor("concat:0", shape=(1, 4, 4, 2), dtype=float32)
Tensor("Const_2:0", shape=(3, 3, 1, 1), dtype=float32)
Tensor("Const_3:0", shape=(3, 3, 1, 1), dtype=float32)
Tensor("Const_4:0", shape=(3, 3, 1, 1), dtype=float32)
Tensor("Const_5:0", shape=(3, 3, 1, 1), dtype=float32)
Tensor("concat_1:0", shape=(3, 3, 2, 1), dtype=float32)
Tensor("concat_2:0", shape=(3, 3, 2, 1), dtype=float32)
Tensor("concat_3:0", shape=(3, 3, 2, 2), dtype=float32)
Tensor("Conv2D:0", shape=(1, 2, 2, 2), dtype=float32)
Tensor("depthwise:0", shape=(1, 2, 2, 4), dtype=float32)
[[[[ 0. 36. 9. 27.]
[ 0. 54. 9. 27.]]
[[ 0. 36. 9. 27.]
[ 0. 54. 9. 27.]]]]
这里把原博主的图借用一下,方便自己以后忘记再理解
上面是普通的卷积。
下面来看深度卷积: