我撰寫了一個自定義 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: Layer rnn expects 1 input(s), but it received 4 input tensors。收到的輸入:[<tf.Tensor 'h_batch1_1' shape=(1, 5, 19) dtype=float32>, <tf.Tensor 'c_batch1_1' shape=(1, 5, 19) dtype=float32>, <tf.Tensor 'h_batch1_2' shape=(1, 5, 19) dtype=float32>, <tf.Tensor 'c_batch1_2' shape=(1, 5, 19) dtype=float32>]
我已經檢查了錯誤,通常在輸入周圍使用元組時它會得到修復。但這就是我已經在做的事情。我還通過輸出“輸入”的型別進行了雙重檢查,它是一個元組。
請幫忙。
uj5u.com熱心網友回復:
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)]
....
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432293.html
上一篇:TensorFlow詞嵌入模型 LDA傳遞給LatentDirichletAllocation.fit的資料中的負值
