2017-09-13 8 views
-1

私は物理的な問題があります:10の入力パラメータ(性能、温度、容量など)に基づいて10の出力パラメータ(幅、長さ、材料など)等..)。出力パラメータは、明らかに入力パラメータに依存します。しかし、私はどのように知りません。例えば、出力パラメータO1は、入力パラメータI1、I2およびI3に依存することができる。10の入力と10の出力のためのニューロンネットワーク

私は、30k製品の入力/出力パラメータを使ってletのデータを得ました。データベースは、次のようになります。

---------------------------------------------- 
| 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に基づいて、O 1-O 10 ouputをパラメータ見つけることです - I 10

最初の質問を:もし私は正しい結果を得ました。これは回帰問題です。いくつかの入力値に基づいて出力値を探したいのです(正しい値を決定する関数/定理のデータがあります)。これは正しいです?

私の考えはどのような神経ネットワークは次のようになり

(バックエンドとしてkerasとtensorflowを使用して)、神経ネットワークを訓練/使用するのですか?ベストプラクティスは何ですか?

入力層が10層、深層層が2層、ニューロン層が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) 

もちろんモデルはthatsの、期待と同じように動作しない理由を私は...トレーニングfailes助けを求めています:

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

任意の提案どのような私は変えるべきですか?私は "シグモイド"を活性化として使用し、データを[0,1]に正規化することを考えました。何かアドバイスのため

おかげで

答えて

2

私はそれが正しい、これは私はいくつかの出力値を検索するいくつかの入力値に基づいて、回帰問題で取得した場合

はい、私はあなたがいると思います右。

このようなニューロンネットワークはどのように見えますか?ベストプラクティスは何ですか?

非常に広い質問です。私はあなたのデータを列車とバリデーションのセットに分割し、最も単純なネットワーク(隠れたレイヤーでも1つの隠しレイヤーでもよい)から始めて、バリデーションエラーが減少する間にもっと複雑に(レイヤーと隠しユニットを追加する)ネットがかなり深くなると、密集したレイヤー間にバッチ正規化レイヤーを追加することをお勧めします。また、残っている接続を見ることもできますが、実際にこれが必要であるかどうかはわかりません。

私は何を変更すべきですか?私は活性化として「シグモイド」を使用し、データを[0,1]に正規化することを考えました。

  • アクティブ化機能の種類は、出力の種類によって異なります。カテゴリ出力の場合、sigmoid/softmaxはおそらく良い選択ですが、浮動小数点の場合は線形にする必要があります。
  • また、入力の1つがカテゴリ(材料タイプなど)である場合は、複数のバイナリ入力に分割する方がよいかもしれません。
  • ほとんどの場合、入力を正規化しての出力を入力することをお勧めします。正規化されていないデータは、トレーニングプロセスを傷つける可能性があります。
  • プロットエラーが発生し、時間の経過とともにどのように変化するかを確認します。 loss: 47634520366153.6016は本当に大きいですが、最適化についてあまり話しません。多分それが減少すれば学習率を上げることができます。成長したら、学習率を下げるか、別の最適化アルゴリズムを試してみてください。
  • グラデーションが大きすぎる場合は、グラデーションクリッピングを使用してください。
  • また、簡単なモデルから始めようとします。多分線形回帰からです。

が強く、神経neutworkのデバッグを言えば、大きくて複雑なフィールドであり、私は@Dark_davierはすでにこれは、言ったように、それは

PS私の英語のため申し訳ありません

1

stackoverflowの議論のための適切だということを確認していませんあなたはいくつかの経験が必要な分野です。実際にいくつかのテストをしなくても、本当に答えることはできません。しかし、ガイドラインとしてあなたのネットワークのサイズに注意してください。あなたのネットワークでは、10e4のパラメータの大まかな(もう少し)パラメータがあります。それで、過大適合の可能性が高いので、注意する必要があります。あなたはそれを避けるためにもっと洗練されたテクニックを使用する必要があります(最初に検証するクロスバリデーション、場合によっては正規化)。しかし、これにはNN最適化の経験が必要です。

関連する問題