2017-12-05 18 views
0

TensorFlow: varscope.reuse_variables()と同様の問題があります。テンソルフローの変数がループ内でエラーを生成します

私はデータセットに対してクロスバリデーションを行っています。

関数を呼び出すたびに、 myFunctionInFile1())に新しいデータを追加しました(現在はスペースが限られているため、データの割り当ての詳細は省略しています)。この関数は同じpythonファイルではありません。そのため私はメインのpythonファイル(file2)のファイルからこの関数をインポートします。この機能は完全なCNNとトレーニングを作成し、与えられた訓練と新しく初期化され、訓練されたパラメータでテストデータのモデルをテストします。

メインファイル(file2)から、最初の検証でmyFunctionInFile1が呼び出され、CNNモデルがテストして結果をメインファイル(file2)に返します。ただし、コードに続く新しいデータで2回目の繰り返し、中:

ValueError: Variable BatchNorm_2/beta does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope? 

C/C++/Javaでプログラミングの場合のように、一般的に、問題は何ですか:

def myFunctionInFile1(): 
    # Nodes for the input variables 
    x = tf.placeholder("float", shape=[None, D], name='Input_data') 
    y_ = tf.placeholder(tf.int64, shape=[None], name='Ground_truth') 
    keep_prob = tf.placeholder("float") 
    bn_train = tf.placeholder(tf.bool) # Boolean value to guide batchnorm 

    def bias_variable(shape, name): 
     initial = tf.constant(0.1, shape=shape) 
     return tf.Variable(initial, name=name) 

    def conv2d(x, W): 
     return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

    def max_pool_2x2(x): 
     return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
          strides=[1, 2, 2, 1], padding='SAME') 

    with tf.name_scope("Reshaping_data") as scope: 
     x_image = tf.reshape(x, [-1, D, 1, 1]) 

    initializer = tf.contrib.layers.xavier_initializer() 
    """Build the graph""" 
    # ewma is the decay for which we update the moving average of the 
    # mean and variance in the batch-norm layers 

    with tf.name_scope("Conv1") as scope: 
     # reuse = tf.AUTO_REUSE 
     W_conv1 = tf.get_variable("Conv_Layer_1", shape=[5, 1, 1, num_filt_1], initializer=initializer) 
     b_conv1 = bias_variable([num_filt_1], 'bias_for_Conv_Layer_1') 
     a_conv1 = conv2d(x_image, W_conv1) + b_conv1 
    with tf.name_scope('Batch_norm_conv1') as scope: 
     a_conv1 = tf.contrib.layers.batch_norm(a_conv1,is_training=bn_train,updates_collections=None)  

することは私に次のエラーを与えます関数を終了すると、呼び出された関数のローカル変数は戻り時に自動的に削除されます。新しい呼び出しのたびに新しいパラメータセットを作成する必要があります。なぜこのエラーが出るのかよりも。これをどうすれば解決できますか?

+0

問題を診断するのに十分なコードがありません。投稿した行はうまくいくはずですが、なぜここでname_scopeを使用しているのかわかりません。 –

+0

@MadWombat私はコードと質問を更新しました。親切にチェックしてください。 – khan

答えて

0

batch_normのようなTensorFlowレイヤーは、tf.get_variableを使用して実装されます。 tf.get_variableには再利用引数(variable_scopeから取得することもできます)があり、デフォルトはFalseです。reuse = Falseを指定して呼び出すと、常に変数が作成されます。 reuse = Trueを指定すると、既存の変数を再利用するか、変数が存在しない場合は失敗することができます。

あなたのケースでは、最初にreuse = Trueでバッチノルムを呼び出しているので、変数を作成するのが難しいです。可変スコープでreuse = Falseを設定するか、エラーメッセージに示すように、tf.AUTO_REUSEを使用してください。

+0

ありがとうございます。しかし、私はまだ問題に直面しています。 reuse = Trueを使う必要があるのはどこですか?私は、tf.name_scope( 'Batch_norm_conv1'、reuse = True)またはa_conv1 = tf.contrib.layers.batch_norm(a_conv1、is_training = bn_train、updates_collections = None、reuse = True)の内部にあることを意味します。どちらもエラーです。スコープの後に再試行しましたが、reuse = Trueまたはreuse = tf.AUTO_REUSEではなく、フェイルエラーです。それを使用する正しい位置は何ですか? – khan

+0

内のtf.variable_scope(...、reuse = True) –

+0

しかし、私はtf.variable_scope()を使用しませんでした。私はtf.name_scope()を使用しています。あなたはname_scope()の代わりにvariable_scope()を使うべきであることを意味しますか?私は変数を共有していないことを1つ追加することがあります。新しいパラメータを初期化するたびに呼び出すことを意味します。あなたはvariable_scope()がそうすると思いますか? tf.name_space()の代わりにtf.variable_scopeを使用することは可能ですか? – khan

関連する問題