如何使用 keras 后端将可训练的标量参数添加到张量流图中

How do I add trainable scalar parameters to tensorflow graph with keras backend

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

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

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

我的问题是我不明白如何 define/use a_i?

首先,所有a_i都是标量,而且它们不依赖于x。

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

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

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

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

假设我们有一个数据集 wi Xyy = 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>]