tensorflow卷积函数

卷积函数 是构建神经网络的重要支架,是在一批图像上扫描的二维过滤器。

卷积函数定义在tensorflow-1.1.0/tensorflow/python/ops下的nn_impl.py和nn_ops.py文件中。

tf.nn.convolution(input, filter, padding, strides=None,
                  dilation_rate=None, name=None, data_format=None)
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,
             data_format= None, name=None)
tf.nn.depthwise_conv2d (input, filter, strides, padding, rate=None, name=None,
                        data_format=None) 
tf.nn.separable_conv2d (input, depthwise_filter, pointwise_filter, strides, padding, 
                      rate=None, name=None, data_format=None) 
tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding='SAME', 
                       data_format='NHWC', name=None)
tf.nn.conv1d(value, filters, stride, padding, use_cudnn_on_gpu=None,
             data_format= None, name=None)
tf.nn.conv3d(input, filter, strides, padding, name=None)
tf.nn.conv3d_transpose(value, filter, output_shape, strides, padding='SAME', name=None)

下面就分别加以说明。

(1)tf.nn.convolution(input, filter, padding, strides=None, dilation_rate=None, name=None, data_format =None)这个函数计算N维卷积的和。

(2)tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)这个函数的作用是对一个四维的输入数据input和四维的卷积核filter进行操作,然后对输入数据进行一个二维的卷积操作,最后得到卷积之后的结果。

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, 
           data_format=None, name=None)
# 输入:
#   input:一个Tensor。数据类型必须是float32或者float64
#   filter:一个Tensor。数据类型必须是input相同
#   strides:一个长度是4的一维整数类型数组,每一维度对应的是input中每一维的对应移动步数,
#   比如,strides[1]对应input[1]的移动步数
#   padding:一个字符串,取值为SAME或者VALID
#   padding='SAME':仅适用于全尺寸操作,即输入数据维度和输出数据维度相同
#   padding='VALID:适用于部分窗口,即输入数据维度和输出数据维度不同
#   use_cudnn_on_gpu:一个可选布尔值,默认情况下是True
#   name:(可选)为这个操作取一个名字
# 输出:一个Tensor,数据类型是input相同

使用示例如下:

input_data = tf.Variable( np.random.rand(10,9,9,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 2), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')

打印出tf.shape(y)的结果是[10 9 9 2]。

(3)tf.nn.depthwise_conv2d (input, filter, strides, padding, rate=None, name=None,data_format= None) 这个函数输入张量的数据维度是[batch, in_height, in_width, in_channels],卷积核的维度是[filter_height, filter_width, in_channels, channel_multiplier],在通道in_channels上面的卷积深度是1,depthwise_conv2d函数将不同的卷积核独立地应用在in_channels的每个通道上(从通道1到通道channel_multiplier),然后把所以的结果进行汇总。最后输出通道的总数是in_channels * channel_multiplier。

使用示例如下:

input_data = tf.Variable( np.random.rand(10, 9, 9, 3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 5), dtype = np.float32)
y = tf.nn.depthwise_conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')

这里打印出tf.shape(y)的结果是[10 9 9 15]。

(4)tf.nn.separable_conv2d (input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)是利用几个分离的卷积核去做卷积。在这个API中,将应用一个二维的卷积核,在每个通道上,以深度channel_multiplier进行卷积。

def separable_conv2d (input, depthwise_filter, pointwise_filter, strides, padding,   
                         rate=None, name=None, data_format=None) 
# 特殊参数:
#   depthwise_filter:一个张量。数据维度是四维[filter_height, filter_width, in_channels, 
#   channel_multiplier]。其中,in_channels的卷积深度是1
#   pointwise_filter:一个张量。数据维度是四维[1, 1, channel_multiplier * in_channels, 
#   out_channels]。其中,pointwise_filter是在depthwise_filter卷积之后的混合卷积

使用示例如下:

input_data = tf.Variable( np.random.rand(10, 9, 9, 3), dtype = np.float32 )
depthwise_filter = tf.Variable( np.random.rand(2, 2, 3, 5), dtype = np.float32)
pointwise_filter = tf.Variable( np.random.rand(1, 1, 15, 20), dtype = np.float32)
# out_channels >= channel_multiplier * in_channels
y = tf.nn.separable_conv2d(input_data, depthwise_filter, pointwise_filter, 
                           strides = [1, 1, 1, 1], padding = 'SAME')

这里打印出tf.shape(y)的结果是[10 9 9 20]。

(5)tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)计算Atrous卷积,又称孔卷积或者扩张卷积。

使用示例如下:

input_data = tf.Variable( np.random.rand(1,5,5,1), dtype = np.float32 )
filters = tf.Variable( np.random.rand(3,3,1,1), dtype = np.float32)
y = tf.nn.atrous_conv2d(input_data, filters, 2, padding='SAME')

这里打印出tf.shape(y)的结果是[1 5 5 1]。

(6)tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding='SAME', data_format='NHWC', name=None) [18] 在解卷积网络(deconvolutional network)中有时称为“反卷积”,但实际上是conv2d的转置,而不是实际的反卷积。

def conv2d_transpose(value, filter, output_shape, strides, padding='SAME', 
                     data_format='NHWC', name=None)
# 特殊参数:
#   output_shape:一维的张量,表示反卷积运算后输出的形状
# 输出:和value一样维度的Tensor

使用示例如下:

x = tf.random_normal(shape=[1,3,3,1])
kernel = tf.random_normal(shape=[2,2,3,1])
y = tf.nn.conv2d_transpose(x,kernel,output_shape=[1,5,5,3],
                           strides=[1,2,2,1],padding="SAME")

这里打印出tf.shape(y)的结果是[1 5 5 3]。

(7)tf.nn.conv1d(value, filters, stride, padding, use_cudnn_on_gpu=None, data_format=None, name=None)和二维卷积类似。这个函数是用来计算给定三维的输入和过滤器的情况下的一维卷积。不同的是,它的输入是三维,如[batch, in_width, in_channels]。卷积核的维度也是三维,少了一维filter_height,如 [filter_width, in_channels, out_channels]。stride是一个正整数,代表卷积核向右移动每一步的长度。

(8)tf.nn.conv3d(input, filter, strides, padding, name=None)和二维卷积类似。这个函数用来计算给定五维的输入和过滤器的情况下的三维卷积。和二维卷积相对比:

  • input的shape中多了一维in_depth,形状为Shape[batch, in_depth, in_height, in_width, in_channels];
  • filter的shape中多了一维filter_depth,由filter_depth, filter_height, filter_width构成了卷积核的大小;
  • strides中多了一维,变为[strides_batch, strides_depth, strides_height, strides_width, strides_channel],必须保证strides[0] = strides[4] = 1。

(9)tf.nn.conv3d_transpose(value, filter, output_shape, strides, padding='SAME', name=None)和二维反卷积类似,不再赘述。

猜你喜欢

转载自blog.csdn.net/wang263334857/article/details/89059094