1 minute read

출처

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

1
2
3
4
5
6
7
8
9
10
# x = some tensor

y = tensor.new_tensor(x) # 1

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

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

y = torch.tensor(x) # 4

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

1. y = tensor.new_tensor(x)

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

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

2. y = x.clone().detach()

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

1
2
3
4
5
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.

3. y = torch.empty_like(x).copy_(x)

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

4. y = torch.tensor(x)

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

추가:

image

결론:

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().

Categories:

Updated:

Leave a comment