TensorFlow 2.x编码器-解码器LSTM网络损失与输出均为NaN问题求解
问题修复方案
1 优先排查输入维度不匹配问题
你当前代码里Encoder第一层是Embedding层,该层的标准输入维度为(样本数, 序列长度)的二维整数张量,输出才是(样本数, 序列长度, 嵌入维度)的三维张量。但你fit时传入的输入是X_train[:, :10, :],说明你的X_train本身是三维结构,和Embedding层的输入要求完全不匹配,这是导致计算异常最可能的原因。
修复方式:调整X_train的维度到二维,或者修改第一层网络结构匹配输入维度。
2 修复归一化层的错误
你当前的min-max归一化层存在两个致命问题:
- 分母零值风险:
global_max - global_min如果为0(即训练集输入token全部相同),会直接产生除零错误输出inf,后续计算全部变为NaN - 应用位置错误:你统计的
global_min/global_max是原始输入token的统计值,却把归一化层加在Embedding层的输出(词嵌入向量)上,统计值和应用对象完全不匹配,且Embedding输出本身不需要做min-max归一化
修复方式:直接删除该min_max_layer,Embedding层输出不需要额外做此类归一化操作。
3 调整正则化与架构适配
- 当前你使用的
activity_regularizer系数0.1过大,容易压制LSTM的激活值到极端区间,引发数值不稳定,建议将L2系数调整到1e-4~1e-6区间,或者先去掉activity_regularizer验证损失是否恢复正常 - 你当前用Sequential搭建的seq2seq结构仅用RepeatVector传递编码器输出,没有把编码器的隐藏态、细胞态作为解码器的初始状态传入,标准seq2seq结构建议用函数式API搭建,传入解码器初始状态,避免长序列(尤其是后续要做的2400长度序列)的信息丢失问题
4 辅助排查项
- 检查X_train、y_train中是否存在预先存在的NaN、inf异常值
- 检查y_train的标签取值范围:所有标签必须落在
[0, len(codon_tokenizer.word_index)]区间内,若存在超出该范围的标签值,计算sparse_categorical_crossentropy时会触发越界错误,输出NaN - 验证样本量是否充足:如果训练样本量过少,L2正则化容易将模型参数拉到异常区间
内容的提问来源于stack exchange,提问作者YoYo
相关产品推荐
相关产品推荐

