【问题标题】:Loss while training on bigger array becomes inf and then nan(Tensorflow)在更大的阵列上训练时的损失变为 inf 然后变为 nan(Tensorflow)
【发布时间】:2021-02-03 03:47:04
【问题描述】:

这可能是有史以来最简单的模型,我写这个是为了在几天后参加的网络研讨会上演示

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,它会起作用。但随后因上述任何事情而失败。

我认为这与学习率有关,但我可能是错的......请告诉我这是如何工作的以及解决方案。

【问题讨论】:

    标签: python numpy tensorflow machine-learning keras


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,这是为了学习率。只需将学习率设置为 0.001 即可:

      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 在梯度计算中使用2 * |y - pred|,因此优化器在每次迭代中将采取的步骤非常大并且会发散。因此,通过将其乘以较小的数字(0.001 而不是 0.01),我们将帮助它具有更小的步长并收敛。

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 1970-01-01
        • 2017-07-08
        • 2021-06-14
        • 1970-01-01
        • 2021-01-12
        • 2017-10-12
        • 2022-10-12
        • 2018-03-30
        相关资源
        最近更新 更多