张量流的变量在循环中产生错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了张量流的变量在循环中产生错误相关的知识,希望对你有一定的参考价值。

我和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中编程一样,如果退出一个函数,那个被调用函数中的局部变量会在返回时自动删除。每次新调用时都应该创建一组新的参数。而不是它给出这个错误的原因。我怎样才能解决这个问题?

答案

像batch_norm这样的TensorFlow层是使用tf.get_variable实现的。 tf.get_variable有一个重用参数(也可以从variable_scope获取),默认为False,当使用reuse = False调用时,它总是创建变量。您可以使用reuse = True调用它,这意味着它将重用现有变量,如果变量不存在则失败。

在您的情况下,您第一次使用reuse = True调用批处理规范,因此创建变量很困难。尝试在变量作用域中设置reuse = False,或者使用,如错误消息所示,使用tf.AUTO_REUSE。

以上是关于张量流的变量在循环中产生错误的主要内容,如果未能解决你的问题,请参考以下文章

用于在应用程序中实现张量流的不同的.tflite文件和.txt文件

如何在张量流的自定义损失中获取张量的形状

张量流的 XLA_GPU 和 XLA_CPU 是啥

使用张量流的最佳案例

tf.contrib.layers.flatten(x) 张量流的替代函数

对张量流变量的切片分配