【问题标题】:How do I add trainable scalar parameters to tensorflow graph with keras backend如何使用 keras 后端将可训练的标量参数添加到张量流图中
【发布时间】:2021-12-13 23:16:03
【问题描述】:

我想使用带有 TF2 的神经网络,用函数的线性组合 h(x) = sum_i(a_i * f_i(x)) 来近似函数 g(x) = exp(x)。

现在,网络输入只是 x,输出是函数 f_i。

自定义损失函数很简单:均方差|g(x) - h(x)|^2。

我的问题是我不明白如何定义/使用 a_i?

首先,所有 a_i 都只是标量,此外它们不依赖于 x。

将 a_i 定义为输入没有意义,因为我希望优化它们。

定义为输出使它们依赖于我不想要的 x。

如何将这些变量作为标量添加到网络中并通过优化过程对其进行优化?

【问题讨论】:

    标签: python tensorflow keras deep-learning tensorflow2.0


    【解决方案1】:

    在训练期间,Tensorflow 会跟踪模型中定义的所有 tf.Variable 对象。如果您将常量定义为tf.Variable,它将通过反向传播进行调整。

    假设我们有一个数据集 wi Xy,即 y = X * 2

    import tensorflow as tf
    
    x = tf.random.uniform((10_000, 1))
    y = x * 2
    

    我们将创建一个内部有一个常量的模型,它需要复制Xy 之间的关系。我们当然会将这个值初始化为 2 以外的值。Xy 之间的关系是 2,所以训练应该使常数收敛到 2。所以让我们定义一个只是常数的模型。

    class CustomModel(tf.keras.models.Model):
        def __init__(self):
            super(CustomModel, self).__init__()
            self.constant = tf.Variable(initial_value=0.1, dtype=tf.float32, trainable=True)
    
        def call(self, x, **kwargs):
            x = self.constant * x
            return x
    
    
    model = CustomModel()
    

    现在只需编译和训练模型:

    model.compile(loss='mae')
    
    history = model.fit(x, y, epochs=25, verbose=0)
    

    现在看看权重。初始化为 0.1 的常量现在是 2。它已经过优化,因为它理解了 Xy 之间的关系,即 2。

    model.weights
    
    [<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]
    

    【讨论】:

    • 谢谢,但是如何在需要它来计算平方差的自定义损失函数中访问这个变量?
    • 您可以通过多种方式访问​​它,例如model.weightsmodel.constant,但损失通常使用输出计算,而不是权重。
    • 点赞loss = loss_function(y_test, model(X_test))
    • 特别是在这种情况下,我必须使用变量(a_i),因为我需要它们来计算函数的近似值
    • 好吧好吧。 constant 是一个对象属性,因此您可以最轻松地访问它 - model.constant
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 2018-03-14
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多