Keras搭建LSTM模型调用fit()时输入形状不兼容报错求解
报错原因
报错本质是模型期望的输入形状和实际喂入的数据形状不匹配,你的代码里有两个核心错误:
input_shape参数传值错误:Keras模型的input_shape只需要传入单条样本的特征维度,不需要包含样本总数维度。你写的input_shape = (X_train.shape[0], X_train.shape[1])把训练集样本总数(也就是报错里的6557)当成了时间步长度传给了LSTM层,导致模型第一层期望输入形状为(None, 6557, 40)。- 输入数据维度不符合LSTM要求:LSTM层要求输入为3维格式
(样本数, 时间步长, 单帧特征数),你从CSV加载的特征是2维格式(样本数, 40),缺少了时间步维度,喂入模型时实际形状只有(None, 40),和模型期望形状完全不匹配。
修复方案
按以下步骤修改代码即可解决问题:
- 第一步:恢复特征的时序维度
你将音频特征存入CSV时,大概率把原本形状为(时间步长, 40)的单音频时序特征展平成了一维数组,加载后需要先reshape回LSTM需要的3维结构。将代码中time_steps替换为你提取音频特征时单条音频对应的帧长度(比如常用的MFCC特征单音频取130帧),对训练集、验证集、测试集做统一维度转换:
如果你的音频时长不统一,需要先对特征做padding补零到相同时间步长度,再执行reshape操作。# 替换time_steps为你实际提取特征时的单音频帧数量 time_steps = 130 X_train = X_train.reshape(X_train.shape[0], time_steps, 40) X_validation = X_validation.reshape(X_validation.shape[0], time_steps, 40) X_test = X_test.reshape(X_test.shape[0], time_steps, 40) - 第二步:修正input_shape传值
去掉input_shape里的样本总数维度,只传入单条样本的时序维度:input_shape = (X_train.shape[1], X_train.shape[2])
修正后的完整训练代码
def build_model(input_shape): # build network topology model = keras.Sequential() # 2 LSTM layers model.add(keras.layers.LSTM(64, input_shape=input_shape, return_sequences=True)) model.add(keras.layers.LSTM(64)) # dense layer model.add(keras.layers.Dense(64, activation='relu')) model.add(keras.layers.Dropout(0.3)) # output layer model.add(keras.layers.Dense(10, activation='softmax')) return model # 维度转换 time_steps = 130 # 替换为实际帧长 X_train = X_train.reshape(X_train.shape[0], time_steps, 40) X_validation = X_validation.reshape(X_validation.shape[0], time_steps, 40) X_test = X_test.reshape(X_test.shape[0], time_steps, 40) # create network input_shape = (X_train.shape[1], X_train.shape[2]) model = build_model(input_shape) # compile model optimiser = keras.optimizers.Adam(learning_rate=0.0001) model.compile(optimizer=optimiser, loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.summary() # train model history = model.fit(X_train, y_train, validation_data=(X_validation, y_validation), batch_size=32, epochs=30) # plot accuracy/error for training and validation plot_history(history) # evaluate model on test set test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2) print('\nTest accuracy:', test_acc)
校验方法
修改完成后调用model.summary()查看第一层输入形状,显示为(None, 你设置的time_steps值, 40)即为配置正确,不会再触发该形状不匹配报错。
内容的提问来源于stack exchange,提问作者Anni
相关产品推荐
相关产品推荐

