在较大数组上训练时的损失变为inf,然后变为nan(Tensorflow)

时间:2020-10-20 10:16:59

标签: python numpy tensorflow machine-learning keras

这可能是有史以来最简单的模型,我写这是为了在网络研讨会上演示我将在几天之内完成

import numpy as np
from tensorflow import keras
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')


num = []
sqr = []
for i in range(20):
  num.append(i)
  sqr.append(i*i)
  print(num[i], sqr[i])

def model():
    xs = np.array(num, dtype=float)
    ys = np.array(sqr, dtype=float)
    global model
    model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
    model.compile(optimizer='sgd', loss='mean_squared_error')
    model.fit(xs, ys, epochs=500)


model()

print(model.predict([10]))

如您所见,预测一个数字的平方只是一个NN。但这会给inf然后是nan作为损失

1/1 [==============================] - 0s 2ms/step - loss: nan
Epoch 499/500
1/1 [==============================] - 0s 5ms/step - loss: nan
Epoch 500/500
1/1 [==============================] - 0s 1ms/step - loss: nan

预测给出[[nan]]

如果我将20减小到7或8,则可以使用。但随后失败并失败。

我认为这与学习率有关,但是我可能会错...请向我介绍这的工作原理和解决方案。

2 个答案:

答案 0 :(得分:0)

是的,这是针对学习率的。只需将学习率设置为0.001,就可以了:

G'

或者您可以将损失函数更改为import numpy as np from tensorflow import keras model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])]) model.compile(optimizer='sgd', loss='mean_squared_error') num = [] sqr = [] for i in range(20): num.append(i) sqr.append(i*i) print(num[i], sqr[i]) def model(): xs = np.array(num, dtype=float) ys = np.array(sqr, dtype=float) global model model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])]) opt = keras.optimizers.SGD(learning_rate = 0.001) model.compile(optimizer = opt, loss='mean_squared_error') model.fit(xs, ys, epochs=500) model() print(model.predict([10])) 或使用其他优化器。

原因:您的数量很大,并且mean_absolute_error在梯度计算中使用mean_squared_error,因此优化程序在每次迭代中将采取的步骤非常大并且会有所不同。因此,通过将其乘以较小的数字(0.001而不是0.01),可以帮助它减小步长并收敛。

答案 1 :(得分:0)

当溢出或被零除时,会出现这种错误。 标准化您的输入数据,并尝试降低学习率。