我正在学习LSTM模型以使数据集适合多类分类,这是八种音乐类型,但不确定Keras模型中的输入形状。
我在这里遵循了这些教程:
我的数据是这样的:
vector_1,vector_2,...vector_30,genre
23.5 20.5 3 pop
.
.
.
(7678)
我将数据形状转换为(7678,1,30),它是7678首音乐,1个时间步和30个向量。对于音乐类型,我使用了train_labels = pd.get_dummies(df['genre'])
这是我的模特:
# build a sequential model
model = Sequential()
# keras convention to use the (1,30) from the scaled_train
model.add(LSTM(32,input_shape=(1,30),return_sequences=True))
model.add(LSTM(32,return_sequences=True))
model.add(LSTM(32))
# to avoid overfitting
model.add(Dropout(0.3))
# output layer
model.add(Dense(8,activation='softmax'))
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
拟合模型
model.fit(scaled_train,train_labels,epochs=5,validation_data=(scaled_validation,valid_labels))
但是在尝试拟合模型时,出现错误ValueError: Shapes (None, 8) and (None, 1, 8) are incompatible
。我在代码中做错了什么吗?非常感谢您的帮助。
我的数据的形状
print(scaled_train.shape)
print(train_labels.shape)
print(scaled_validation.shape)
print(valid_labels.shape)
(7678, 1, 30)
(7678, 8)
(450, 30)
(450, 8)
编辑
我已经尝试过How to stack multiple lstm in keras?
但是仍然出现错误ValueError: Input 0 of layer sequential_21 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 30]
答案 0 :(得分:1)
顾名思义,return_sequences=True
将返回一个序列(带有时间步长),这就是为什么您的输出形状为(None, 1, 8)
:保持时间步长的原因。穿过密集层时,它不会自动展平。试试:
model = Sequential()
model.add(LSTM(32,input_shape=(1,30),return_sequences=False))
model.add(Dense(32,activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(8,activation='softmax'))
如果您不注释第二个LSTM层,我想这不会发生吗?