tensorflow中用于卷积操作的函数主要为 tf.nn.conv2d,自己学习做的记录
函数定义
tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
参数说明
- input:输入待被卷积的张量,具体格式为 [batch, in_height, in_width, in_channels] , 这里 batch 是一次处理几个 in_height, in_width, in_channels 这么大的图片(可以这么认为吧,或 feature map 也可以),in_height, in_width, in_channels 分别是图片的维度,一般都是方的,即长宽一样。
- filter:用于卷积的卷积核,具体格式为[filter_height, filter_width, in_chanels, out_channels],filter_height, filter_width 为单个卷积核的维度,in_channels 是待卷积图片的通道数,out_channels 是卷积后的 feature map 的通道数,看过多通道卷积的具体的操作就明白怎回事了
多通道卷积示意图看这里 - strides:卷积核在卷积的时候在每一维移动的步长,具体格式为 [1, stride, stride,1] ,两边必须都是1,我也不知道为什么
- padding:有两个选择 “VALID”, “SAME”; 简单来说,VALID在计算时不会加边,就是常说的 padding,如果边长不够,这种卷积操作会直接把不够的地方舍掉,不做卷积了;SAME在计算卷积时会加 padding,SAME 具体加多少边填充的计算公式为
(待卷积图片的维度/卷积核的维度)上取整 - use_cudnn_on_gpu:是否使用 cudnn 加速,bool类型,默认是 true.
- 后边的参数就没有了解了,因为目前还没用到
在 Tensorflow 的 nn_ops.py 中有关于卷积运算输出尺寸的定义
If padding == "SAME":
output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])
If padding == "VALID":
output_spatial_shape[i] =
ceil((input_spatial_shape[i] -
(spatial_filter_shape[i]-1) * dilation_rate[i])
/ strides[i]).
下面是自己做测试验证自己理解
## python 版本 3.7.4,tensorflow 版本 2.3.0, windows10 命令行
## 我只是想看看维度运算是否正确,因为并没有看具体计算值是多少,只看了维度是否正确,这些计算结果和手算结果是一致的
import tensorflow as tf
>>> input = tf.Variable(tf.random.normal([1,5,5,3]))
>>> filter = tf.Variable(tf.random.normal([3,3,3,4]))
>>> input.shape
TensorShape([1, 5, 5, 3])
>>> filter.shape
TensorShape([3, 3, 3, 4])
>>> output = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='VALID')
>>> output.shape
TensorShape([1, 3, 3, 4])
>>> output = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')
>>> output.shape
TensorShape([1, 5, 5, 4])
>>> input1 = tf.Variable(tf.random.normal([1,6,6,3]))
>>> filter = tf.Variable(tf.random.normal([3,3,3,4]))
>>>> output1 = tf.nn.conv2d(input1, filter, strides=[1,2,2,1], paddi>>> output1.shape
TensorShape([1, 2, 2, 4])
>>> output2 = tf.nn.conv2d(input1, filter, strides=[1,2,2,1], padding = 'SAME')
>>> output2.shape
TensorShape([1, 3, 3, 4])