卷积函数
(1)计算N维卷积的和
tf.nn.convolution(input, filter, padding, strides=None, dilation_rate=None,name=None,data_format=None)
(2)对一个四维的输入数据input和卷积核filter进行操作,然后对输入数据进行一个二维的卷积操作,最后得到卷积之后的结果。
tf.nn.conv2d(input, filter, padding, use_cudnn_on_gpu=None, data_format=None, Name=None)
- input: 一个Tensor。数据类型必须是float32和float64。
- filter: 一个Tensor。数据类型必须和input相同。
- strides: 一个长度是4的一维整数类型数组每一维度对应的是input中每一维度对应的移动步数。
- padding: 一个字符串,取值为SAME或者VALID。
(SAME:仅适用于全尺寸操作,即输入数据维度和输出数据维度相同。
VALID:适用于部分窗口,即输入数据和输出数据维度不同。)
- use_cudnn_on_gpu: 一个可选布尔值,默认是True。
- name: (可选)为这个操作取一个名字。
import tensorflow as tf
import numpy as np
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)
结果如下:
(3)深度可分离卷积,将不同的卷积核独立地应用在in_channels的每个通道上(从通道1到通道channel_multiplier),然后把所有结果进行汇总。最后输出通道的总数是in_channels*channels_multiplier。
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。
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)
结果如下:
(4)利用几个分离的卷积核去做卷积。
tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)
- 应用一个二维的卷积核,在每个通道上,以深度channel_multiplier
- depthwise_filter: 一个张量。数据维度是4维[filter_height, filter_width, in_channels, channel_multiplier],in_channels的卷积深度是1。
- pointwise_filter: 一个张量。数据维度是4维[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)
y = tf.nn.separable_conv2d(input_data, depthwise_filter, pointwise_filter,strides=[1,1,1,1],padding='SAME')
tf.shape(y)
结果如下:
(5)计算Atrous卷积(孔卷积/扩张卷积)
tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
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)
结果如下:
(6)进行conv2d的转置
tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding=‘SAME’, data_format=‘NHWC’, name=None)
- output_shape: 一维的张量,表示反卷积运算后输出的形状。
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)
结果如下: