본문 바로가기

프로그래밍/AI:ML:DL

[PyTorch] Tensors and Variables have merged

728x90

위키북스의 PyTorch 를 활용한 머신러닝, 딥러닝 철저입문 (코이즈미 사토시) 을 따라하다가.

예제코드에 아래와 같이 torch.Tensor 를 autograd.Variable 로 형변환시키는 코드가 있었다. 책이 2018년 1월의 pytorch api 를 기준으로 하면서, 최신 버전과 api 사용에 사소한 차이가 있는 듯 하다.

for epoch in range(300):
	
    # 계산 그래프 구성
    train_x, train_y = Variable(train_x), Variable(train_y)
    
    optimizer.zero_grad()
    # ...

 

다른 튜토리얼에서는 필요가 없었기 때문에 의문을 가지고 있었는데, 역주를 보니 Variable 이 deprecated 예정이었다. 2020년 1월 현재 1.2.0 에서 별 이상없이 동작하는 것 같았으나 궁금해서 검색을 해 보았다.

아래 링크에 관련 설명이 좀 있고, 일부를 조금 번역해 본다.

https://pytorch.org/blog/pytorch-0_4_0-migration-guide/

 

PyTorch

An open source deep learning platform that provides a seamless path from research prototyping to production deployment.

pytorch.org

MERGING `TENSOR` AND `VARIABLE` AND CLASSES : TENSOR 와 VARIABLE 합치기, 그리고 클래스들

torch.Tensor 와 torch.autograd.Variable 은 이제 같은 클래스이다. 더 정확히는, torch.Tensor 가 이제 과거의 Variable 처럼 히스토리 트래킹이 가능하다. Variable 래핑은 이전처럼 계속 동작하지만, torch.Tensor 객체를 반환한다. 이제 코드 여기저기 Variable 래핑이필요억다는 말이다.

...

When does `autograd` start tracking history now?  : 그럼 `autograd` 가 언제 히스토리 추적을 시작하나?

`autograd`의 중추적 플래그였던 `requires_grad` 가 이제 `Tensor`의 어트리뷰트이다. 이전에 Variable 에 적용되던 동일한 룰이 적용된다. 즉, `requires_grad=True`로 주어졌다면 인풋텐서의 히스토리가 추적된다.

...

What about `.data`? : 그럼 `.data` 는 어떻게 하나?

이전에는 `.data` 로 Variable 밑에 있던 Tensor 를 가져왔었다. 합쳐진 이후에는 y = x.data 도 비슷한 의미를 갖는다. 즉, y 는 x 와 데이터를 공야하는 Tensor 이고, x의 계산 히스토리와는 관계가 없으며, requires_grad=False 가 된다.

하지만, `.data` 가 안전하지 않은 경우도 생긴다. `x.data` 의 어떤 변화도 `autograd` 를 통해 추적되지 않을 것이고, x 가 백워드 패쓰에 필요한 경우는 계산 그레디언트가 부정확할 것이다. 더 안전한 방법은 x.detach() 를 사용하여, requires_grad=False 인 데이터를 공유고, autograd 로 in-place 변경도 리포트 받을 수 있는 텐서를 반환받아 사용하는 것이다.

원 링크의 코드 참조하세요.