为什么我的神经网络不能学习如何预测自然数的平方?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 预言
2021-09-17 00:32:35

我希望我的神经网络学会预测正方形n+1数有n数字。我正在考虑回归问题。这就是我正在做的事情:

from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding, Dropout
import numpy as np

x = np.array([[int(i)] for i in range(1001)])
y = np.array([x*x for x in range(1001)])

model = Sequential()
model.add(Dense(100, activation = 'relu', input_dim = 1))
model.add(Dense(50, activation = 'relu'))
model.add(Dense(10, activation = 'relu'))
model.add(Dense(1))

model.compile(loss='mse',optimizer='adam', metrics=['mae'])
model.fit(x,y,epochs= 2500)
pred = model.predict([1001])
print(pred)

[[ 1000166.8125]] 但是,结果,我得到了1002001.

更新:

x = np.array([[int(i)] for i in range(80001)])
y = np.array([x*x for x in range(80001)])
print(x)
print(y)
model = Sequential()
model.add(Dense(20, activation = 'relu', input_dim = 1))
model.add(Dense(20, activation = 'relu'))
model.add(Dense(1))

adam = optimizers.Adam(lr=0.0002,beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False,)
model.compile(loss='mse',optimizer=adam, metrics=['mae'])
model.fit(x,y,epochs= 3000)
pred = model.predict([80001])
print(pred)
model.save_weights("test.h5")
model_json = model.to_json()
json_file = open("test.json", "w")
json_file.write(model_json)
json_file.close()

结果:[[ 4.81360333e+09]]

3个回答

减少隐藏层的数量;你可以省略密集层50神经元。此外,更多地训练你的网络。您还应该提供更多数据。目前并不多。

对于这样一个相对简单的任务,您当前的架构非常深入。因此,它需要更多的火车时间。您可以通过减少隐藏层和神经元的数量来减小当前模型的大小。例如,使用以下设置来查看如何快速训练并获得良好的准确性。

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

因为具有足够大隐藏层的神经网络只能在紧凑集上逼近任意函数(这是您尝试阅读有关神经网络的一些文献时首先可以学到的东西之一)。在 0 到 100 的范围内训练你的神经网络,然后求 78 的平方。

学习乘法算法的更有趣的问题是称为算法学习的活跃研究领域的一部分,例如查看本文

就其本质而言,神经网络仅用于逼近一个给定的函数。因此,它适用于不需要非常精确的信息来执行的任务,例如识别图片,您不需要实际了解图片的每个细节。但是,在您的情况下,您真的想知道特定函数 F的确切值(此处为 n-> n^2)。因此,通常您不能这样做,除非您的 NN 本身(或带有参数)已经包含函数 F。例如,通常 NN 使用非常超越函数作为 tanh,我看不出如何为您生成多项式。