【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积?
2017-09-11 23:10
681 查看
重要!!!!:由于CSDN自带编辑器排版的关系,经历了几个版本以后,导致我现在的排版极其的不美观,为了给各位更好的阅读体验,我把此博客重新写成Markdown,可以通过以下链接查看更清晰的版本:【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积?_____________________________________________________________________________________________________________________________________tensorflow版本1.2.0,python2.7环境depthwise_conv2d来源于深度可分离卷积Xception: Deep Learning with Depthwise Separable Convolutions
除去name参数用以指定该操作的name,data_format指定数据格式,与方法有关的一共五个参数
tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_format=None)
除去name参数用以指定该操作的name,data_format指定数据格式,与方法有关的一共五个参数:
第一个参数input:指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, in_channels]这样的shape,具体含义是,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]第二个参数filter:相当于CNN中的卷积核,[filter_height, filter_width, in_channels, channel_multiplier][code]这样的shape要求是一个4维Tensor,具有
[卷积核的高度,卷积核的宽度,输入通道数,输出卷积乘子
],同理这里第三维in_channels,就是参数value的第四维
第三个参数strides:卷积的滑动步长。[/code]
第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同边缘填充方式。
第五个参数rate
:这个参数的详细解释见【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?结果返回一个Tensor,shape为[batch, out_height, out_width, in_channels * channel_multiplier],注意这里输出通道变成了in_channels * channel_multiplier
为了形象的展示
depthwise_conv2d,我们必须要建立自定义的输入图像和卷积核
[code]img1 = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
img2 = tf.constant(value=[[[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]]]],dtype=tf.float32)
img = tf.concat(values=[img1,img2],axis=3)
filter1 = tf.constant(value=0, shape=[3,3,1,1],dtype=tf.float32) filter2 = tf.constant(value=1, shape=[3,3,1,1],dtype=tf.float32) filter3 = tf.constant(value=2, shape=[3,3,1,1],dtype=tf.float32) filter4 = tf.constant(value=3, shape=[3,3,1,1],dtype=tf.float32) filter_out1 = tf.concat(values=[filter1,filter2],axis=2) filter_out2 = tf.concat(values=[filter3,filter4],axis=2) filter = tf.concat(values=[filter_out1,filter_out2],axis=3)建立好了img和filter,就可以做卷积了
out_img = tf.nn.conv2d(input=img, filter=filter, strides=[1,1,1,1], padding='VALID')好了,用一张图来详细展示这个过程这是普通的卷积过程,我们再来看深度卷积。
out_img = tf.nn.depthwise_conv2d(input=img, filter=filter, strides=[1,1,1,1], rate=[1,1], padding='VALID')现在我们可以形象的解释一下depthwise_conv2d卷积了。看普通的卷积,我们对卷积核每一个out_channel的两个通道分别和输入的两个通道做卷积相加,得到feature map的一个channel,而depthwise_conv2d卷积,我们对每一个对应的in_channel,分别卷积生成两个out_channel,所以获得的feature map的通道数量可以用in_channel
* channel_multiplier
来表达,这个channel_multiplier
,就可以理解为卷积核的第四维。代码清单:import tensorflow as tfimg1 = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)输出:
img2 = tf.constant(value=[[[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]],[[1],[1],[1],[1]]]],dtype=tf.float32)
img = tf.concat(values=[img1,img2],axis=3)
filter1 = tf.constant(value=0, shape=[3,3,1,1],dtype=tf.float32) filter2 = tf.constant(value=1, shape=[3,3,1,1],dtype=tf.float32) filter3 = tf.constant(value=2, shape=[3,3,1,1],dtype=tf.float32) filter4 = tf.constant(value=3, shape=[3,3,1,1],dtype=tf.float32) filter_out1 = tf.concat(values=[filter1,filter2],axis=2) filter_out2 = tf.concat(values=[filter3,filter4],axis=2) filter = tf.concat(values=[filter_out1,filter_out2],axis=3)out_img = tf.nn.depthwise_conv2d(input=img, filter=filter, strides=[1,1,1,1], rate=[1,1], padding='VALID')with tf.Session() as sess:print 'rate=1, VALID mode result:'
print(sess.run(out_img))
rate=1, VALID mode result:
[[[[ 0. 36. 9. 27.]
[ 0. 54. 9. 27.]][[ 0. 36. 9. 27.]
[ 0. 54. 9. 27.]]]]
相关文章推荐
- 【Tensorflow】tf.nn.depthwise_conv2d如何实现深度卷积?
- 【Tensorflow】tf.nn.separable_conv2d如何实现深度可分卷积?
- 【TensorFlow】tf.nn.conv2d如何实现卷积
- 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?
- 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?
- TensorFlow学习---tf.nn.conv2d实现卷积操作
- 【TensorFlow】tf.nn.conv2d实现卷积
- tf.nn.conv2d实现卷积的过程
- Tensorflow(r1.4)API--tf.nn.conv2d详解
- 如何用 Spark 深度集成 Tensorflow 实现文本分类
- tf.nn.conv2d用法简介
- 对比 tf.layers.conv2d_transpose和tf.nn.conv2d_transpose区别
- TensorFlow学习笔记(四):tf.nn.max_pool如何实现池化操作?
- 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
- 【TensorFlow】tf.nn.local_response_normalization详解,lrn正则法如何计算?
- tf.nn.conv2d 实例
- 如何用TensorFlow和TF-Slim实现图像分类与分割
- TensorFlow学习之实现深度卷积分类器
- 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现
- 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?