如何教Keras神经网络求解平方根

我正在学习Python和Keras的机器学习。我创建了一个神经网络来预测从{1, 4, 9, 16, 25, 36, …, 100}范围内的偶数整数的平方根。我已经编写了代码来实现这一点,但结果与真实值相差甚远(无论我提供给网络什么数字,它都预测结果为1.0)。

我尝试过更改层数、每层的节点数、激活函数,但都没有帮助。

以下是我目前编写的代码:

from numpy import loadtxtfrom keras.models import Sequentialfrom keras.layers import Densefrom keras import optimizers# laod dataset# dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')dataset = loadtxt('sqrt.csv', delimiter=',')# split into input (X) and output (y) variablesX = dataset[:,0:1] * 1.0y = dataset[:,1] * 1.0# define the keras modelmodel = Sequential()model.add(Dense(6, input_dim=1, activation='relu'))model.add(Dense(1, activation='linear'))# compile the keras modelopt = optimizers.adam(lr=0.01)model.compile(loss='mean_squared_error', optimizer=opt, metrics=['accuracy'])# fit the keras model on the dataset (CPU)model.fit(X, y, epochs=150, batch_size=10, verbose=0)# evaluate the keras model_, accuracy = model.evaluate(X, y, verbose=0)print('Accuracy: %.2f' % (accuracy*100))# make class predictions with the modelpredicitions = model.predict_classes(X)# summarize the first 10 casesfor i in range(10):    print('%s => %.2f (expected %.2f)' % (X[i].tolist(), predicitions[i], y[i]))

这是数据集:

1,14,29,316,425,536,649,764,881,9100,10

当我运行这个网络时,得到以下结果:

[1.0] => 0.00 (expected 1.00)[4.0] => 0.00 (expected 2.00)[9.0] => 1.00 (expected 3.00)[16.0] => 1.00 (expected 4.00)[25.0] => 1.00 (expected 5.00)[36.0] => 1.00 (expected 6.00)[49.0] => 1.00 (expected 7.00)[64.0] => 1.00 (expected 8.00)[81.0] => 1.00 (expected 9.00)[100.0] => 1.00 (expected 10.00)

我做错了什么?


回答:

这是一个回归问题。因此,你应该使用model.predict()而不是model.predict_classes()

数据集也不够大。然而,你可以使用以下代码获得一些合理的结果。

from numpy import loadtxtfrom keras.models import Sequentialfrom keras.layers import Densefrom keras import optimizers# laod dataset# dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')dataset = loadtxt('sqrt.csv', delimiter=',')# split into input (X) and output (y) variablesX = dataset[:,0:1] * 1.0y = dataset[:,1] * 1.0# define the keras modelmodel = Sequential()model.add(Dense(6, input_dim=1, activation='relu'))model.add(Dense(10, activation='relu'))model.add(Dense(1))# compile the keras modelopt = optimizers.adam(lr=0.001)model.compile(loss='mean_squared_error', optimizer=opt)# fit the keras model on the dataset (CPU)model.fit(X, y, epochs=1500, batch_size=10, verbose=0)# evaluate the keras model_, accuracy = model.evaluate(X, y, verbose=0)print('Accuracy: %.2f' % (accuracy*100))# make class predictions with the modelpredicitions = model.predict(X)# summarize the first 10 casesfor i in range(10):    print('%s => %.2f (expected %.2f)' % (X[i].tolist(), predicitions[i], y[i]))

输出:

[1.0] => 1.00 (expected 1.00)[4.0] => 2.00 (expected 2.00)[9.0] => 3.32 (expected 3.00)[16.0] => 3.89 (expected 4.00)[25.0] => 4.61 (expected 5.00)[36.0] => 5.49 (expected 6.00)[49.0] => 6.52 (expected 7.00)[64.0] => 7.72 (expected 8.00)[81.0] => 9.07 (expected 9.00)[100.0] => 10.58 (expected 10.00)

编辑:

正如评论中[@***]指出的那样,度量标准accuracy在回归任务中没有意义。因此,通常使用自定义的R_squared值(又称决定系数)作为度量标准。R_squared值表示回归模型的拟合优度。以下是计算R_squared的代码。

def r_squared(y_true, y_pred):    from keras import backend as K    SS_res =  K.sum(K.square(y_true - y_pred))     SS_tot = K.sum(K.square(y_true - K.mean(y_true)))     return ( 1 - SS_res/(SS_tot + K.epsilon()) )

现在,你可以使用以下代码编译模型:

model.compile(loss='mean_squared_error', optimizer=opt, metrics=[r_squared])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注