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的使用,以及计算方式。