Keras密集输入大小错误,平坦返回(None,None)



我试图实现这个模型来生成midi音乐,但我收到了一个错误

The last dimension of the inputs to `Dense` should be defined. Found `None`.

这是我的代码

model = Sequential()
model.add(Bidirectional(LSTM(512, return_sequences=True), input_shape=(network_input.shape[1], network_input.shape[2])))
model.add(SeqSelfAttention(attention_activation='sigmoid'))
model.add(Dropout(0.3))
model.add( LSTM(512, return_sequences=True))
model.add(Dropout(0.3))
model.add(Flatten())
model.summary()
model.add(Dense(note_variants_count))
model.compile(loss='categorical_crossentropy', optimizer='adam')

这是密层之前的总结


Model: "sequential_17"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bidirectional_19 (Bidirectio (None, 100, 1024)         2105344   
_________________________________________________________________
seq_self_attention_20 (SeqSe (None, None, 1024)        65601     
_________________________________________________________________
dropout_38 (Dropout)         (None, None, 1024)        0         
_________________________________________________________________
lstm_40 (LSTM)               (None, None, 512)         3147776   
_________________________________________________________________
dropout_39 (Dropout)         (None, None, 512)         0         
_________________________________________________________________
flatten_14 (Flatten)         (None, None)              0         
=================================================================
Total params: 5,318,721
Trainable params: 5,318,721
Non-trainable params: 0
_________________________________________________________________

我认为Flatten层导致了问题,但我不知道为什么它会返回(None,None(形状。

您必须为Flatten层提供除批次维度之外的所有维度。

使用RNN和'return_sequence'

对于像LSTM这样的RNN,可以选择返回整个序列或仅返回结果。在这种情况下,您只需要结果。只更改这一行

model.add(Dropout(0.3))
model.add(LSTM(512, return_sequences=False)) # <== change to False
model.add(Dropout(0.3))
model.add(Flatten())
model.summary()

从摘要返回以下网络形状

_________________________________________________________________
lstm_4 (LSTM)                (None, 512)               3147776   
_________________________________________________________________
dropout_3 (Dropout)          (None, 512)               0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 512)               0         
=================================================================

注意输出张量的秩从秩3降低到秩2。这是因为这个输出只是输出,而不是考虑所有隐藏状态的整个序列。

最新更新