학습을 끝내고 성능 테스트 때 괜찮은 성능을 보였다.

그런 모델을 저장하고, 다른 코드에서 load_state_dict 으로 불러들여서 사용하려한다.


근데 모델을 저장하기 전 성능이 나오질 않는다.


이럴 땐 일부 레이어를 list 안에 넣어놨는 지 의심해야한다.

model 클래스는 다 nn.Module을 상속해서 정의하는데,

self의 속성으로 레이어를 직접 정의하지 않고,

self.layers = [nn.Linear, nn.Conv2D 등..] 식으로 저장하고 사용했다면

위와 같은 문제가 발생한다.


그 이유는 list로 저장해두면 모델 저장 시, 이 레이어들이 인식되지 않는다.

그래서 list안의 레이어들만 빼놓고 나머지 layer들의 weight만 저장된다.


이에 따라 다른 코드에서 load_state_dict 시, list 안의 layer는 학습되지 않은 날 레이어들이 된다.


이 문제는 nn.ModuleList로 해결 가능하다.

위의 self.layers를

self.layer_module = nn.ModuleList(self.layers)

과 같이 선언하고

self.layer_module을 list처럼 쓰면 말끔히 해결한다. (리스트 처럼 인덱싱 가능, +로 이어 붙이기도 가능)


이걸 몰라서 정말 많은 고생을 했다....

'실습 > pytorch' 카테고리의 다른 글

Pytorch eval 성능 문제  (0) 2018.11.08
PyTorch GPU check  (1) 2018.08.29
pytorch 메모  (0) 2018.03.11

eval 모드로 학습한 네트워크를 실험해보면

성능이 엄청나게 낮아지는 현상을 발견했다.


처음엔 그냥 학습이 안되서 그런건 줄 알았는데,

진짜 일주일 동안 별짓 다하다가 pytorch의 버그라는걸 알게됬다.


검색해보니 이미 유명한 버그다.

문제는 batchnorm 얘 때문이다.

eval 할 때 momentum 값이 제대로 초기화되지 않아서 발생하는 것 같다.

pytorch 1.0이 새로 나왔던데, 해결했는지는 모르겠다.

그 전의 최신버전은 0.4.1 버전도 이 문제를 갖고있다.

화남


그리고 이번에 여러 네트워크를 동시에 사용하려 했는데,

여러 네트워크를 정의해도 위처럼 성능이 저하되는 문제를 발견했다.

진짜 이건 이유를 모르겠다. 해결법도 모르겠어서 분석중이다..


'실습 > pytorch' 카테고리의 다른 글

load_state_dict 성능 문제, [nn.ModuleList]  (2) 2018.11.08
PyTorch GPU check  (1) 2018.08.29
pytorch 메모  (0) 2018.03.11

import torch


torch.cuda.is_available()

True

torch.cuda.current_device()

0

torch.cuda.get_device_name(0)

'GeForce TITAN X'

'실습 > pytorch' 카테고리의 다른 글

load_state_dict 성능 문제, [nn.ModuleList]  (2) 2018.11.08
Pytorch eval 성능 문제  (0) 2018.11.08
pytorch 메모  (0) 2018.03.11

pytorch 또한 tensorflow와 같이 텐서의 연산으로 이루어짐

둘 다 numpy 행렬을 주로 사용함


tensorflow는 연산 전에 미리 노드 그래프를 만듦

pytorch는 동적으로 그래프를 만듦

이러한 차이로, pytorch는 print 문을 이용하여 tensor들의 값을 출력할 수 있음 (tensorflow에서 eval 함수와 비슷)


pytorch에는 일반 Tensor (e.g. torch.cuda.FloatTensor)와 Variable (e.g. torch.autograd.variable.Variable)이 있는데,

Tensor에 유틸기능을 씌운 것을 Variable로 볼 수 있음. (기울기 계산 등의 연산을 쉽게 수행)

기본적으로 Tensor와 Variable끼리의 연산은 불가하다.

Variable(Tensor)로 Variable을 만들 수 있고,

반대로 Variable.data로 Tensor를 꺼낼 수 있음


서로 다른 클래스(타입)의 텐서 끼리는 연산할 수 없음 (DoubleTensor * FloatTensor = 에러, 형변환 필요)

Tensor * Tensor 등의 사칙연산은 Tensor.mul(Tensor) 등으로 자동 치환됨


torch.from_numpy() : numpy -> Tensor (numpy가 float이나, double일 때 DoubleTensor가 되고, int일 때 LongTensor가 된다.)

Tensor.float() : FloatTensor로 캐스팅


Tensor.size() : 텐서의 shape을 출력. (tensorflow에서 tf.shape() or get_shape())

F.cross_entropy() : 자체적으로 softmax를 포함한다.

Tensor.cuda() : GPU로 데이터를 올림 (cuda에 올라간 데이터는 gpu연산을 수행)

Tensor.cpu() : CPU로 데이터를 올림




---

dataloader 정의 시

pin_memory는 메모리 사용량과 관계없음


test 시 입력 Variable에 volatile=True 인자를 추가해줘야함. (추가 안하면 메모리가 폭발함. 안쓴거랑 3000메가 정도 차이나는 경우도 봤음)


'실습 > pytorch' 카테고리의 다른 글

load_state_dict 성능 문제, [nn.ModuleList]  (2) 2018.11.08
Pytorch eval 성능 문제  (0) 2018.11.08
PyTorch GPU check  (1) 2018.08.29

+ Recent posts