在 Tensorflow 2 中向 LSTM 内核象征性地添加另一个变量

Symbolically add another variable to LSTM kernel in Tensorflow 2

我试图了解在 TF 2.0 中是否可以象征性地添加到 LSTM 的权重变量 (self.kernel) 另一个 tf.Variable 我将在训练期间控制它(它可以是非-可训练本身)。

例如:

    class AwesomeLSTM(tf.keras.layers.LSTM)

        def build(...)
            super().build(...)
            self.new_weight = self.add_weight(shape=self.kernel.shape, ...)
            self.kernel = self.kernel + self.new_weight

但是当我改变 self.new_weight 时 self.kernel 的值没有改变。有什么想法吗?

我在我的一个项目中遇到了类似的问题(虽然不是在 LSTM 上)。 据我所知,问题是当调用 model.build() 时,会采用 self.new_weight 的 numpy 值,而不是符号变量。

对我有用的解决方法是在调用函数中添加 new_weight。在这种情况下,您需要一个不同的内核,这样加法就不会聚合:

class my_LSTM(tf.keras.layers.LSTM):
    def build(self,input_shape):
        super().build(input_shape)
        self.new_weight = self.add_weight(shape=self.kernel.shape,trainable=False)
        self.actual_kernel = self.add_weight(shape=self.kernel.shape,trainable=True)

    def call(self,inputs,*args):
        self.kernel = self.actual_kernel+self.new_weight
        super().call(inputs,*args)

测试时请记住,layer.kernel 在再次调用图层之前不会更改。

希望这会有所帮助,当有人找到一种方法来象征性地按照您的意图进行操作时,我也会非常感兴趣。