TensorFlow卷积梯度反向传播详解:Valid与Same模式
本文详细解析TensorFlow中卷积操作的梯度反向传播机制,涵盖Valid和Same两种填充模式。通过具体示例展示如何对未知输入张量和未知卷积核分别求导,并介绍tf.nn.conv2d_backprop_input与tf.nn.conv2d_backprop_filter函数的使用方法及代码实现,帮助开发者深入理解卷积层训练过程中的梯度计算逻辑。
Valid卷积梯度计算原理
一、Valid卷积的梯度计算
针对Valid卷积的梯度反向传播,主要讨论两种场景:第一种是已知卷积核参数,求解未知输入张量的梯度(即对张量中的每个变量求偏导);第二种是已知输入张量,求解未知卷积核参数的梯度(即对卷积核中的每个变量求偏导)。
1. 已知卷积核,求解输入张量梯度
为了直观理解Valid卷积的梯度反向传播过程,我们构建一个简单示例:假设存在一个尺寸为3x3的未知输入张量x,以及一个尺寸为2x2的已知卷积核K。
在TensorFlow中,可以使用tf.nn.conv2d_backprop_input函数来实现Valid模式下对输入变量梯度的计算。上述示例对应的代码实现如下:
import tensorflow as tf
# 卷积核
kernel=tf.constant(
[
[[[3]],[[4]]],
[[[5]],[[6]]]
]
,tf.float32
)
# 某一函数针对sigma的导数
out=tf.constant(
[
[
[[-1],[1]],
[[2],[-2]]
]
]
,tf.float32
)
# 针对未知变量的导数的方向计算
inputValue=tf.nn.conv2d_backprop_input((1,3,3,1),kernel,out,[1,1,1,1],'VALID')
session=tf.Session()
print(session.run(inputValue))
[[[[ -3.]
[ -1.]
[ 4.]]
[[ 1.]
[ 1.]
[ -2.]]
[[ 10.]
[ 2.]
[-12.]]]]
2. 已知输入张量,求解卷积核梯度
在此场景中,假设已知一个3行3列的输入张量x,以及一个尺寸为2行2列的未知卷积核K。
TensorFlow提供了tf.nn.conv2d_backprop_filter函数,用于计算Valid模式下对卷积核参数的梯度。上述示例的代码实现如下:
import tensorflow as tf
# 输入张量
x=tf.constant(
[
[
[[1],[2],[3]],
[[4],[5],[6]],
[[7],[8],[9]]
]
]
,tf.float32
)
# 某一个函数F对sigma的导数
partial_sigma=tf.constant(
[
[
[[-1],[-2]],
[[-3],[-4]]
]
]
,tf.float32
)
# 某一个函数F对卷积核k的导数
partial_sigma_k=tf.nn.conv2d_backprop_filter(x,(2,2,1,1),partial_sigma,[1,1,1,1],'VALID')
session=tf.Session()
print(session.run(partial_sigma_k))
[[[[-37.]]
[[-47.]]]
[[[-67.]]
[[-77.]]]]
Same卷积梯度计算原理
二、Same卷积的梯度计算
1. 已知卷积核,求解输入张量梯度
假设存在一个3行3列的已知输入张量x,以及一个尺寸为2行2列的未知卷积核K。
import tensorflow as tf
# 卷积核
kernel=tf.constant(
[
[[[3]],[[4]]],
[[[5]],[[6]]]
]
,tf.float32
)
# 某一函数针对sigma的导数
partial_sigma=tf.constant(
[
[
[[-1],[1],[3]],
[[2],[-2],[-4]],
[[-3],[4],[1]]
]
]
,tf.float32
)
# 针对未知变量的导数的方向计算
partial_x=tf.nn.conv2d_backprop_input((1,3,3,1),kernel,partial_sigma,[1,1,1,1],'SAME')
session=tf.Session()
print(session.run(inputValue))
[[[[ -3.]
[ -1.]
[ 4.]]
[[ 1.]
[ 1.]
[ -2.]]
[[ 10.]
[ 2.]
[-12.]]]]
2. 已知输入张量,求解卷积核梯度
假设已知一个3行3列的输入张量x,以及一个尺寸为2行2列的未知卷积核K。
import tensorflow as tf
# 卷积核
x=tf.constant(
[
[
[[1],[2],[3]],
[[4],[5],[6]],
[[7],[8],[9]]
]
]
,tf.float32
)
# 某一函数针对sigma的导数
partial_sigma=tf.constant(
[
[
[[-1],[-2],[1]],
[[-3],[-4],[2]],
[[-2],[1],[3]]
]
]
,tf.float32
)
# 针对未知变量的导数的方向计算
partial_sigma_k=tf.nn.conv2d_backprop_filter(x,(2,2,1,1),partial_sigma,[1,1,1,1],'SAME')
session=tf.Session()
print(session.run(partial_sigma_k))
[[[[ -1.]]
[[-54.]]]
[[[-43.]]
[[-77.]]]]
以上关于TensorFlow卷积梯度反向传播过程的解析即为全部内容,希望能为读者提供参考与帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









