gpt4 book ai didi

python - 无法训练 keras 模型来逼近简单函数

转载 作者:行者123 更新时间:2023-11-30 09:06:36 24 4
gpt4 key购买 nike

我刚刚开始学习机器学习,我尝试编写一个简单的程序,其中神经网络将学习简单的函数 y = f(x) = 2x。

代码如下:

#x is a 1D array of 1 to 1000
x = np.arange(1,1000, 1)
y = x*2

xtrain = x[:750]
ytrain = y[:750]
xtest = x[750:]
ytest = y[750:]

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Conv2D

model = Sequential()

model.add(Dense(128, input_dim=1, activation='relu'))

model.add(Dense(1, activation='relu'))

model.compile(loss='mean_squared_error',
optimizer='sgd',
metrics=['accuracy'])

model.summary()

history = model.fit(xtrain, ytrain,
batch_size=100,
epochs=20,
verbose=1,
validation_split=0.2)

无论我如何更改架构或超参数,我都会得到以下输出:

79999/79999 [==============================] - 1s 13us/step - loss: 8533120007.8465 - acc: 0.0000e+00 - val_loss: 32532613324.8000 - val_acc: 0.0000e+00

准确率始终为 0。我做错了什么?

最佳答案

如果您盲目运行并期望梯度下降方法学习任何函数,这实际上就是您所期望的。您观察到的行为有两个原因:

  1. SGD 用于更新权重的导数实际上取决于输入。举一个非常简单的案例y = f(wx + b)y 的导数关于wf'(wx + b)*x使用链式法则。因此,当输入的更新非常大/未标准化时,它就会爆炸。现在更新基本都是w' = w - alpha*gradient ,所以权重突然变得很小,实际上是负数。
  2. 单次梯度更新后,输出变为负数,因为 SGD 刚刚过冲。既然你又拥有relu在最后一层,只输出 0 并且训练停止,因为当输出是 relu 的负导数时是 0。

您可以将数据大小减少到 np.arange(1, 10)并将隐藏神经元的数量减少到 12 个(更多的神经元在单次更新后使输出变得更加负,因为它们的所有权重也变为负),您将能够训练网络。

关于python - 无法训练 keras 模型来逼近简单函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50787555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com