在张量流中,如何迭代存储在张量中的输入序列?

Posted

技术标签:

【中文标题】在张量流中,如何迭代存储在张量中的输入序列?【英文标题】:In tensorflow, how to iterate over a sequence of inputs stored in a tensor? 【发布时间】:2016-11-26 06:12:45 【问题描述】:

我正在尝试使用 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. 如何按顺序迭代张量(一次读取单个元素)?

我的目标是对序列中的每个输入应用gru 函数并获得最终的隐藏状态。

【问题讨论】:

【参考方案1】:

在 TF>=1.0 中,tf.packtf.unpack 分别重命名为 tf.stacktf.unstack

【讨论】:

【参考方案2】:

您可以使用将第一个维度转换为列表的解包函数将张量转换为列表。还有一个 split 函数可以做类似的事情。我在我正在研究的 RNN 模型中使用 unstack。

y = tf.unstack(tf.transpose(y, (1, 0, 2)))

在这种情况下,y 以形状 (BATCH_SIZE, TIME_STEPS, 128) 开始,我将其转置以使时间步长成为外部维度,然后将其解压缩到张量列表中,每个时间步长一个。现在 y 列表中的每个元素如果形状为 (BATCH_SIZE, 128),我可以将其输入到我的 RNN 中。

【讨论】:

如果 time_steps 不存在(序列的可变长度),这将不起作用。

以上是关于在张量流中,如何迭代存储在张量中的输入序列?的主要内容,如果未能解决你的问题,请参考以下文章

当切片本身是张量流中的张量时如何进行切片分配

张量流中的最小 RNN 示例

有没有办法从张量流中的图像中获取 IUV 图?

张量流中的稀疏自动编码器成本函数

如何从子目录加载张量流中的数据

在张量流中改变张量的尺度