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 循环吗?谢谢
回复
我来回复-
jodag 评论
您可以利用以下事实:
给定一个随机变量
Z ~ Uniform(0,1)
和实数a
和b
哪里a < b
,如果X = Z * (b - a) + a
则X ~ 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年前