Tensorflow中2D卷积API使用

TF中用于2D卷积操作的api是tf.nn.conv_2d,源码位置位于tensorflow/python/ops/gen_nn_ops.py

接口定义为:

  conv2d(input, filter, strides,padding, use_cudnn_on_gpu=True, data_format=‘NHWC’,name='None')

其中

  input的shape是[batch, in_height, in_width, in_channels]  

  filter的shape是[filter_height, filter_width, in_channels, out_channels]

  strides在的通常要写成[1, stride, stride, 1],也就是说第0个参数和第三个参数都是固定1,中间分别是x方向和y方向的步长,通常是一样的。

  padding是一个字符串类型,有SAME和VALID两个取值。

返回的同样是一个tensor。

再说一下tf.nn.bias.add这个api

接口定义是:

bias_add(value, bias, data_format=None, name = None)

value是一个tensor,可以是float的,double,int32等等类型的,value可以是任意维度的tensor,但是value的最后一维的size要和bias相同,类型可以不一样,可以转化就可以例如int转double等。

例如在下面的代码中经过卷积操作之后,输入是28*28*1的单通道图像,输出编程了24*24*32的特征图,偏置也是32维的tensor,特征图i对应+bias[i],输出还是24*24*32。同一个特征图共享了卷积核的5*5个参数和1个bias参数,也就是说这里一共有(5*5+1)*32个参数。

#从mnist数据集中读数据,定义一个占位符先
x = tf.placeholder(tf.float32, [None, 28*28])
#将x reshape成一个4D的tensor, 分别是batch size, height, width,channel
x = x.reshape(x, shape=[-1, 28,28,1])
#这个变量是卷积核,卷积核大小是5*5,通道数1,卷积核格式32个
weight = tf.Variable(tf.random_normal([5,5,1,32]))
bias = tf.Variable(tf.random_normal([32]))
stride = 1
x = tf.nn.conv2d(x, weight, strides = [1, stride, stride, 1], padding= 'SAME')
#再加上偏置量
x = tf.nn.bias_add(x, bias)

 通过上面的代码应该就可以很清楚的明白tensorflow中是如何做2维卷积的了。

另外一个用于实现2D卷积的API是tf.layers.conv2d,实际上和上面的这个API并没有太大区别,只是参数更多一些,使用的时候二者都可以。

后续再说一说CNN中的转置卷积(deconvolutional network)在tf中的api的使用,以及计算方式。

 

posted @ 2018-01-09 15:59  放学后去打篮球啊  阅读(954)  评论(0编辑  收藏  举报