如果提供的值超过 18 个,Keras 将无法拟合线性函数
Keras doesn't fit linear function if more than 18 values provided
我对 Tensorflow 和 Keras 还很陌生。我正在研究一个简单的示例,发现一些奇怪的东西让我感到困惑。
这是用于生成和训练模型的函数。它以 n 作为参数并生成 y 值作为简单的一行:y=50+50x 使用 n 个示例 (0,1,2,...,n-1)
def real_value(rooms):
return 50+50*rooms
def get_model(n):
global xs, ys
model = keras.Sequential([keras.layers.Dense(units = 1, input_shape = [1], use_bias=True)])
model.compile(optimizer = 'sgd', loss = 'mean_squared_error')
xs = np.arange(0,n, dtype=float)
ys = np.array(list(map(real_value,xs)), dtype=float)
print("fitting...")
model.fit(xs, ys, epochs=5000, verbose=0)
return model
如果我用 2 到 18 之间的值调用它一切正常(第一列是 X,第二列是 Y,第三列是预测值):
model = get_model(15)
list(zip(xs, ys, model.predict(xs)[:,0]))
[(0.0, 50.0, 49.99964),
(1.0, 100.0, 99.99968),
(2.0, 150.0, 149.99973),
...
(12.0, 650.0, 650.0001),
(13.0, 700.0, 700.0001),
(14.0, 750.0, 750.0002)]
但是一旦我使用超过 18 个项目来训练模型,它 returns NaN:
model = get_model(19)
list(zip(xs, ys, model.predict(xs)[:,0]))
[(0.0, 50.0, nan),
(1.0, 100.0, nan),
(2.0, 150.0, nan),
(3.0, 200.0, nan),
...
(16.0, 850.0, nan),
(17.0, 900.0, nan),
(18.0, 950.0, nan)]
不知道为什么会这样。有什么线索吗?
库版本:
- 张量流:2.2.0
- numpy: 1.19.0
- tf.keras: 2.3.0-tf
好像我在前面的评论中说的那样,它必须与爆炸梯度一起使用。只需更改优化器即可解决:
from tensorflow.keras.optimizers import SGD
def get_model(n):
...
opt = SGD(clipnorm=3000.0, clipvalue=5)
model.compile(optimizer = opt, loss = 'mean_squared_error')
...
我对 Tensorflow 和 Keras 还很陌生。我正在研究一个简单的示例,发现一些奇怪的东西让我感到困惑。
这是用于生成和训练模型的函数。它以 n 作为参数并生成 y 值作为简单的一行:y=50+50x 使用 n 个示例 (0,1,2,...,n-1)
def real_value(rooms):
return 50+50*rooms
def get_model(n):
global xs, ys
model = keras.Sequential([keras.layers.Dense(units = 1, input_shape = [1], use_bias=True)])
model.compile(optimizer = 'sgd', loss = 'mean_squared_error')
xs = np.arange(0,n, dtype=float)
ys = np.array(list(map(real_value,xs)), dtype=float)
print("fitting...")
model.fit(xs, ys, epochs=5000, verbose=0)
return model
如果我用 2 到 18 之间的值调用它一切正常(第一列是 X,第二列是 Y,第三列是预测值):
model = get_model(15)
list(zip(xs, ys, model.predict(xs)[:,0]))
[(0.0, 50.0, 49.99964),
(1.0, 100.0, 99.99968),
(2.0, 150.0, 149.99973),
...
(12.0, 650.0, 650.0001),
(13.0, 700.0, 700.0001),
(14.0, 750.0, 750.0002)]
但是一旦我使用超过 18 个项目来训练模型,它 returns NaN:
model = get_model(19)
list(zip(xs, ys, model.predict(xs)[:,0]))
[(0.0, 50.0, nan),
(1.0, 100.0, nan),
(2.0, 150.0, nan),
(3.0, 200.0, nan),
...
(16.0, 850.0, nan),
(17.0, 900.0, nan),
(18.0, 950.0, nan)]
不知道为什么会这样。有什么线索吗?
库版本:
- 张量流:2.2.0
- numpy: 1.19.0
- tf.keras: 2.3.0-tf
好像我在前面的评论中说的那样,它必须与爆炸梯度一起使用。只需更改优化器即可解决:
from tensorflow.keras.optimizers import SGD
def get_model(n):
...
opt = SGD(clipnorm=3000.0, clipvalue=5)
model.compile(optimizer = opt, loss = 'mean_squared_error')
...