使用子模型时如何将多个输入汇总在一起?
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)]
....
我编写了一个自定义的 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)]
....