TensorFlow 卷积计算函数理解

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在计算卷积时会加 paddingSAME 具体加多少边填充的计算公式为
    (待卷积图片的维度/卷积核的维度)上取整
  • 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])

参考资料

  1. Tensorflow卷积中Padding的两种方式
  2. 理解tf.nn.conv2d方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值