2017-01-19 7 views
0

を使用してこれはthis oneへのフォローアップの質問です。Tensorflow:cifar10例の奇妙な行動カスタム変数の作成方法

私はまだファイルcifar10.pycifar10 exampleで作業しており、変数の作成に関するいくつかの奇妙な動作に気づいています。

しかし、まず副次的な質問:なぜ、減量係数がwd=0.0であり、wd=Noneでない変数が作成されるのですか?そうすることで、計算グラフの頂点が少なくなります。

次に、奇妙な行動。私は、変数を作成することがより便利にするために、以下の機能を追加しました:

def _create_variable(name, shape, initializer, wd=None): 
    dtype = tf.float16 if FLAGS.use_fp16 else tf.float32 

    with tf.device('/cpu:0'): 
    var = tf.get_variable(name, shape, dtype, initializer) 

    if wd is not None: 
    wd_val = tf.mul(tf.nn.l2_loss(var), wd, name='weight_loss') 
    tf.add_to_collection('losses', wd_val) 

    return var 

(オリジナルパラメータを持つ)の変数を作成するには、この機能を使用する場合は、計算されlogitsがために+ -1e13の範囲から来ます最初のバッチは徐々に良くなって+ -1.5に達しました。一方、損失は約400000から始まり、それがNaNに達するまで大きくなります。

元の関数を使用して変数を作成する場合、ロギットは最初から+ -1の範囲から来ており、損失は約4.5で徐々に小さくなります。

私と、変数生成のために提供された関数の違いは何ですか?なぜ、その効果は非常に大きいのですか?私はそれを見ない。

変更されたcifar10.pyの完全なコードはhereです。それをテストするには、元のファイルを自分のバージョンに置き換えてください。元と私の機能を切り替えるには、単に行212をCUSTOM = Falseに変更してください。

ありがとうございます。私

答えて

0

愚かな!私自身の関数を間違った方法で使い、平均値としてstddevの値を渡し、デフォルトのstddevを1にしました。

引数の名前を指定しないという呪いです。

とにかく、なぜこの原因は、このような巨大な損失ありません。時にはNaN?