본문 바로가기

Deep Learning/PyTorch

PyTorch에서 tensor를 copy하는 법

https://stackoverflow.com/questions/55266154/pytorch-preferred-way-to-copy-a-tensor

PyTorch에서 tensor를 복사하는 방법은 여러가지가 있다.

y = tensor.new_tensor(x) #a

y = x.clone().detach() #b

y = torch.empty_like(x).copy_(x) #c

y = torch.tensor(x) #d

과연 어떠한 방법이 올바르게 tensor를 복사하는 방법일까?

a: y = tensor.new_tensor(x)

new_tensor()는 parameter가 뭐든간에 이를 읽어서 leaf variable을 생성한다. 따라서 근본적으로 b와 동일한 코드이다. 만약 grad가 흐르게 하고 싶다면, require_grad 옵션을 따로 넣어주면 된다.

y = tensor.new_tensor(x, requires_grad=True)

b: y = x.clone().detach()

이 방법의 경우 computational graph에서 더 이상 필요하지 않을 때 사용할 수 있다. 즉, 다음과 같이 tensor가 있다고 할 때,

x = torch.rand(3, requires_grad=True)
print(x.requires_grad) # True
y = x.clone().detach()

print(y.requires_grad) # True

y를 통해 어떠한 연산을 진행하더라도 x에 미치는 영향은 없다. 따라서 weight를 통해 특정 작업을 하고 싶다면 이를 이용하면 된다.

이는 a와 동일한 코드이며, computation graph에서 분리하고 싶을 때 권장된다. clone후에 detach를 하는 이유는 밑을 참고.

Unlike copy_(), this function is recorded in the computation graph. Gradients propagating to the cloned tensor will propagate to the original tensor.

c: y = torch.empty_like(x).copy_(x)

이는 y에 gradient가 흐를 수 있으므로, 나머지 셋과 성격이 가장 다르다.

d: y = torch.tensor(x)

a와 동일. 근데 근본적으로 a와 같은데, 왜 이 방법이 추천되지 않는지를 모르겠다.

좀 더 명확하고, 빠른 방법임. 아래 참고.

결론:

Since in general for a copy operation one wants a clean copy which can't lead to unforeseen side effects the preferred way to copy a tensors is .clone().detach().

'Deep Learning > PyTorch' 카테고리의 다른 글

PyTorch contiguous  (0) 2020.06.25
torch.expand() vs. torch.repeat()  (0) 2020.06.20