使用Keras层时区分用户定义的变量

2024-05-20 09:31:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用我自己的变量乘以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)


Tags: noneinputmodel定义layerstfasrandom
2条回答

我通过对Model进行子分类并在模型中创建变量来解决问题:

class MyModel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense = tf.keras.layers.Dense(5)
        self.s = tf.Variable(tf.ones((5,)))

    def call(self, inputs):
        x = self.dense(inputs)
        x = x * self.s
        return x

或者,定义自己的自定义层也可以

一定有一些神奇的事情在发生,不在模型中的变量不会被反向传播(就像PyTorch中的那样)

我将留下这个问题,因为我很好奇为什么我的代码不工作,以及一个更简单的修复看起来像什么

这也许就是原因。基于对文档的回顾,我怀疑问题是关于模型层“s”(或任何其他层说“x”)的区别可能不是一个有意义的计算。例如,可以这样做:

print(tape.gradient(loss, model.variables))

并获得关于模型权重/参数的梯度,但根据“层”区分模型是不合适的。这是我目前的推测。我希望这有帮助

相关问题 更多 >