在 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
在再次调用图层之前不会更改。
希望这会有所帮助,当有人找到一种方法来象征性地按照您的意图进行操作时,我也会非常感兴趣。
我试图了解在 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
在再次调用图层之前不会更改。
希望这会有所帮助,当有人找到一种方法来象征性地按照您的意图进行操作时,我也会非常感兴趣。