Tensorflow 运行LSTM模型时出错,丢失:NaN值
我使用Keras和Tensorflow的LSTM模型给出了Tensorflow 运行LSTM模型时出错,丢失:NaN值,tensorflow,machine-learning,keras,neural-network,lstm,Tensorflow,Machine Learning,Keras,Neural Network,Lstm,我使用Keras和Tensorflow的LSTM模型给出了损失:nan值 我曾尝试降低学习率,但仍然得到nan并降低总体准确度,并且还使用了np.any(np.isnan(x_train))检查我可能介绍自己的nan值(未发现nan)。我也读过关于爆炸梯度的文章,似乎找不到任何东西可以帮助我解决这个问题 我想我知道问题可能在哪里,但不太确定。这是我构建x\u列车的过程 例如: a = [[1,0,..0], [0,1,..0], [0,0,..1]] a.shape() # (3, 20) b
损失:nan
值
我曾尝试降低学习率,但仍然得到nan并降低总体准确度,并且还使用了np.any(np.isnan(x_train))
检查我可能介绍自己的nan值(未发现nan)。我也读过关于爆炸梯度的文章,似乎找不到任何东西可以帮助我解决这个问题
我想我知道问题可能在哪里,但不太确定。这是我构建x\u列车的过程
例如:
a = [[1,0,..0], [0,1,..0], [0,0,..1]]
a.shape() # (3, 20)
b = [[0,0,..1], [0,1,..0], [1,0,..0], [0,1,..0]]
b.shape() # (4, 20)
为了确保形状相同,我将向量[0,0,…0]
(全部为零)附加到a
,因此形状现在是(4,20)
a
和b
被附加以给出三维阵列形状(2,4,20)
,这形成了x\u序列
。但我认为在训练我的模型时,添加0的空向量出于某种原因给了我一个损失:nan
。这就是我可能出错的地方吗
n、 b.a+b
是一个numpy数组,而我的实际x\u列。形状是(12281452,20)
•编辑•model.summary()
添加如下:
x_train shape: (1228, 1452, 20)
y_train shape: (1228, 1452, 8)
x_val shape: (223, 1452, 20)
x_val shape: (223, 1452, 8)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
unified_lstm (UnifiedLSTM) (None, 1452, 128) 76288
_________________________________________________________________
batch_normalization_v2 (Batc (None, 1452, 128) 512
_________________________________________________________________
unified_lstm_1 (UnifiedLSTM) (None, 1452, 128) 131584
_________________________________________________________________
batch_normalization_v2_1 (Ba (None, 1452, 128) 512
_________________________________________________________________
dense (Dense) (None, 1452, 32) 4128
_________________________________________________________________
dense_1 (Dense) (None, 1452, 8) 264
=================================================================
Total params: 213,288
Trainable params: 212,776
Non-trainable params: 512
nan的截图如下:
我建议您检查以下各项:-
批处理归一化层的输出。有一次,我遇到了一个类似的问题,损失是“南”。当我检查规范化输出时,它都是零。也许,这就是为什么失去了“南”
NAN的可能原因可能是学习率太高。试着减少它的位并检查输出
如果您使用的是RMSProp,请尝试Adam
由于您的densite_1
层的形状为(None,8),我假设您正在处理某种分类问题。因为,我们在这里使用日志丢失,有时,
精度误差也起作用。如果使用float16,请将精度更改为float32
应该使用虚拟特征,而不是填充所有零向量。也就是说,您的一个热门特征向量将大小增加到(21,)
,例如,大小为21的[0,0,0,…,1]
,最后一个维度用于虚拟填充
我还建议您使用基于索引的输入,而不是显式的一个热向量,其中每个热向量都可以被其1的索引替换,例如,[0,0,1,…,0]
变为2。Keras通过其嵌入层支持这种基于索引的输入样式。这将更易于使用,计算效率也更高。解决方案是使用掩蔽()
KERA中可用的掩蔽值=0的层。这是因为当使用空向量时,通过使用keras概述的Masking()
,它们被计算到损失中,填充向量被跳过且不包括在内
根据keras文件:
“如果给定采样时间步的所有特征都等于mask_值,则采样时间步将在所有下游层中被屏蔽(跳过)(只要它们支持屏蔽)”这似乎是一个分解渐变的问题。可以尝试在密集层之间添加一些衰减层。另外,尝试使用RMS道具优化器。我会尝试这个。但这是否也意味着我的标签向量将变为(9,)而不是(8,),因为它们也被填充,并且虚拟功能将需要一个类标签?更新:我尝试了这一点,并使用了(21,)和(9,)仍然得到nan值。这意味着代码得到nan的原因不止一个。根据你问题中的信息,我看不出来。您应该添加一个小的独立代码来重现问题。