我在可变长度多变量序列分类问题上尝试RNN。
我已经定义了以下函数来获取序列的输出(即,从序列输入的最终输入后RNN单元的输出)
def get_sequence_output(x_sequence, initial_hidden_state):
previous_hidden_state = initial_hidden_state
for x_single in x_sequence:
hidden_state = gru_unit(previous_hidden_state, x_single)
previous_hidden_state = hidden_state
final_hidden_state = hidden_state
return final_hidden_state
此处x_sequence
是第一个形状(?, ?, 10)
的张量?是批量大小和第二?用于序列长度,每个输入元素的长度为10. gru
函数采用先前的隐藏状态和当前输入并吐出下一个隐藏状态(标准的门控循环单元)。
我收到错误:'Tensor' object is not iterable.
如何以序列方式迭代Tensor(一次读取单个元素)?
我的目标是对序列中的每个输入应用gru
函数并获得最终的隐藏状态。
答案 0 :(得分:10)
在TF> = 1.0中,tf.pack
和tf.unpack
分别重命名为tf.stack
和tf.unstack
答案 1 :(得分:7)
您可以使用unpack函数将张量转换为列表,该函数将第一个维度转换为列表。还有一个分离功能,可以做类似的事情。我在我工作的RNN模型中使用unstack。
y = tf.unstack(tf.transpose(y, (1, 0, 2)))
在这种情况下,y从形状开始(BATCH_SIZE,TIME_STEPS,128)我将其转置为使时间步长为外部尺寸,然后将其解压缩到张量列表中,每个步骤一个。现在y列表中的每个元素(如果有形状)(BATCH_SIZE,128),我可以将它输入我的RNN。