Keras模型损失函数返回nan

时间:2020-03-19 16:37:41

标签: python tensorflow keras

我正在训练像这样定义的keras中的自动编码器:

model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(430, 3)))
model.add(RepeatVector(430))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(3)))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
print(model.summary())

context_paths = loadFile()
X_train, X_test = train_test_split(context_paths, test_size=0.20)

print('Fitting model.')
history = model.fit(X_train, X_train, epochs=1, batch_size=8, verbose=1, shuffle=True, validation_data=(X_test, X_test))

predict_sample = X_train[0].reshape((1, 430, 3))

predict_output = model.predict(predict_sample, verbose=0)
print(predict_output[0, :, 0])

这段代码没有给出任何错误,但是当我运行它时,损失是微不足道的。我检查了SO的一些问题,发现在以下情况下会发生此问题:

    存在
  • nan或无限值->我用numpy.isnan(myarray).any()检查了输入数据,该数据返回了False,所以我也做了numpy.isfinite(myarray).any()并返回了True,所以我认为我的数据没问题
  • 批次大小太大->我从32减少到8,并没有太大帮助
  • 图层大小太大->我从100减少到24,没什么帮助

以下是前几批的图片: enter image description here

这里的损失是巨大的,但我不确定是什么原因造成的。我的数据集中的数字范围已达到int32的限制。另外我的数据用0填充。

1 个答案:

答案 0 :(得分:2)

您显然拥有大量的范围数据。正如您自己在范围内观察到的那样,您无所不在:

我的数据集中的数字范围已达到int32的限制

在模型中使用数据之前将其标准化。

对无穷大的正确验证应为:

numpy.isfinite(myarray).all()

您可以尝试在0到1范围内进行转换(需要先转换为浮动):

xMax = x_train.max()
xMin = x_train.min()
xRange = xMax - xMin

x_train = (x_train - xMin) / xRange
x_test = (x_test - xMin) / xRange

对y进行相同的操作。

您也可以尝试Z转换:

xMean = x_train.mean()
xStd = x_train.std()

x_train = (x_train - xMean) / xStd
x_test = (x_test - xMean) / xStd