我遇到与TensorFlow: varscope.reuse_variables()类似的问题。
我正在对数据集进行交叉验证。
每次我调用一个函数,例如myFunctionInFile1())包含新数据(目前由于空间有限,我省略了数据分配细节)。这个函数不在同一个python文件中。因为我在我的主python文件(file2)中从该文件导入此函数。该功能创建了一个完整的CNN,并使用新初始化和训练的参数训练和测试给定训练和测试数据的模型。
在主文件(file2)中,在第一次验证时,调用myFunctionInFile1并且CNN模型训练并测试它并将结果返回到主文件(file2)。但是,在使用新数据的第二次迭代中,遵循以下代码:
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)
给我以下错误:
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编程中,返回时会自动删除该被调用函数中的局部变量。每次新调用时都应该创建一组新的参数。而不是它给出这个错误的原因。我怎样才能解决这个问题?
答案 0 :(得分:0)
像batch_norm这样的TensorFlow层是使用tf.get_variable实现的。 tf.get_variable有一个重用参数(也可以从variable_scope获取),默认为False,当使用reuse = False调用时,它总是创建变量。您可以使用reuse = True调用它,这意味着它将重用现有变量,如果变量不存在则会失败。
在您的情况下,您第一次使用reuse = True调用批处理规范,因此很难创建变量。尝试在变量范围中设置reuse = False或使用,如错误消息所示,tf.AUTO_REUSE。