我想用我自己的变量乘以Keras层
然后,我想计算一些损失相对于我定义的变量的梯度
以下是我尝试做的一个简化的MWE:
import tensorflow as tf
x = input_shape = tf.keras.layers.Input((10,))
x = tf.keras.layers.Dense(5)(x)
s = tf.Variable(tf.ones((5,)))
x = x*s
model = tf.keras.models.Model(input_shape, x)
X = tf.random.normal((50, 10)) # random sample
with tf.GradientTape() as tape:
tape.watch(s)
y = model(X)
loss = y**2
print(tape.gradient(loss, s)) # why None ??
print
打印None
。。。为什么
注意,我使用的是急切执行(tfversion2.0.0)
我通过对
Model
进行子分类并在模型中创建变量来解决问题:或者,定义自己的自定义层也可以
一定有一些神奇的事情在发生,不在模型中的变量不会被反向传播(就像PyTorch中的那样)
我将留下这个问题,因为我很好奇为什么我的代码不工作,以及一个更简单的修复看起来像什么
这也许就是原因。基于对文档的回顾,我怀疑问题是关于模型层“s”(或任何其他层说“x”)的区别可能不是一个有意义的计算。例如,可以这样做:
并获得关于模型权重/参数的梯度,但根据“层”区分模型是不合适的。这是我目前的推测。我希望这有帮助
相关问题 更多 >
编程相关推荐