【发布时间】:2018-05-12 22:42:30
【问题描述】:
我已经开始在 tensorflow 中使用 RNN,并且掌握了一般原理,但实现的某些方面还不是很清楚。
我的理解:假设我正在训练一个序列到序列的网络,其中输入与输出的大小相同(这可能类似于在每个时间步预测一段文本中的下一个字符)。我的循环层使用 LSTM 单元,之后我想要一个完全连接的层来增加预测的深度。
在静态 RNN 中,按照 TF 约定,您应该跨时间维度解堆叠输入数据,并将其作为列表提供给 static_rnn 方法,如下所示:
import tensorflow as tf
num_input_features = 32
num_output_features = 32
lstm_size = 128
max_seq_len = 5
# input/output:
x = tf.placeholder(tf.float32, [None, max_seq_len, num_input_features])
x_series = tf.unstack(x, axis=1) # a list of length max_seq_len
# recurrent layer:
lstm_cell = tf.contrib.rnn.BasicLSTMCell(lstm_size)
rnn_outputs, final_state = tf.nn.static_rnn(lstm_cell, x_series, dtype=tf.float32)
这会为您提供一个输出列表,每个时间步都有一个。然后,如果你想在每一步对 RNN 的输出进行一些额外的计算,你可以对输出列表的每个元素都这样做:
# output layer:
w = tf.Variable(tf.random_normal([lstm_size, num_output_features]))
b = tf.Variable(tf.random_normal([num_output_features]))
z_series = [tf.matmul(out, w) + b for out in rnn_outputs]
yhat_series = [tf.nn.tanh(z) for z in z_series]
然后我可以再次堆叠 yhat_series 并将其与一些标签 y 进行比较以获得我的成本函数。
这是我不明白的:在动态 RNN 中,您提供给 dynamic_rnn 方法的输入是一个具有自己时间维度(默认为轴 1)的张量:
# input/output:
x = tf.placeholder(tf.float32, [None, max_seq_len, num_input_features])
# x_series = tf.unstack(x, axis=1) # dynamic RNN does not need this
# recurrent layer:
lstm_cell = tf.contrib.rnn.BasicLSTMCell(lstm_size)
dyn_rnn_outputs, dyn_final_state = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32)
那么dyn_rnn_output 不是一个列表,而是一个形状的张量 (?, max_seq_len, lstm_size)。处理将此张量馈送到后续密集层的最佳方法是什么?我不能将 RNN 输出乘以我的权重矩阵,并且拆开 RNN 输出感觉就像 dynamic_rnn API 旨在避免的尴尬黑客攻击。
有没有我错过的好方法?
【问题讨论】:
-
看看stats.stackexchange.com/questions/330176/…。它可能会使您的输出更清晰。这取决于您是否只关心最终状态。
-
我发现 7 个月前有人问我认为与我在这里问的问题相同的问题 - 但那个人也没有公认的答案。 stackoverflow.com/questions/46433494/…
标签: python tensorflow lstm rnn