我想创建一个可以将两个整数相加的神经网络。我设计如下:
问题 我的准确率非常低,只有0.002%。我该做些什么来提高它?
-
创建数据:
import numpy as npimport randoma=[]b=[]c=[]
for i in range(1, 1001):a.append(random.randint(1,999))b.append(random.randint(1,999))c.append(a[i-1] + b[i-1])
X = np.array([a,b]).transpose()y = np.array(c).transpose().reshape(-1, 1)
-
缩放数据:
from sklearn.preprocessing import MinMaxScalerminmax = MinMaxScaler()minmax2 = MinMaxScaler()X = minmax.fit_transform(X)y = minmax2.fit_transform(y)
- 神经网络:
from keras import Sequentialfrom keras.layers import Densefrom keras.optimizers import SGDclfa = Sequential()clfa.add(Dense(input_dim=2, output_dim=2, activation='sigmoid', kernel_initializer='he_uniform'))clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))clfa.add(Dense(output_dim=1, activation='relu'))opt = SGD(lr=0.01)clfa.compile(opt, loss='mean_squared_error', metrics=['acc'])clfa.fit(X, y, epochs=140)
输出:
Epoch 133/1401000/1000 [==============================] - 0s 39us/step - loss: 0.0012 - acc: 0.0020Epoch 134/1401000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020 Epoch 135/1401000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020Epoch 136/1401000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020Epoch 137/1401000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020Epoch 138/1401000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020 Epoch 139/1401000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020 Epoch 140/1401000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020
这是我的代码和控制台输出..
我已经尝试了各种不同的优化器、损失函数和激活函数的组合,而且这些数据非常适合线性回归模型。
回答:
有两个错误,还有几个问题。
错误之处:
- 这是一个回归问题,因此最后一层的激活函数应该是
linear
,而不是relu
(如果不指定任何激活函数会自动使用linear
,因为linear
是Keras层中的默认激活函数)。 - 在回归问题中,准确率是没有意义的;从模型编译中移除
metrics=['acc']
– 你应该仅用损失函数来评估模型的性能。
问题之处: