Tensorflow 值错误:变量已存在,不允许

Posted

技术标签:

【中文标题】Tensorflow 值错误:变量已存在,不允许【英文标题】:Tensorflow value error: Variable already exists, disallowed 【发布时间】:2018-02-13 19:44:18 【问题描述】:

我正在使用 tensorflow 预测具有不同时间段的金融时间序列。为了划分输入数据,我制作了子样本并用于循环。 但是,我得到了这样的 ValueError ;

ValueError: 变量 rnn/basic_lstm_cell/weights 已经存在,不允许。您的意思是在 VarScope 中设置 reuse=True 吗?最初定义于:

没有子示例,此代码运行良好。 下面是我的代码。

    import tensorflow as tf
    import numpy as np
    import matplotlib
    import os
    import matplotlib.pyplot as plt

    class lstm:
        def __init__(self, x, y):
            # train Parameters
            self.seq_length = 50
            self.data_dim = x.shape[1]
            self.hidden_dim = self.data_dim*2
            self.output_dim = 1
            self.learning_rate = 0.0001
            self.iterations = 5 # originally 500

        def model(self,x,y):
            # build a dataset
            dataX = []
            dataY = []
            for i in range(0, len(y) - self.seq_length):
                _x = x[i:i + self.seq_length]
                _y = y[i + self.seq_length]
                dataX.append(_x)
                dataY.append(_y)

            train_size = int(len(dataY) * 0.7977)
            test_size = len(dataY) - train_size
            trainX, testX = np.array(dataX[0:train_size]), np.array(dataX[train_size:len(dataX)])
            trainY, testY = np.array(dataY[0:train_size]), np.array(dataY[train_size:len(dataY)])
            print(train_size,test_size)

            # input place holders
            X = tf.placeholder(tf.float32, [None, self.seq_length,         self.data_dim])
            Y = tf.placeholder(tf.float32, [None, 1])

            # build a LSTM network
            cell = tf.contrib.rnn.BasicLSTMCell(num_units=self.hidden_dim,state_is_tuple=True,  activation=tf.tanh) 
            outputs, _states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
            self.Y_pred = tf.contrib.layers.fully_connected(outputs[:, -1], self.output_dim, activation_fn=None) 
            # We use the last cell's output

            # cost/loss
            loss = tf.reduce_sum(tf.square(self.Y_pred - Y))  # sum of the squares
            # optimizer
            optimizer = tf.train.AdamOptimizer(self.learning_rate)
            train = optimizer.minimize(loss)

            # RMSE
            targets = tf.placeholder(tf.float32, [None, 1])
            predictions = tf.placeholder(tf.float32, [None, 1])
            rmse = tf.sqrt(tf.reduce_mean(tf.square(targets - predictions)))

            # training
            with tf.Session() as sess:
                init = tf.global_variables_initializer()
                sess.run(init)

                # Training step
                for i in range(self.iterations):
                    _, step_loss = sess.run([train, loss], feed_dict=X: trainX, Y: trainY)

                # prediction
                train_predict = sess.run(self.Y_pred, feed_dict=X: trainX)
                test_predict = sess.run(self.Y_pred, feed_dict=X: testX)

            return train_predict, test_predict 

    # variables definition
    tsx = []
    tsy = []
    tsr = []
    trp = []
    tep = []

    x = np.loadtxt('data.csv', delimiter=',') # data for analysis
    y = x[:,[-1]]
    z = np.loadtxt('rb.csv', delimiter=',')   # data for time series
    z1 = z[:,0] # start cell
    z2 = z[:,1] # end cell

    for i in range(1): # need to change to len(z)
        globals()['x_%s' % i] = x[int(z1[i]):int(z2[i]),:] # definition of x
        tsx.append(globals()["x_%s" % i])

        globals()['y_%s' % i] = y[int(z1[i])+1:int(z2[i])+1,:] # definition of y
        tsy.append(globals()["y_%s" % i])

        globals()['a_%s' % i] = lstm(tsx[i],tsy[i]) # definition of class  

        globals()['trp_%s' % i],globals()['tep_%s' % i] = globals()["a_%s" % i].model(tsx[i],tsy[i])
        trp.append(globals()["trp_%s" % i])
        tep.append(globals()["tep_%s" % i])

【问题讨论】:

【参考方案1】:

每次调用 model 方法时,您都在构建 LSTM 的计算图。第二次调用model 方法时,tensorflow 发现您已经创建了同名变量。如果创建变量的范围的reuse 标志设置为False,则会引发ValueError

要解决此问题,您必须通过在循环结束时调用 tf.get_variable_scope().reuse_variables() 将重用标志设置为 True

请注意,您不能在循环的开头添加它,因为您正在尝试重用尚未创建的变量。

您可以在 tensorflow 文档here中找到更多信息

【讨论】:

谢谢,GeertH。您的建议解决了我提到的错误。但是,我仍然有一个错误。就像下面一样。 ValueError: 变量fully_connected_1/weights/Adam/ 不存在,或者不是用tf.get_variable() 创建的。您的意思是在 VarScope 中设置 reuse=None 吗? tf.compat.v1.get_variable_scope().reuse_variables() 在 tensorflow2 中【参考方案2】:

您在“模型”函数中定义了一些变量。 当你想多次调用“模型”函数时试试这个:

with tf.variable_scope("model_fn") as scope:
  train_predict, test_predict = model(input1)
with tf.variable_scope(scope, reuse=True):
  train_predict, test_predict = model(input2)

【讨论】:

以上是关于Tensorflow 值错误:变量已存在,不允许的主要内容,如果未能解决你的问题,请参考以下文章

Python:如果不存在则赋值

Tensorflow 中没有变量可以保存错误

因为该组节的条件字段不存在或无效所以无法打印

Tensorflow 类型错误:不允许使用 `tf.Tensor` 作为 Python `bool`。

ValueError:变量嵌入已经存在,不允许。您的意思是在 VarScope 中设置 reuse=True 吗?最初定义

Tensorflow 值错误:无法使用 eval 评估张量