【发布时间】: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,意思是改变后者不会改变前者,这意味着fakenoisewrtreshaped_noise的梯度为0。一切都按预期工作。 -
@xdurch0 是的,谢谢,我不认为 reshape 会创建一个完全不同的变量,那是我的错误。我删除了重塑,现在它可以工作了,但现在很慢,你能建议一种不同的方法来让它更快
标签: python tensorflow