私はTensorflowに2層の非畳み込みネットワークを持っています。tanh
をアクティベーション機能として使用しています。私は重みがで割った切断正規分布で初期化する必要があることを理解しsqrt(nInputs)
例:SupressingウェイトがTensorflowニューラルネットのパフォーマンスを向上させるのはなぜですか?
weightsLayer1 = tf.Variable(tf.div(tf.truncated_normal([nInputUnits, nUnitsHiddenLayer1),math.sqrt(nInputUnits))))
はNNとTensorflowで頼りなさそう初心者のビットが、私は誤ってそれだけを読みやすくするために2行としてこれを実装しています:
weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nUnitsHiddenLayer1])
weightsLayer1 = tf.div(weightsLayer1, math.sqrt(nInputUnits))
これは間違っており、2行目では各学習ステップで重みが再計算されることがわかりました。しかし、驚いたことに、「間違った」実装は、列車とテスト/評価の両方のデータセットで、一貫してより良いパフォーマンスをもたらします。私は、オプティマイザによって選択された値以外の値にウェイトを再計算しているので、不正確な2行の実装は列車の難破線でなければならないと思っていましたが、最適化プロセスで大混乱を招くかもしれませんが、 。誰にもこれについての説明がありますか?私はTensorflow adamオプティマイザを使用しています。
更新2016.6.22 - 上記の2番目のコードブロックを更新しました。
まず、2行の実装では、 '' sqrt(nInputUnits) 'で2回除算を行い、効果的に' 'nInputUnits''で除算します。それは意図的なのでしょうか? Second:私はあなたの質問を正確に理解していないのですか?変数 '' weightsLayer1''がトレーニングステップを実行するたびに再初期化されるのではないかと心配していますか?もしそうなら、そうではありません。私はこれについて詳しく説明することができますが、あなたが実際に求めているのかどうかは完全にはわかりません。 – lballes
私の間違いは、上記の2行の場合が間違って入力された、私はそれを修正しました。 'sqrt(nInputUnits)'で1回だけ除算します。 2行の場合、 'weightsLayer1'は' tf.Variable'行で1回だけ初期化されています。私の質問:a)2番目の行( 'weightsLayer1 = tf.div(weightsLayer1、math.sqrt(nInputUnits)))は実行時に実行されますか? b)そうであれば、オプティマイザによって計算された 'weightsLayer1'の値を変更し、最適化プロセスに干渉しますか?c)そうであれば、これはオプティマイザによって計算された 'weightsLayer1'の値よりどうすればよいでしょうか? –
さて、私は今それを得たと思います。下の私の答えを見てください。 – lballes