【问题标题】:Neural network for adding two integer numbers用于添加两个整数的神经网络
【发布时间】:2020-08-13 06:56:15
【问题描述】:

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

question 我的准确率真的很低,只有 0.002%。我该怎么做才能增加它?

  1. 用于创建数据:

    将 numpy 导入为 np 随机导入 一个=[] b=[] c=[]

    对于范围内的 i (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)

  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 

这是我的控制台输出代码..

我已经尝试了优化器、损失和激活的各种不同组合,而且这些数据完全符合线性回归。

【问题讨论】:

    标签: python machine-learning keras neural-network


    【解决方案1】:

    两个错误,几个问题。

    错误:

    • 这是一个回归问题,所以最后一层的激活应该是linear,而不是relu(不指定任何内容也可以,因为linear是Keras层中的default激活) .
    • 准确度为meaningless in regression;从您的模型编译中删除 metrics=['acc'] - 您应该仅根据损失来判断模型的性能。

    问题:

    • 我们不为中间层使用sigmoid 激活;将它们全部更改为relu
    • 删除kernel_initializer 参数,留下default glorot_uniform,这是推荐的。
    • 多个密集层,每个只有两个节点不是一个好主意;尝试减少层数并增加节点数。有关虹膜数据的简单示例网络,请参阅 here

    【讨论】:

    • 非常感谢。你对我来说不仅仅是老师。我删除了 weightinit 并使用了线性激活 reuces 层,现在我有了准确的预测和非常低的损失,但无论我有很好的预测,准确率仍然是 0.002。
    • 请注意我在回答中所说的:准确度在回归中是没有意义的,你应该使用它。性能评估应完全根据预测的损失和质量进行。
    • 是的!谢谢我明白了
    【解决方案2】:

    您正在尝试拟合线性函数,但在内部使用 sigmoid 节点,它将值映射到范围 (0,1)。 Sigmoid 对分类非常有用,但如果值在 (0,1) 之外,则对回归没有真正意义。如果您将随机数限制为区间 [0,1] 中的浮点数,它可能会起作用。或者将所有位分别输入到您的节点中,并让它学习一个加法器。

    【讨论】:

    • 这就是我预处理数据的原因。从 0-1 转换的值所以我在上面的例子中的整个数据集是 (0,1) 值
    • 之前的值已经标准化; sigmoid 确实从未在实践中用于中间层,但不是因为你在这里暗示的原因。
    • @NanduRaj en.wikipedia.org/wiki/Rectifier_(neural_networks) 我不得不承认我对神经网络没有太多经验,所以我想我的知识可能有点过时了。根据 wikipedia,自 2011 年以来,relu 在中间层中优于 sigmoid。列出了一些优点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-05-11
    • 2020-09-29
    • 2018-01-25
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多