10个输入和10个输出的神经元网络

时间:2017-09-13 09:52:08

标签: machine-learning neural-network keras regression

我遇到了物理问题:构建产品10根据10个输入参数(性能,温度,容量等)确定输出参数(宽度,长度,材料等)。输出参数显然取决于输入参数。但我不知道怎么做。例如,输出参数O1可以取决于输入参数I1,I2和I3。

我已经获得了30k产品及其输入/输出参数的数据。数据库如下所示:

----------------------------------------------
| Product| I1 | I2 | I3 | ... | O1 | O2 | 03 |
----------------------------------------------
| Prod A | 1.2| 2.3| 4.2| ... | 5.3| 6.2| 1.2|
----------------------------------------------
| Prod B | 2.3| 4.1| 1.2| ... | 8.2| 5.2| 5.0|
----------------------------------------------
| Prod C | 6.3| 3.7| 9.1| ... | 3.1| 4.1| 7.7|
----------------------------------------------
| ...    |                                   |
----------------------------------------------

所以我需要做的是根据输入参数I 1 - I 10找到输出参数O 1 -O 10。

第一个问题:如果我做对了,这是一个回归问题,基于一些输入值我想找到一些输出值(在数据中某处有一个函数/公式确定正确的价值观)。这是对的吗?

我的想法是使用/训练神经网络(使用keras和tensorflow作为后端)

这样的神经网络怎么样?什么是最佳做法?

这是我到目前为止所做的: 输入层有10个输入,两个完全连接的深层有100个神经元,一个层有10个输出。在keras中,这看起来像这样:

def baseline_model(self, callback):
    model = Sequential()
    model.add(Dense(100, input_dim=10, activation="relu"))
    model.add(Dense(100, activation="relu"))
    model.add(Dense(10))

    model.compile(loss='mean_squared_error', optimizer='adam', metrics=["accuracy"])
    model.fit(input_train, output_train, batch_size=5, epochs=2000, verbose=2, callbacks=[callback], shuffle=True, validation_data=(input_val,output_val))

    scores = model.evaluate(input_val, output_val, verbose=1)
    print("Scores:",scores)

当然模型不能像预期的那样工作,这就是为什么我要求帮助......培训失败:

Epoch 1999/2000
7s - loss: 47634520366153.6016 - acc: 0.0000e+00 - val_loss: 9585392308285.4395 - val_acc: 0.0000e+00

有什么建议我应该改变吗?我想过使用" sigmoid"作为激活并将数据标准化为[0,1]。

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

  

如果我做对了,这是一个回归问题,基于一些我希望找到一些输出值的输入值

是的,我认为你是对的。

  

这样的神经网络怎么样?什么是最佳做法?

这是一个非常广泛的问题。我认为你应该将你的数据分成火车和验证集,从最简单的网络(可能没有隐藏层或只有一个隐藏层)开始,然后在你的验证错误减少时使它变得越来越复杂(添加更多层和隐藏单元)。当您的网络变得非常深时,最好在密集层之间添加批量标准化层。您还可以查看剩余连接,但不确定您是否真的需要它。

  

有什么建议我应该改变吗?我想过使用“sigmoid”作为激活并将数据标准化为[0,1]。

  • 激活功能类型取决于您的输出类型。对于分类输出,sigmoid / softmax可能是不错的选择,线性应该适用于浮点数。
  • 此外,如果您的某个输入是分类(例如,材料类型),可能最好将其拆分为多个二进制输入。
  • 将输入和输出标准化几乎总是好主意。非标准化数据可能真的伤害了培训过程。
  • 绘制错误并检查其在时间内的变化情况。 loss: 47634520366153.6016真的很大,但它告诉我们的不是优化。如果它减少可能你可以提高学习率。如果它增长尝试降低学习率或尝试另一种优化算法。
  • 检查渐变,如果太大,请尝试使用渐变剪裁。
  • 也尝试从简单的模型开始。也许来自线性回归。

强烈地说神经网络调试是一个庞大而复杂的领域,我不确定它是否适合stackoverflow讨论

PS抱歉我的英文

答案 1 :(得分:1)

正如@Dark_davier所说,这是一个需要一些经验的领域。没有真正做一些测试,真的无法回答。但是作为指导,请注意网络的大小。在你的网络中,你有大约(更多)10e4参数,你说你只有#34;只有#34; 30k观察。所以过度拟合的概率很高......所以你需要小心。您需要使用更复杂的技术来避免它(首先进行交叉验证以检查,然后可能进行正则化)。但这需要一些NN优化的经验......

相关问题