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 值错误:变量已存在,不允许的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow 类型错误:不允许使用 `tf.Tensor` 作为 Python `bool`。
ValueError:变量嵌入已经存在,不允许。您的意思是在 VarScope 中设置 reuse=True 吗?最初定义