构建LSTM文本生成模型时出现张量形状不一致报错该如何解决?
问题根因
报错是因为两个核心配置问题:
- 你的
TextVectorization层没有配置output_sequence_length参数,每条歌词经过分词+2gram处理后输出的整数序列长度和原文本长度正相关,不同样本长度完全不一致,直接调用普通.batch()方法无法将不同形状的张量拼接成批次 - 你的模型输入层固定了shape为
(max_len,),如果输入序列长度和max_len不匹配,即使解决了批次拼接问题后续也会报错
修复方案
有两个可行方案,优先选第一个更简便:
方案1:固定TextVectorization输出长度
直接给TextVectorization层加上output_sequence_length=max_len参数,所有样本向量化后会自动截断/填充到统一的64长度,后续用普通batch就可以正常运行。
修改后的vectorize_layer定义如下:
max_len = 64 # 要和你模型输入的max_len参数保持一致 vectorize_layer = tf.keras.layers.TextVectorization( max_tokens=max_features, split="whitespace", ngrams=2, output_mode="int", output_sequence_length=max_len, # 新增这行配置 )
这个方法的好处是数据集输出的形状固定,和你现在模型的输入层shape=(max_len,)完全匹配,不需要修改其他数据处理逻辑。
方案2:用padded_batch动态填充批次
如果你不想固定全局序列长度,就把原来的.batch()调用换成.padded_batch(),每个批次内会自动把短样本填充到当前批次最长的长度:
train_ds = train_ds.shuffle(buffer_size=buffer_size)\ .padded_batch(batch_size=batch_size, drop_remainder=True, padding_values=0)\ # 把普通batch替换为padded_batch .cache()\ .prefetch(AUTOTUNE)
使用这个方案要同步修改模型输入层,支持动态长度输入,放开你注释的输入定义即可:
inputs_tokens = Input(shape = (None,), dtype=tf.int32)
额外注意点
- 检查你的标签生成逻辑:你当前
train_cat_ds_raw的element_spec显示shape为(64,),正常每个样本只对应1个标签,标签的shape应该是()或者(1,),你大概率是生成train_targets的时候不小心引入了批量维度 - 注意词汇表大小对齐:你用了ngram=2的配置,词汇表总量会比单字/单词的数量大很多,要保证vectorize_layer的max_tokens和模型里的vocab_size(当前是10000)一致,避免OOV的索引超出嵌入层的范围
内容的提问来源于stack exchange,提问作者savvysavage32
相关产品推荐
相关产品推荐

