这可能是有史以来最简单的模型,我写这是为了在网络研讨会上演示我将在几天之内完成
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,则可以使用。但随后失败并失败。
我认为这与学习率有关,但是我可能会错...请向我介绍这的工作原理和解决方案。
答案 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)
当溢出或被零除时,会出现这种错误。 标准化您的输入数据,并尝试降低学习率。