问题描述
我有一个带有一些自定义 tensorflow 层的 tensorflow 模型。我通过调用 tf.Variables
在 build()
方法中构建我的 self.add_weight()
,因为它应该完成。然后我在调用之前将这些权重与其他一些常数张量相乘(考虑它的基础变化)。看来 tensorflow 失去了对我的变量的跟踪。然而,它们并没有消失在我的层的可训练变量中。
这是一个重现我想要做的错误的示例:
class ToyLayer(tf.keras.layers.Layer):
def __init__(self):
super(ToyLayer,self).__init__()
self.basis_vector = tf.constant([1,0.,1])
def build(self,input_shape):
self.variable = self.add_weight(shape=(1,))
self.effective_weight = self.variable*self.basis_vector
def call(self,inputs,**kwargs):
return tf.tensordot(inputs,self.effective_weight,axes=1)
layer = ToyLayer()
x = tf.random.normal((3,))
with tf.GradientTape() as tape:
y = layer(x)
print(layer.trainable_weights)
print(tape.gradient(y,layer.trainable_weights))
可训练的权重仍然是它们所需要的,但对于梯度,我得到了 None。
将常数张量更改为 tf.Variable
无济于事。
如果我尝试用 tf.GradientTape()
做一些类似的事情,如果我将变量与梯度磁带中的向量相乘,我会得到正确的梯度,但如果在磁带之前进行向量变量乘法,则不会得到梯度。因此,在图层中,当将变量与向量相乘时,我的渐变似乎还没有被记录下来。我该如何解决这个问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)