2017-01-07 7 views
1

私は関数を使ってグラフを作成しており、変数の値を抽出して操作を追加しようとしています。私が書かれている機能の一部を以下に示します。ラインprint(sess.run(weight_rows, feed_dict={images:inp}))変数の初期化に問題があります

def build(self, save_path=None, save_name=None): 
    g = tf.Graph() 
    with g.as_default(): 
     init_op = tf.initialize_all_variables() 
     images = tf.placeholder(tf.float32, shape=[None, 300, 300, 3], name='input') 
     with tf.variable_scope('conv1_'): 
      conv11 = self.conv_relu(images, kernel_shape=[3, 3, 3, 64], bias_shape=64, name='c1') 
      conv12 = self.conv_relu(conv11, kernel_shape=[3, 3, 64, 64], bias_shape=64, name='c2') 

     pool1 = tf.nn.max_pool(conv12, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool1') 


     with tf.variable_scope('conv2_'): 
      conv21 = self.conv_relu(pool1, kernel_shape=[3, 3, 64, 128], bias_shape=128, name='c1') 
      conv22 = self.conv_relu(conv21, kernel_shape=[3, 3, 128, 128], bias_shape=128, name='c2') 

     pool2 = tf.nn.max_pool(conv22, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool2') 


     with tf.variable_scope('conv3_'): 
      conv31 = self.conv_relu(pool2, kernel_shape=[3, 3, 128, 256], bias_shape=256, name='c1') 
      conv32 = self.conv_relu(conv31, kernel_shape=[3, 3, 256, 256], bias_shape=256, name='c2') 
      conv33 = self.conv_relu(conv32, kernel_shape=[3, 3, 256, 256], bias_shape=256, name='c3') 

     pool3 = tf.nn.max_pool(conv33, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool3') 

     with tf.variable_scope('conv4_'): 
      conv41 = self.conv_relu(pool3, kernel_shape=[3, 3, 256, 512], bias_shape=512, name='c1') 
      conv42 = self.conv_relu(conv41, kernel_shape=[3, 3, 512, 512], bias_shape=512, name='c2') 
      conv43 = self.conv_relu(conv42, kernel_shape=[3, 3, 512, 512], bias_shape=512, name='c3') 

     pool4 = tf.nn.max_pool(conv43, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool4') 

     with tf.variable_scope('conv5_'): 
      conv51 = self.conv_relu(pool4, kernel_shape=[3, 3, 512, 512], bias_shape=512, name='c1') 
      conv52 = self.conv_relu(conv51, kernel_shape=[3, 3, 512, 512], bias_shape=512, name='c2') 
      conv53 = self.conv_relu(conv52, kernel_shape=[3, 3, 512, 512], bias_shape=512, name='c3') 

     pool5 = tf.nn.max_pool(conv53, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name='pool5') 

     pool5_shape = tf.shape(pool5) 

     pool5_reshaped = tf.reshape(pool5, shape=[pool5_shape[0], -1], name='pool5_reshaped') 

     weight_rows = pool5_shape[1] * pool5_shape[2] * pool5_shape[3] 
    sess = tf.Session(graph=g) 
    inp = np.zeros(shape=(2, 300, 300, 3)) 
    print(inp.shape) 
    sess.run(init_op) 
    print(sess.run(weight_rows, feed_dict={images:inp})) 
    sess.close() 

を私は次のエラーを取得する:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value conv5_/biasesc3 
    [[Node: conv5_/biasesc3/read = Identity[T=DT_FLOAT, _class=["loc:@conv5_/biasesc3"], _device="/job:localhost/replica:0/task:0/cpu:0"](conv5_/biasesc3)]] 

私はinit_op操作を実行した。このエラーの原因は何ですか前のセッションで?正確には、これはどのように機能し、私はここで間違っていますか?

答えて

1

すべての変数を宣言した後でinit_opを定義する必要があります(つまり、tf.initialize_all_variables()を呼び出す必要があります)。 tf.get_variableまたはtf.Variableで変数を作成すると、GLOBAL_VARIABLESコレクションに配置されます(別途指定されている場合を除き、collections kwarg)。 tf.initialize_all_variables()はこのコレクションを見て、リストされた変数を初期化するopを作成します。

GLOBAL_VARIABLESコレクションを表示するには、tf.get_collectiontf.GraphKeys.GLOBAL_VARIABLESを引数として使用できます。

TL; DR場所init_op = tf.initialize_all_variables()グラフが作成された後。

関連する問題