【发布时间】:2018-08-03 04:55:32
【问题描述】:
【问题讨论】:
标签: tensorflow lstm
【问题讨论】:
标签: tensorflow lstm
最简单的方法可能是编写自己的 RNN 单元。另一种方法是使用tf.raw_rnn。查看this post 或此excellent article。
【讨论】:
其实我的网络实现如下:
def build_model(self):
lstm_cell = tf.contrib.rnn.BasicLSTMCell(
num_units=self.config.num_lstm_units, state_is_tuple=True, reuse=True)
if self.mode == "train":
lstm_cell = tf.contrib.rnn.DropoutWrapper(
lstm_cell,
input_keep_prob=self.config.lstm_dropout_keep_prob,
output_keep_prob=self.config.lstm_dropout_keep_prob)
with tf.variable_scope("lstm", initializer=self.initializer) as lstm_scope:
zero_state = lstm_cell.zero_state(
batch_size=self.image_embeddings.get_shape()[0], dtype=tf.float32)
K = 5
C = 80
scores = tf.Variable(tf.random_normal(shape=[K, self.config.batch_size, C]), name="scores")
M = tf.Variable(tf.random_normal(shape=[K+1, self.config.batch_size, 2, 3]), name="M")
tf.assign(M[0], tf.convert_to_tensor([[1., 0., 0.], [0., 1., 0.]]))
lstm_input_size = 14
zk_size = 4096
hidden = zero_state
for k in range(0, K+1):
# Allow the LSTM variables to be reused.
if k > 0:
lstm_scope.reuse_variables()
f_k = spatial_transformer_network.spatial_transformer_network(self.image_embeddings, M[k])
f_k = tf.nn.max_pool(f_k, [1,2,2,1], [1,1,1,1], padding='VALID')
f_k = tf.layers.dense(tf.reshape(f_k, [self.config.batch_size, int(lstm_input_size * lstm_input_size / 4 * 512)]), 4096)
lstm_outputs, hidden = lstm_cell(f_k, hidden)
z_k = tf.layers.dense(hidden[0], zk_size, activation=tf.nn.relu)
if k != 0:
tf.assign(scores[k - 1], (tf.layers.dense(z_k, C)))
if k != K:
tf.assign(M[k + 1], (tf.reshape(tf.layers.dense(z_k, 6), [self.config.batch_size, 2, 3])))
tf.assign(M[k + 1, :, 0, 1], (tf.convert_to_tensor(0.)))
tf.assign(M[k + 1, :, 1, 0], (tf.convert_to_tensor(0.)))
但是运行时会报错
lstm_outputs, hidden = lstm_cell(f_k, hidden).
错误信息是: ValueError:变量 lstm/basic_lstm_cell/kernel 不存在,或者不是使用 tf.get_variable() 创建的。您的意思是在 VarScope 中设置 reuse=tf.AUTO_REUSE 吗?
那么问题是什么?
【讨论】: