我使用Keras和Tensorflow的LSTM模型给出了loss: nan
值。
我曾尝试降低学习率,但仍然得到nan并降低了整体准确性,并且还使用np.any(np.isnan(x_train))
来检查我可能会自我介绍的nan值(未找到nan)。我还阅读了有关爆炸梯度的文章,似乎找不到任何有助于解决我的特定问题的方法。
我认为我对问题可能出在哪里但不太确定。这是我用来构建x_train
的过程
例如:
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
以给出3D阵列形状(2,4,20)
,其形式为x_train
。但是我认为,由于某些原因,追加0的空向量是在训练模型时给了我loss: nan
的原因。这是我可能会出问题的地方吗?
n.b。 a+b
是一个numpy数组,而我实际的x_train.shape
是(1228, 1452, 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
答案 0 :(得分:0)
我建议您检查以下内容:-
dense_1
层的形状为(None,8),因此我假设您正在处理某种分类问题。因为我们有时在这里使用对数丢失
精度误差也起作用。如果使用的是float16,则将精度更改为float32。答案 1 :(得分:0)
您应该使用虚拟功能,而不是填充所有零向量。也就是说,您的热门特征向量会将尺寸增加到(21,)
,例如,尺寸为21的[0, 0, 0, ..., 1]
,最后一个尺寸用于虚拟填充。
我还建议您使用基于索引的输入,而不要使用显式的一热向量,其中每个一热向量都可以用其1的索引代替,例如[0, 0, 1, ..., 0]
变为2。Keras支持基于索引的输入样式及其嵌入层。这将更易于使用并且计算效率更高。
答案 2 :(得分:0)
解决方案是在Masking()
中使用在keras中可用的mask_value=0
层。这是因为使用空向量时,如keras所述,通过使用Masking()
将它们计入损失,填充向量被跳过而不包括在内。
根据keras文档:
'如果给定样本时间步长的所有特征都等于mask_value,则样本时间步长将在所有下游层中被掩蔽(跳过)(只要它们支持掩蔽)'