我想创建一个可以添加两个整数的神经网络。我设计如下:
问题我的准确率很低,只有0.002%。我能做些什么来提高它?
-
用于创建数据:
将numpy导入为np导入随机a=[]b=[]c=[]
对于范围(11001(中的i:a.append(random.randint(1999((b.append(random.randint(1999((c.附加(a[i-1]+b[i-1](
X=np.array([a,b](.transpose((y=np.array(c(.transpose((.reform(-1,1(
-
缩放我的数据:
from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
minmax2 = MinMaxScaler()
X = minmax.fit_transform(X)
y = minmax2.fit_transform(y)
- 网络:
from keras import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
clfa = 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/140
1000/1000 [==============================] - 0s 39us/step - loss: 0.0012 - acc: 0.0020
Epoch 134/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020
Epoch 135/140
1000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020
Epoch 136/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020
Epoch 137/140
1000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020
Epoch 138/140
1000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020
Epoch 139/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020
Epoch 140/140
1000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020
这是我的控制台输出代码。。
我已经尝试了优化器、损失和激活的各种不同组合,加上这些数据完全符合线性回归。
两个错误,几个问题。
错误:
- 这是一个回归问题,所以最后一层的激活应该是
linear
,而不是relu
(不指定任何内容就可以了,因为linear
是Keras层中的默认激活( - 在回归中,准确性是没有意义的;从模型编译中删除
metrics=['acc']
——您应该只根据损失来判断模型的性能
问题:
- 我们不使用
sigmoid
激活作为中间层;将它们全部更改为CCD_ 6 - 删除
kernel_initializer
参数,从而保留默认的glorot_uniform
,这是推荐的参数 - 多个密集层(每个层只有两个节点(不是一个好主意;尝试减少层数并增加节点数。有关虹膜数据的简单网络示例,请参见此处
您试图拟合线性函数,但在内部使用sigmoid节点,该节点将值映射到范围(0,1(。Sigmoid对分类非常有用,但如果值在(0,1(之外,则不适用于回归。如果你把你的随机数限制在区间[0,1]的浮点,它可能会起作用。OR将所有位单独输入到节点中,并让它学习加法器。