【问题标题】:Vectorize to Apply Function to 3d Array向量化以将函数应用于 3d 数组
【发布时间】:2019-09-25 09:22:02
【问题描述】:

我正在尝试将函数应用于 3d 火炬张量,而该函数应用于通过 3d 火炬张量的轴 1 读取的 2d 张量。

例如,我有一个形状为 (51, 128, 20100) 的火炬张量(一个名为 autoencode_logprob 的变量),函数 (rawid2sentence) 在形状 (51, 20100) 的输入上运行。

现在我编写了代码以使用幼稚的 for 循环运行,使用 range(128) 一个接一个地循环。

但是,它太慢了。以下是重要的代码部分。

autoencode_logprobs 是 3d 张量,我需要沿其第二个轴应用 rawids2sentence 函数。对矢量化有什么帮助吗?

for i in range(128):
    output_sent = self.dictionary.rawids2sentence(
        autoencode_logprobs[:, i].max(1)[
            1].data.cpu().numpy(),
        oov_dicts[i],
    )
    output_sent_encoding = ifst_model.encode([output_sent])

【问题讨论】:

  • 只有 128 次迭代,我会关注任务本身的速度,而不是消除迭代。
  • 有数百万个批次来处理同一个任务。消除迭代是深度学习的基础和根本。

标签: python numpy vectorization pytorch


【解决方案1】:

由于我不知道rawids2sentenceencode函数是做什么的,我可以帮你做max操作。

在下面的语句中,

autoencode_logprobs[:, i].max(1)[1]

您为每个 51 x 20100 张量确定沿 dim=1 的最大值的索引。所以,输出是一个大小为51的向量。

您可以在形状为51 x 128 x 20100 的完整张量中执行相同的操作,并获得128 x 51 张量的输出。

autoencode_logprobs.transpose(0, 1).max(2)[1] # 128 x 51

因此,如果您的 rawids2sentenceencode 方法可以处理批量输入,那么上述更改应该对您有效,无需任何循环。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多