用于将两个整数相加的神经网络



我想创建一个可以添加两个整数的神经网络。我设计如下:

问题我的准确率很低,只有0.002%。我能做些什么来提高它?

  1. 用于创建数据:

    将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(

  2. 缩放我的数据:

from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
minmax2 = MinMaxScaler()
X = minmax.fit_transform(X)
y = minmax2.fit_transform(y)
  1. 网络:

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将所有位单独输入到节点中,并让它学习加法器。

最新更新