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

Keras搭建LSTM文本生成模型独热编码输入维度报错排查

问题根因
  • 你观察到的输入首位新增的None维度是Keras的正常运行机制,这个维度代表动态batch size,框架会在训练时自动适配传入的批次大小,不属于异常,不需要额外处理。
  • 触发维度不匹配报错的核心原因有两点:
    1. LSTM层的输入形状参数配置错误。Keras中LSTM层要求输入为3维结构,维度顺序为(批次大小, 序列长度, 特征数),而input_shape参数仅需要填写排除批次维度的后两个维度即可。你报错时手动传入的input_shape=(3129, 100, 1)把总样本量3129算入了单样本形状,还额外增加了值为1的冗余维度,框架自动补充batch维度后输入就变成了4维,和LSTM要求的3维输入冲突。
    2. 独热编码逻辑位置错误。你把np_utils.to_categorical(x_data)写在了构造序列的for循环内部,每次追加一个序列就对整个已收集的数据集做一次全量编码,不仅运行效率极低,循环过程中还会生成形状不稳定的中间数组,容易引发维度异常。
  • 额外逻辑错误:独热编码生成的向量取值只有0和1,你写的x_encoded= x_encoded/float(n_vocab)归一化操作没有实际意义,反而会破坏独热编码的特征分布,影响模型收敛。
  • 原有模型结构还有一处隐藏bug:第二层LSTM没有设置return_sequences=True,输出为2维张量,无法接入后续第三层LSTM(要求3维输入),修正输入形状后运行到这一层仍会报错。
修正方案
  1. 把独热编码逻辑移到for循环外部,等所有输入序列、输出标签全部收集完成后,先转成numpy数组再统一做编码,编码时显式指定num_classes参数避免类别数匹配错误。
  2. 删除多余的独热编码值除以词汇表大小的操作。
  3. LSTM层的input_shape直接取编码后输入数组的第1、2位维度即可,不要手动硬编码维度值,也不要额外增加冗余维度。
  4. 给第二层LSTM加上return_sequences=True参数,保证输出为序列格式,适配后续第三层LSTM的输入要求。
修正后的核心代码段
# 构造序列的循环内只做字符到整数的映射,不做编码
for i in range(0, n_chars - seq_length, 1):
    in_seq = raw_text[i:i + seq_length]
    out_seq = raw_text[i + seq_length]
    x_data.append([char_to_int[char] for char in in_seq])
    y_data.append(char_to_int[out_seq])

# 循环结束后统一做数组转换和独热编码
x_data = np.array(x_data)
x_encoded = np_utils.to_categorical(x_data, num_classes=n_vocab)
y = np_utils.to_categorical(y_data, num_classes=n_vocab)

n_patterns = len(x_encoded)
print ("Total Patterns:", n_patterns)
print(x_encoded.shape)

# 删除错误的归一化操作
# x_encoded= x_encoded/float(n_vocab)

# 定义模型
model = Sequential()
model.add(LSTM(256, input_shape=(x_encoded.shape[1], x_encoded.shape[2]), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(256, return_sequences=True)) # 中间层LSTM需返回序列以适配下一层LSTM输入
model.add(Dropout(0.2))
model.add(LSTM(128))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')

filepath = "model_weights_saved.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor="loss", verbose=1, save_best_only=True, mode="min")
desired_callbacks = [checkpoint]

model.fit(x_encoded, y, epochs=150, batch_size=256, callbacks=desired_callbacks)

内容的提问来源于stack exchange,提问作者Guillermo Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:18:26