2017-05-30 15 views
0

我试着用不同的超参数重复运行tensorflow深度学习程序。Tensorflow:我如何反复运行tensorflow作业?

for i in range(10): 
    my_learner = DQNLearner() 
    my_learner.build_network() 
    my_learner.run() 


class DQNLearner(): 
    def build_network(self): 
     W1 = tf.get_variable(
      "W1", 
      shape=[self.input_size, h_size], 
      initializer=tf.contrib.layers.xavier_initializer() 
     ) 
     b1 = tf.Variable(tf.random_normal([h_size])) 
     L1 = tf.nn.relu(tf.matmul(self._X, W1) + b1) 
     L1 = tf.nn.dropout(L1, keep_prob=self.keep_prob) 

     W2 = tf.get_variable(
      "W2", 
      shape=[h_size, h_size], 
      initializer=tf.contrib.layers.xavier_initializer() 
     ) 
     b2 = tf.Variable(tf.random_normal([h_size])) 
     L2 = tf.nn.relu(tf.matmul(L1, W2) + b2) 
     L2 = tf.nn.dropout(L2, keep_prob=self.keep_prob) 
     . 
     . 
     . 
     . 
     . 

它在第一次循环中效果很好。但在第二个循环中,它是这样发生的:

ValueError: Variable W1 already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at: 

我该如何解决它?

回答

0

tf.get_variable方法试图给你一个现有的变量,如果它已经被调用,否则它会创建一个新的变量。请参阅the variable guide

您可以做的是通过调用tf.reset_default_graph()来重置两个循环之间的图形。这样,新的变量将被添加到一个全新的默认的图形:

for i in range(10): 
    tf.reset_default_graph() 
    my_learner = DQNLearner() 
    my_learner.build_network() 
    my_learner.run() 

另一种方法是,让您的变量和使用初始化器运算两个循环之间重新初始化它们。例如,你可以这样做:

tf.reset_default_graph() 
my_learner = DQNLearner() 
my_learner.build_network() 

init_op = tf.global_variables_initializer() 
sess = tf.InteractiveSession() 
for i in range(10): 
    sess.run(init_op) 
    my_learner.run()