pytorch 如何使用隐式 for 循环而不是显式 for 循环?

扎眼的阳光 pytorch 688

原文标题How pytorch uses an implicit for loop instead of an explicit for loop?

代码如下:

import torch
import numpy as np
x = torch.zeros((128, 3, 32, 32))
y = np.arange(128)
for i in range(len(y)):
    x[i].uniform_(-y[i], y[i])

可以用数组切片之类的方法替换 for 循环吗?谢谢

原文链接:https://stackoverflow.com//questions/71475759/how-pytorch-uses-an-implicit-for-loop-instead-of-an-explicit-for-loop

回复

我来回复
  • jodag的头像
    jodag 评论

    您可以利用以下事实:

    给定一个随机变量Z ~ Uniform(0,1)和实数ab哪里a < b,如果X = Z * (b - a) + aX ~ Uniform(a,b)。特别相关的是a = -b的情况,它允许我们简化为X = (2 * Z - 1) * b

    在 PyTorch 中将其付诸实践看起来像这样

    z = torch.rand(128, 3, 32, 32)
    y = torch.arange(128).reshape(-1, 1, 1, 1)
    x = (2 * z - 1) * y
    

    其中torch.rand返回从Uniform(0,1)采样的新随机张量。我们还必须插入一些额外的单一维度来y使用Tensor.reshape使其成形[128,1,1,1]以便广播按照我们希望的方式工作(请参阅此处,如果您不熟悉 NumPy 和 PyTorch 中的广播语义,它们都使用相同的规则) .另请注意,我们使用torch.arange而不是np.arange,因为在对 PyTorch 张量执行数学运算时,我们通常希望留在 PyTorch 框架中(因为 PyTorch 张量通常不能很好地与 NumPy 数组配合使用)。

    2年前 0条评论