如何在 keras 层中有两个不同的输入?

How can I have two distinct inputs in keras layer?

提问人:Anthony Belessis 提问时间:11/13/2023 最后编辑:Ian BoydAnthony Belessis 更新时间:11/15/2023 访问量:28

问:

我正在尝试在 TensorFlow 2 的 AI4Animation (Github) 中复制 ExpertModel 的神经网络架构。

我有两个具有相同(密集)层的神经网络,唯一的区别是第一个(我们称之为门控网络)使用其输出来调制第二个网络的权重(通过混合权重)。请注意,第二个网络具有不同的输入。因此,我需要为第二个网络提供两个输入,我们称它们为“Input”和“weight_blend”。我还需要能够向 x 反向传播,然后返回到门控网络的输入。

基本上我想要的是这样的:

我首先尝试将属性作为属性传递给某些层。我可以很好地定义两个网络的模型,但是我无法将两者连接起来,因为 keras 没有将 weight_blend 视为输入变量(我认为)。这对我来说很有意义,所以我尝试了以下方法:weight_blend

我的第二次尝试,我尝试将 weight_blend 作为主输入 x 旁边的第二个输入传递。然而,情况更糟。我的门控模型定义得很好,但是当我将weight_blend变量传递给第二个网络时,反向保护完全失败,即使对于第二个网络的不同输入也是如此。

这就是我如何称呼发生权重混合的自定义密集层:

def call(self, inputs, *args, **kwargs):

    x = inputs[0]
    weight_blend = inputs[1]

    # get_NNweight/bias just return the initialized weight based on the weight_blend coefficient
    self.w = tf.Variable(initial_value=self.experts.get_NNweight(weight_blend, self.batch_size),
                         trainable=True)
    self.b = tf.Variable(initial_value=self.experts.get_NNbias(weight_blend, self.batch_size),
                         trainable=True)

    x = tf.matmul(self.w, x) + self.b

    acti = self.activation
    if acti != 0:
        if acti == tf.nn.softmax:
            x = acti(x, axis=1)
        else:
            x = acti(x)
    return x

这是门控网络(我只是在这里传递权重的初始化版本):

我非常不愿意使用 Concatenate 层,因为我将我的两个输入用于完全不同的事情,而且输入的形状非常不同。如何合并两个网络,以便仅通过计算主网络输出的损失来将整个网络定义为一个可训练的模型?

机器学习 Keras 神经网络 串联 TensorFlow2.0

评论


答:

0赞 Anthony Belessis 11/15/2023 #1

我犯了两个错误:

1)我在混合发生后训练重量。我应该在混合发生之前训练定义的权重。

2)最终模型由两个输入组成,门控输入和主输入。