Tensorflow 在与常数张量相乘后失去对变量/梯度的跟踪

问题描述

我有一个带有一些自定义 tensorflow 层的 tensorflow 模型。我通过调用 tf.Variablesbuild() 方法中构建我的 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...