基于LSTM的单词输入单行诗歌生成:输入处理与模型构建求助
问题分析与解决方案
1. 维度不兼容错误的直接修复
报错里的形状不匹配是因为模型输出多了一个维度((None,1,16)),而标签Y是(None,16)。可以从两个方向处理:
- 调整标签Y的形状,增加一个维度:用
numpy.expand_dims(Y, axis=1)把Y转换成(样本数, 1, 序列长度)格式 - 调整模型输出,去掉多余维度:在模型最后加
Reshape((max_sequence_length-1,))层,或者检查LSTM/Transformer的return_sequences参数,确保输出维度和标签对齐
2. 输入处理逻辑的优化
当前输入处理有几个需要调整的点,才能适配10-12词诗歌生成的需求:
- 对齐序列长度:把
max_sequence_length设为12(输入1词+输出11词,总长度符合10-12词要求),替换当前可能设置的17(对应报错里的16) - 过滤有效数据:只保留2到12词的行,避免过短或过长的无效样本
- 补零与维度处理:补零逻辑保留,但最后要将数据转为numpy数组并调整Y的维度,匹配模型输出
优化后的输入处理代码:
import numpy as np max_sequence_length = 12 # 输入1词+输出11词,总长度符合需求 X = [] Y = [] for line in document: words = line.split() line_length = len(words) if 2 <= line_length <= max_sequence_length: # 只保留有效长度的诗句 input_idx = word_to_index.get(words[0], 0) output_idxs = [word_to_index.get(word, 0) for word in words[1:]] # 补零到11个元素(对应max_sequence_length-1) while len(output_idxs) < max_sequence_length - 1: output_idxs.append(0) X.append([input_idx]) Y.append(output_idxs) # 转换为数组并调整Y的维度 X = np.array(X) # 形状:(样本数, 1) Y = np.array(Y) # 形状:(样本数, 11) Y = np.expand_dims(Y, axis=1) # 调整为(样本数, 1, 11),解决维度不兼容
3. 适配诗歌生成的模型构建建议
推荐用序列到序列结构或带注意力的LSTM/Transformer模型,以下是基础LSTM模型示例:
from keras.models import Model from keras.layers import Input, Embedding, LSTM, Dense vocab_size = len(word_to_index) + 1 # 包含补零的0值 embedding_dim = 128 hidden_units = 256 # 输入层:接收单个单词 input_layer = Input(shape=(1,)) # Embedding层:mask_zero=True忽略补零位置,避免无效损失 embedding = Embedding(input_dim=vocab_size, output_dim=embedding_dim, mask_zero=True)(input_layer) # LSTM层:return_sequences=True返回完整序列,对应多词输出 lstm = LSTM(hidden_units, return_sequences=True)(embedding) # 输出层:每个位置输出词汇表概率 output_layer = Dense(vocab_size, activation='softmax')(lstm) model = Model(inputs=input_layer, outputs=output_layer) # 用sparse_categorical_crossentropy无需将Y转为one-hot,更高效 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
4. 额外优化建议
- 音节约束处理:如果要生成5-7-5格式的俳句,预处理时需加入音节统计过滤数据,训练时可加入音节预测辅助损失,生成时用带音节约束的beam search解码
- 数据质量:过滤数据集中的杂乱文本,只保留符合格式的诗歌,确保模型学习到正确的创作模式
- 生成策略:训练完成后,用beam search或top-k采样替代贪心解码,生成的诗歌会更流畅多样
内容的提问来源于stack exchange,提问作者Root
相关产品推荐
相关产品推荐

