使用子模型时如何将多个输入汇总在一起?

How can i sum up multiple inputs in one when using a submodel?

我编写了一个自定义的 Tree-RNN-CELL,当它们作为元组提供时可以处理多个不同的输入。

...
treeCell3_1 = TreeRNNCell(units=encodingBitLength, num_children=2)
RNNC = layers.RNN(treeCell3_1, return_state=True, return_sequences=True)
h_c_batch, h, c = RNNC(
    inputs=(h_batch2_1, c_batch2_1, h_batch2_2, c_batch2_2))

这工作正常,但现在我想把它放在一个子模型中,这样我就可以将 4 行加起来分为 2 行,并有一个更好的概览(树变大了,所以它值得)

class TreeCellModel(tf.keras.Model):

    def __init__(self, units, num_children):
        super().__init__()
        self.units = units
        self.num_children = num_children
        self.treeCell = TreeRNNCell(units=units, num_children=num_children)
        self.treeRNN = layers.RNN(self.treeCell, return_state=True, return_sequences=True)

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

        h_c_batch, h, c = self.treeRNN(inputs=(inputs))
        h_batch, c_batch = AddCellStatesLayer(units=self.units)(h_c_batch)

        return h_batch, c_batch

treeCell2_1 = TreeCellModel(units=encodingBitLength, num_children=2)
h_batch2_1, c_batch2_1 = treeCell1_1(inputs=(h_batch1_1, c_batch1_1, h_batch1_2, c_batch1_2))

但现在我得到这个错误: ValueError:层 rnn 需要 1 个输入,但它收到了 4 个输入张量。收到的输入:[, , , ]

我已经检查了这个错误,通常在输入周围使用元组时它会得到修复。但这就是我已经在做的。我还通过输出“输入”的类型进行了双重检查,它是一个元组。

请帮忙。

RNN 期待“一个”输入,那么你必须给它“一个”输入。您的单元格的实现可能无关紧要。

您可以更改代码以将 4 个张量连接在一起并在您的单元格中将它们分开。这是可能的,因为你所有的张量都具有相同的形状。

您可以使用:

joined_inputs = layers.Lambda(lambda x: keras.backend.stack(x, axis=-1))([input1, input2, input3, input4])

那么你的单元格应该能够分离输入:

def call(self, inputTensor .....):
    inputs = [inputTensor[:,:,:,i] for i in range(4)]

    ....