繁体   English   中英

tf.gradients 到 tf.GradientTape

[英]tf.gradients to tf.GradientTape

我的程序的一部分中有以下代码:

inverse = tf.gradients(x_conv, x, x_conv)[0]
reconstruction_loss = tf.nn.l2_loss(inverse - tf.stop_gradient(x))

其中 x_conv 是形状为 (384, 24, 1051) 的张量 (float32),x 是形状为 (4, 3, 32, 4201) 的张量 (float32)。 我试图改变使用 tf.gradients 因为为了使用它我需要禁用急切执行并且这似乎搞砸了我的很多其他操作。

Tensorflow 的一个建议是改用 tf.GradientTape(),但我似乎没有找到将初始梯度也设置为 x_conv 的示例,根据我的理解,这是原始代码的作用。

我尝试了以下方法,使用随机数据来实现再现性。 但是,我得到的是“无”以求逆。 我也不确定如何用 tf.stop_gradient 重写该部分。

data = tf.random.uniform((4,3,16800), dtype=tf.float32)

with tf.GradientTape() as tape:
  x = data
  shape_input = x.get_shape().as_list()
  shape_fast = [np.prod(shape_input[:-1]), 1, shape_input[-1]]
  kernel_size = 1794
  paddings = [0, 0], [0, 0], [kernel_size // 2 - 1, kernel_size // 2 + 1]
  filters_kernel = tf.random.uniform((1794, 1, 16), dtype=tf.float32)
  x_reshape = tf.reshape(x, shape_fast)
  x_pad = tf.pad(x_reshape, paddings=paddings, mode='SYMMETRIC')
  x_conv = tf.nn.conv1d(x_pad, filters_kernel, stride=2,
                              padding='VALID', data_format='NCW')
inverse = tape.gradient(x_conv, x, output_gradients=x_conv)

有谁知道我怎么可能重写这部分或者我可以使用任何其他功能? 我正在研究 Tensorflow 2.11.0。

有关更多参考,完整代码在https://github.com/leonard-seydoux/sca.net/blob/master/sca.net/layer.py中,与此问题相关的特定部分是从第 218 行到第 220 行.

只需添加tape.watch(data)类的

...
with tf.GradientTape() as tape:
  tape.watch(data)  
  x = data
  ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM