2017-02-23 2 views
1

入力が基本的にガウスノイズが適用されたベクトルであるいくつかのシミュレートされたデータに対してオートエンコーダーをトレーニングしようとしています。コードはほぼ正確に、この例の場合と同様である:私は、ネットワークパラメータおよびコスト関数に変更されているhttps://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.pyトレーニングは非常に低いエラーですが、非常に間違っています(ほぼすべての出力)

違いのみ:トレーニング中

n_hidden_1 = 32 # 1st layer num features 
    n_hidden_2 = 16 # 2nd layer num features 
    n_input = 149 # LunaH-Map data input (number of counts per orbit) 
    cost = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_pred), reduction_indices=[1])) 

を、エラーが着実0.00015まで減少するが、予測値と真値は非常に異なっています。 as shown in this image。実際、予測されたyベクトルはほぼすべて1である。

間違った予測でエラーを減らすにはどうしたらよいですか?私のネットワークは、クロスエントロピーコストを最小限に抑えるために重みをlog(1)に近づけようとしている可能性はありますか?もしそうなら、私はこれとどのように戦うのですか?

+1

評価にはどのようなデータを使用しますか?トレーニングデータ、または未使用の検証データ? – yuval

+1

あなたが示した予測が見えないデータの場合、オーバーフィットの問題にぶつかっている可能性があります。つまり、アルゴリズムがトレーニングデータセットを単に記憶していますが、見えない新しいデータには一般化できません。 – kaufmanu

答えて

0

はい、ネットワークは単に損失を減らす1を予測することを学びます。クロスエントロピー損失は、y_trueがワンホットコード(例:[0,0,1,0])であり、最終層がsoftmax(すべての出力の合計が1であること)である場合に使用されるカテゴリです。したがって、y_true [idx]が0の場合、損失は気にしませんが、y_true [idx]が1でy_pred [idx]が0の場合、無限(高い)損失がありますが、1の場合は損失が再び0です。

ここで、カテゴリーエントロピー間の損失は自動エンコーダーには適していません。実数値の入力に対して、平均二乗誤差を出力します。これは、引用した例で使用されているものです。しかし、最終活性化層はsigmoidであり、xの各要素は0/1であると暗黙のうちに言います。したがって、データを変換して同じものをサポートするか、またはデコーダの線形の最後のレイヤーを持つ必要があります。

クロスエントロピー損失を使用する場合は、バイナリクロスエントロピーを使用できます 0,1バイナリクロスエントロピーを持つ入力の場合:tf.reduce_mean(y_true * tf.log(y_pred) + (1-y_true) * tf.log(1-y_pred))。あなたが両方の予期せぬ事例0-1、1-0でそれを解決すれば、ネットワークは無限の損失になります。最後のレイヤーはsoftmaxで、xの要素は0と1の間である必要があります。

関連する問題