如果提供的值超过 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)]

不知道为什么会这样。有什么线索吗?

库版本:

好像我在前面的评论中说的那样,它必须与爆炸梯度一起使用。只需更改优化器即可解决:

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')
    ...