我正在学习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])