簡體   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