2016-11-25 24 views
4

私は損失のためにtf.nn.sigmoid_cross_entropy_with_logits関数を使用しています。それはNaNに向かいます。Tensorflow Loss NaNに行く

私は既にテンソル分割が行われている1つの場所でグラデーションのクリッピングを使用しています。ゼロによる除算を防ぐためにイプシロンを追加しました。また、すべてのsoftmax関数の引数にもイプシロンが追加されています。

しかし、私はNaNの中途半端なトレーニングを受けています。

私が逃したテンソルフローは既知の問題はありますか? トレーニング中に無作為にNaNに行き、すべてを破棄するので、かなりイライラします。

また、列車のステップがNaNになり、その例を完全にスキップすることができますか?助言がありますか?

編集:ネットワークは神経チューリングマシンです。

EDIT 2:コードhereの一部をアップロードしました。 コメントはまだありません。GravesらがNTMの論文をすでに読んでいる人には、ほとんどの意味があります。ここをクリックしてください:https://arxiv.org/abs/1410.5401

私のコードのすべてが、紙の作者の意図と正確に一致するかどうかはわかりません。私は練習としてこれをやっているだけで、私は私を修正する指導者がいません。

EDIT 3:

optimizer = tf.train.AdamOptimizer(self.lr) 
gvs = optimizer.compute_gradients(loss) 
capped_gvs =\ 
    [(tf.clip_by_value(grad, -1.0, 1.0), var) if grad != None else (grad, var) for grad, var in gvs] 
train_step = optimizer.apply_gradients(capped_gvs) 

私はそれなしでエラーになったので、私はif grad != None条件を追加する必要がありました。ここでは勾配クリッピングのためのコードです。問題はここにありますか?

潜在的な解決策:私は現在、tf.contrib.losses.sigmoid_cross_entropyをしばらく使用していますが、これまでのところ、損失は発散していません。もう少しテストして報告します。

+2

最初の考えとして、学習率を下げてみてください。 – sygi

+0

私はグラデーションクリッピングでAdamオプティマイザを使用していますので、学習率をどの程度変えれば助けになるのでしょうか。私は学習率を下げようとしましたが、それでもNaNに行きました。実際、率を下げる前に問題なくトレーニングを終えてしまったので、私は何とか問題を解決したと思った。 – SilverSlash

+0

各レイヤーの前に非常に小さなガウスノイズを追加しようとしましたか? – broncoAbierto

答えて

0

学習率に1e-4を使用します。 Adamのオプティマイザでいつもそれが私のために働くようです。あなたがグラデーションクリップをしてもそれはまだ発散することができます。また、正のすべての入力に対して安定していますが、値がゼロに近づくにつれてその勾配が発散するため、もう1つの卑劣なものは平方根をとっています。最後に、モデルへのすべての入力が合理的であることを確認して確認します。

+0

実際にグラフの平方根計算がありますが、平方根はテンソルの12ノルムの一部として計算されます。だから、私は平方根をとる前にテンソルでtf.square()を使用しています。さらに二乗した後でも、ゼロによる除算を避けるためにイプシロンを追加しました。 – SilverSlash

+0

tf.nn.l2_loss関数を使用してみてください。 sqrtの前に何かを配置することは重要ではありません。それはまだ発散するでしょう。エラーが小さくなり、sqrtの勾配がばらついているので、訓練の後は乖離してしまいます。 – chasep255

+0

dim引数をとらないtf.nn.l2_lossは使用できません。それはテンソルのすべての要素を合計します。私は特定の次元を超えて行う必要があります。 – SilverSlash

関連する問題