2016-10-12 6 views
1

私は人工ニューラルネットワークを使って技術的プロセス(多数の非線形方程式)をモデル化しようとしています。この機能には、いくつかの入力と複数の出力があります(たとえば、50入力、150出力 - すべて浮動)。異なる人工ニューラルネットワークフレームワーク(ffnet、tensorflow)による結果のレプリケート

私はpython library ffnet(fortranライブラリのラッパー)を大いに成功させました。特定のデータセットのエラーは0.2%を大幅に下回ります。

完全に接続されたグラフとこれらの追加パラメータを使用しています。

Basic assumptions and limitations: 
    Network has feed-forward architecture. 
    Input units have identity activation function, all other units have sigmoid activation function. 
    Provided data are automatically normalized, both input and output, with a linear mapping to the range (0.15, 0.85). Each input and output is treated separately (i.e. linear map is unique for each input and output). 
    Function minimized during training is a sum of squared errors of each output for each training pattern. 

私は1つの入力層、1つの隠れ層を使用しています(サイズ:入力ベクトル+出力ベクトルの大きさの2/3)と出力層。私はscipy共役勾配オプティマイザを使用しています。

ffnetの欠点は、長いトレーニング時間とGPUを使用する機能がないことです。したがって、私は別のフレームワークに切り替えて、ケラをTensorFlowとバックエンドとして選択しました。

私は、以前の構成をモデル化しようとしています(!)

model = Sequential() 
model.add(Dense(n_hidden, input_dim=n_in)) 
model.add(BatchNormalization()) 
model.add(Dense(n_hidden)) 
model.add(Activation('sigmoid')) 
model.add(Dense(n_out)) 
model.add(Activation('sigmoid')) 
model.summary() 
model.compile(loss='mean_squared_error', 
       optimizer='Adamax', 
       metrics=['accuracy']) 

結果ははるかに悪いですが、エラーが訓練の数千エポックで0.5%までです。 ffnetトレーニングは292エポックで自動的にキャンセルされました。さらに、ネットワークレスポンスと検証ターゲットの違いは、0を中心にしていませんが、ほとんどが負です。 私はすべてのオプティマイザと異なる損失関数を試しました。また、BatchNormalizationをスキップして、ffnetと同じ方法で手動でデータを正規化しました。何も役立ちません。

ケラスでより良い結果を得るための提案はありますか?

+0

同じ最適化方法を使用していますか?あなたは 'keras'と' Adamax'を使っているようです。 –

+0

kerasには共役勾配オプティマイザが含まれておらず、Adamaxはこれまで最高の結果を出しています。 – JanM

+0

Adamaxのような従来のNNオプティマイザは、TensorFlowを使用して、scipyインターフェイス(https:// github)を使用してlBFGSオプティマイザをプラグインすることができます。com/tensorflow/tensorflow/issues/446 –

答えて

1

私は、別のライブラリを使用して、最初から同じアーキテクチャを再トレーニングしようとしていることを理解しています。ここで心に留めておくべき第一の基本的な問題は、ウェイトがランダムに初期化されるとき、ニューラルネットare not necessarily reproducibleです。

例えば、ここにDenseのデフォルトコンストラクタのパラメータがKerasである:

init='glorot_uniform' 

しかし、たとえKerasの最適化の収束を評価しようとする前に、私はポートにあなたが良い持っている重みをしようとして推薦しますffnetの結果をKerasモデルに追加します。あなたは必見は2つのlibsの間の正確な同じ結果が得られると同じ重みを使用していずれかの各層のkwargDense(..., weights=)で、またはグローバルエンドmodel.set_weights(...)

で行うことができます。浮動小数点の丸めの問題に遭遇しない限り。私は、ウェイトの移植が一貫していない限り、最適化に取り組むことは役に立たないと考えています。

+0

ありがとうございます。私はffnetからkerasへのウェイト初期化を移植し、それは非常に効果がありました。 – JanM

+0

聞いてよかった:)あなたの問題を解決した場合、答えを受け入れることができますか?ケータルの最適化がffnetの –

+0

ほど良くないことを意味していますが、それは私の問題を解決しませんでしたが、それは間違いなく大きな要因だったので、私はそれを受け入れています。 – JanM