【问题标题】:Workaround tf.reshape breaking the flow of the gradient (jacobian)解决方法 tf.reshape 打破渐变的流动(雅可比)
【发布时间】:2022-01-21 10:21:25
【问题描述】:

我有一个程序,我试图在其中计算神经网络的雅可比,但为了正确定义雅可比,我使用tf.reshape来制作数据向量(据我所知,雅可比:dy /dx 仅在 y 和 x 是向量(不是矩阵或张量)时定义)
这是我的代码

@tf.function
def A_calculator():
  with tf.GradientTape(watch_accessed_variables=False) as gtape:
      noise=tf.random.normal([1000, 100])
      gtape.watch(noisex)
      fakenoise=tf.reshape(gen(noise),[1000,-1])
      reshaped_noise=tf.reshape(noise,[1000,-1])
  #caulculate jacobian
  Jz=gtape.batch_jacobian(fakenoise,reshaped_noise)
  return Jz

其中gen是一个返回图像的神经网络(生成器)
我的问题是 Jz 始终是一个以零为元素的张量
我为此搜索了一个解决方案,但最接近的是here(这让我怀疑问题是tf.reshape),但那里的解决方案并没有解决我的问题,因为我想在插入后进行重塑函数gen 的值,有人知道如何解决这个问题吗?或者为什么Jz 总是给出一个零值的张量?

【问题讨论】:

  • fakenoise 绝不依赖于reshaped_noise,意思是改变后者不会改变前者,这意味着fakenoise wrt reshaped_noise 的梯度为0。一切都按预期工作。
  • @xdurch0 是的,谢谢,我不认为 reshape 会创建一个完全不同的变量,那是我的错误。我删除了重塑,现在它可以工作了,但现在很慢,你能建议一种不同的方法来让它更快

标签: python tensorflow


【解决方案1】:

没有必要对每个张量进行整形,因为将 (1000,100) 张量整形为(1000,-1) 将产生相同的形状。在所有阶段完全跳过重塑。

请检查生成器,它可能需要很长时间才能产生“假噪声”

【讨论】:

    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2010-10-06
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多