我刚开始使用Pytorch,还在努力理解它的基本概念。
如果我在GPU上有一个网络n
,它产生一个输出Tensorout
,它可以直接打印到stdout吗?或者应该先将它移到cpu,或者在打印之前将它从图形中分离出来?
尝试了以下涉及.cpu()
和.detach()
的几种组合
import torch.nn as nn
import torch
class Net(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(5, 10),
nn.ReLU(),
nn.Linear(10, 10),
nn.ReLU(),
nn.Linear(10, 3),
)
def forward(self, x):
return self.layers(x)
device = torch.device("cuda:0") # assume its available
x = torch.rand(10, 5).to(device)
net = Net().to(device)
# Pretend we are in a training loop iteration
out = net(x)
print(f"The output is {out.max()}")
print(f"The output is {out.max().detach()}")
print(f"The output is {out.max().cpu()}")
print(f"The output is {out.max().cpu().detach()}")
# continue training iteration and repeat more iterations in training loop
我得到了相同的输出为所有4种方法。哪种是正确的方式?
1条答案
按热度按时间xggvc2p61#
你不应该对同样的价值输出感到惊讶,它不应该改变任何价值。
cpu()
将Tensor传递到cpu
。并且detach()
将Tensor从计算图形中分离,以便autograd不会在将来的反向传播中跟踪它。通常我是做
.detach().cpu()
的,因为它将它从计算图中分离出来,然后它将移动到cpu中进行进一步处理。.cpu().detach()
也可以,但在这种情况下,autograd
考虑了cpu()
,但在前面的情况下,.cpu()
操作不会被autograd跟踪,这是我们想要的。就是这样。它'It“只有这些小事情是不同的--价值在所有情况下都是相同的。