TensorFlow卷积梯度反向传播详解:Valid与Same模式

叶初
叶初
发布时间:2026-10-13 | 4人浏览过
原创

本文详细解析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卷积梯度反向传播过程的解析即为全部内容,希望能为读者提供参考与帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表