卷积函数是构建神经网络的重要支架,是在一批图像上扫描的二维过滤器
。
tf.nn.convolution(input,filter,padding,strides=None,dilation_rate=None,name=None,data_format=None)
该函数计算N维卷积的和。tf.nn.conv2d(input,filter,padding,strides,use_cudnn_on_gpu=None,name=None,data_format=None)
对一个四
维的输入数据input和四
维的卷积核filter
进行操作,然后对输入数据进行一个二维
的卷积操作,最后得到卷积之后的结果。函数参数说明:
tf.nn.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中每一维的对应`移动步数`
padding:一个字符串,取值为SAME或VALID。SAME仅适用于全尺寸操作,即输入数据维度和输出数据维度相同;VALID适用于部分窗口,即输入数据维度和输出数据维度不同
use_cudnn_on_gpu:一个可选布尔值,是否使用英伟达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')
3. tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,data_format=None)
输入张量(input)的数据维度是[batch,in_height,in_width,in_channels]
,卷积核(filter)的维度是[filter_height,filter_width,in_channels,channel_multiplier]
,在通道in_channels上面的卷积深度是1,depthwise_conv2d函数将不同的卷积核独立地应用在in_channels的每个通道上(从通道1到通道channel_multiplier),然后把所有的结果进行汇总。最后输出通道的总数是
i
n
_
c
h
a
n
n
e
l
s
×
c
h
a
n
n
e
l
_
m
u
l
t
i
p
l
i
e
r
in\_channels \times channel\_multiplier
in_channels×channel_multiplier,示例代码片段如下:
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,5),dtype=np.float32)
y=tf.nn.depthwise_conv2d(input_data,filter_data,strides=[1,1,1,1],padding='SAME')
4. tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter,strides,padding,rate=None,name=None,data_format=None)
利用几个分离的卷积核去做卷积。在这个API中,将应用一个二维的卷积核,在每个通道上,以深度channel_multiplier进行卷积。部分参数说明:
depthwise_filter: 一个tensor,数据维度是四维[filter_height,filter_width,in_channels,channel_multiplier],其中in_channels卷积深度是1。
pointwise_filter:一个tensor,数据维度是四维[1,1,channel_multiplier?in_channels,out_channels],其中pointwise_filter是在depthwise_filter卷积之后的混合卷积。
使用示例代码如下:
import tensorflow as tf
import numpy as np
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')
5. tf.nn.atrous_conv2d(value,filter,rate,padding,name=None)
计算Atrous卷积,又称孔
卷积或者扩张
卷积。使用示例:
import tensorflow as tf
import numpy as np
input_data=tf.Variable(np.random.rand(1,5,5,1),dtype=np.float32)
filter_data=tf.Variable(np.random.rand(3,3,1,1),dtype=np.float32)
y=tf.nn.atrous_conv2d(input_data,filter_data,2,padding='SAME')
6. tf.nn.conv2d_transpose(value,filter,output_shape,strides,padding='SAME',data_format='NHWC',name=None)
在解卷积网络中有时称为反卷积
,但实际是conv2d的转置
,使用示例代码:
import tensorflow as tf
input_data=tf.compat.v1.random_normal(shape=[1,3,3,1])
filter_data=tf.compat.v1.random_normal(shape=[2,2,3,1])
y=tf.nn.conv2d_transpose(input_data,filter_data,output_shape=[1,5,5,3],strides=[1,2,2,1],padding='SAME')
7. tf.nn.conv1d(input,filter,strides,padding,data_format=None,name=None)
该函数是用来计算给定三维的输入和过滤器的情况下的一维卷积,输入input是三维,如[batch,in_width,in_channels],卷积核filters也是三维,如[]filter_width,in_channels,out_channels]。strides是一个整数,代表卷积核
向右
移动每一步的长度。
tf.nn.conv3d(input,filter,strides,padding,name=None)
该函数是用来计算给定五维的输入和过滤器的情况下的三维卷积,与二维卷积相比:- input 的shape中多一维in_depth,形状为Shape[batch,in_depth,in_height,in_width,in_channels]
- filter的shapt中多一维filter_depth,由[filter_depth,filter_height,filter_width]构成卷积核的大小。
- strides中多一维变为[strides_batch,strides_depth,strides_height,strides_width,strides_channel],必须保证strides[0]=strides[4]=1
tf.nn.conv3d_transpose(input,filter,output_shape,strides,,padding='SAME',name=None)
和二维反卷积(转置)类似。