【问题标题】:When use custom layer in Tensorflow 2.0, the gradient returns None在 Tensorflow 2.0 中使用自定义层时,渐变返回 None
【发布时间】:2022-01-18 12:38:01
【问题描述】:

我设计了一个自定义层,像这样使用:

class SquaredWeightedLayer(tf.keras.layers.Layer):
    def __init__(self, units=1):
        super(SquaredWeightedLayer, self).__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer="random_normal", trainable=True)
        self.square_w = self.w ** 2
        self.b = self.add_weight(shape=(self.units,), initializer="zeros", trainable=True)
        super(SquaredWeightedLayer, self).build(input_shape)

    def call(self, inputs):
        return tf.sigmoid(tf.add(tf.matmul(inputs, self.square_w), self.b))

但是,tape.gradient(loss, self.w) 返回 Nonetape.gradient(loss, self.square_w) 返回正常值。 损失是binary_crossentropy

我将非常感谢任何解决此问题的建议。谢谢!

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    问题是self.w ** 2的计算已经在build函数中执行,在任何磁带上下文之外,所以Tensorflow无法追踪square_w实际上来自w,导致@987654325的梯度@。您只需将平方操作移至call即可修复它:

    def call(self, inputs):
        return tf.sigmoid(tf.add(tf.matmul(inputs, self.w**2), self.b))
    

    【讨论】:

    • 它确实有效,谢谢!
    • 酷,考虑接受答案,以便其他人可以看到它解决了问题!
    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2020-09-19
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多