tensorflow:简单 LSTM 网络的共享变量错误
tensorflow: shared variables error with simple LSTM network
我正在尝试构建一个尽可能简单的 LSTM 网络。只希望它预测序列中的下一个值 np_input_data
.
import tensorflow as tf
from tensorflow.python.ops import rnn_cell
import numpy as np
num_steps = 3
num_units = 1
np_input_data = [np.array([[1.],[2.]]), np.array([[2.],[3.]]), np.array([[3.],[4.]])]
batch_size = 2
graph = tf.Graph()
with graph.as_default():
tf_inputs = [tf.placeholder(tf.float32, [batch_size, 1]) for _ in range(num_steps)]
lstm = rnn_cell.BasicLSTMCell(num_units)
initial_state = state = tf.zeros([batch_size, lstm.state_size])
loss = 0
for i in range(num_steps-1):
output, state = lstm(tf_inputs[i], state)
loss += tf.reduce_mean(tf.square(output - tf_inputs[i+1]))
with tf.Session(graph=graph) as session:
tf.initialize_all_variables().run()
feed_dict={tf_inputs[i]: np_input_data[i] for i in range(len(np_input_data))}
loss = session.run(loss, feed_dict=feed_dict)
print(loss)
口译员returns:
ValueError: Variable BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at:
output, state = lstm(tf_inputs[i], state)
我做错了什么?
此处调用lstm
:
for i in range(num_steps-1):
output, state = lstm(tf_inputs[i], state)
将尝试在每次迭代中创建具有相同名称的变量,除非您另有说明。您可以使用 tf.variable_scope
with tf.variable_scope("myrnn") as scope:
for i in range(num_steps-1):
if i > 0:
scope.reuse_variables()
output, state = lstm(tf_inputs[i], state)
第一次迭代创建代表 LSTM 参数的变量,每次后续迭代(在调用 reuse_variables
之后)将仅按名称在范围内查找它们。
使用 tf.nn.rnn
或 tf.nn.dynamic_rnn
可以做到这一点,并为您带来许多其他好处。
我 运行 使用 tf.nn.dynamic_rnn
在 TensorFlow v1.0.1 中遇到类似问题。事实证明,只有在我不得不重新训练或在训练过程中取消并重新开始我的训练过程时才会出现错误。基本上图表没有被重置。
长话短说,在您的代码开头添加一个 tf.reset_default_graph()
,它应该会有所帮助。至少在使用 tf.nn.dynamic_rnn
和重新训练时是这样。
我正在尝试构建一个尽可能简单的 LSTM 网络。只希望它预测序列中的下一个值 np_input_data
.
import tensorflow as tf
from tensorflow.python.ops import rnn_cell
import numpy as np
num_steps = 3
num_units = 1
np_input_data = [np.array([[1.],[2.]]), np.array([[2.],[3.]]), np.array([[3.],[4.]])]
batch_size = 2
graph = tf.Graph()
with graph.as_default():
tf_inputs = [tf.placeholder(tf.float32, [batch_size, 1]) for _ in range(num_steps)]
lstm = rnn_cell.BasicLSTMCell(num_units)
initial_state = state = tf.zeros([batch_size, lstm.state_size])
loss = 0
for i in range(num_steps-1):
output, state = lstm(tf_inputs[i], state)
loss += tf.reduce_mean(tf.square(output - tf_inputs[i+1]))
with tf.Session(graph=graph) as session:
tf.initialize_all_variables().run()
feed_dict={tf_inputs[i]: np_input_data[i] for i in range(len(np_input_data))}
loss = session.run(loss, feed_dict=feed_dict)
print(loss)
口译员returns:
ValueError: Variable BasicLSTMCell/Linear/Matrix already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at:
output, state = lstm(tf_inputs[i], state)
我做错了什么?
此处调用lstm
:
for i in range(num_steps-1):
output, state = lstm(tf_inputs[i], state)
将尝试在每次迭代中创建具有相同名称的变量,除非您另有说明。您可以使用 tf.variable_scope
with tf.variable_scope("myrnn") as scope:
for i in range(num_steps-1):
if i > 0:
scope.reuse_variables()
output, state = lstm(tf_inputs[i], state)
第一次迭代创建代表 LSTM 参数的变量,每次后续迭代(在调用 reuse_variables
之后)将仅按名称在范围内查找它们。
使用 tf.nn.rnn
或 tf.nn.dynamic_rnn
可以做到这一点,并为您带来许多其他好处。
我 运行 使用 tf.nn.dynamic_rnn
在 TensorFlow v1.0.1 中遇到类似问题。事实证明,只有在我不得不重新训练或在训练过程中取消并重新开始我的训练过程时才会出现错误。基本上图表没有被重置。
长话短说,在您的代码开头添加一个 tf.reset_default_graph()
,它应该会有所帮助。至少在使用 tf.nn.dynamic_rnn
和重新训练时是这样。