You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras搭建LSTM模型调用fit()时输入形状不兼容报错求解

报错原因

报错本质是模型期望的输入形状和实际喂入的数据形状不匹配,你的代码里有两个核心错误:

  1. input_shape参数传值错误:Keras模型的input_shape只需要传入单条样本的特征维度,不需要包含样本总数维度。你写的input_shape = (X_train.shape[0], X_train.shape[1])把训练集样本总数(也就是报错里的6557)当成了时间步长度传给了LSTM层,导致模型第一层期望输入形状为(None, 6557, 40)。
  2. 输入数据维度不符合LSTM要求:LSTM层要求输入为3维格式(样本数, 时间步长, 单帧特征数),你从CSV加载的特征是2维格式(样本数, 40),缺少了时间步维度,喂入模型时实际形状只有(None, 40),和模型期望形状完全不匹配。
修复方案

按以下步骤修改代码即可解决问题:

  • 第一步:恢复特征的时序维度
    你将音频特征存入CSV时,大概率把原本形状为(时间步长, 40)的单音频时序特征展平成了一维数组,加载后需要先reshape回LSTM需要的3维结构。将代码中time_steps替换为你提取音频特征时单条音频对应的帧长度(比如常用的MFCC特征单音频取130帧),对训练集、验证集、测试集做统一维度转换:
    # 替换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)
    
    如果你的音频时长不统一,需要先对特征做padding补零到相同时间步长度,再执行reshape操作。
  • 第二步:修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:22:04