본문 바로가기

연구/pytorch

[연구 기록] FAN코드와 내 코드를 비교하며 알게된 점

반응형

FAN코드는 Bulat의 How far are we from solving the 2D & 3D Face Alignment problem? 논문의 코드이다.

이 논문은 2D,3D face alignment에서 유명한 논문이며 이 논문의 코드와 내 코드의 비교는 의미있다고 할 수 있다.

 

아래에서 개인적으로 가장 중요하다고 생각하는건 학습 option 설정, Randomness통제, 각 option에 따른 기능 구현이다.

비교사항 논문 코드 내 코드
log 기록 객체화시켜서 각 기능을 구현했다. 구체적이다.
learning rate, train cost, train error, val cost, val error를 epoch 마다 기록했다(loss나 성능관련된건 train, test 할 것 없이 다 기록한 것이다).
공통점은 둘다 파일입출력을 이용했다는 점.
main안에서 두줄로 끝냈다.
train error, test error만 기록했다.
model 저장 가장 마지막 model 만 저장한게 아니라 interval을 지정해서 각 텀마다 model을 저장했다. 이 때 model.state_dict(), optimizer.state_dict(), scheduler.state_dict()를 다 저장. 가장 마지막 model만 저장했다. 이 때 model.state_dict()만 저장했었다.
학습 option 여러 class에 걸쳐서 굉장히 구체적으로 설정할 수 있도록 함. 예를 들어 network, integral, optimizer, hyper parameter, multi-gpu, save_intervals, save_results등을 설정할 수 있다. network, hyper parameter만 설정할 수 있게 했는데, option class를 따로 만든게 아니라 train 함수 안에서 기능을 구현한 것이었다. option 클래스를 따로 만들어서 기능구현하는건 배울 필요가 있다.
Randomness 통제 통제할 수 있는 변인을 최대한 통제하여 실험에서 제대로된 비교결과를 얻고자 했다.

ex) 
cudnn.benchmark = False
cudnn.deterministic = True
np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed(0)
이런 개념은 생각도 못함...
각 Option설정 에 따른 기능(학습방법) 구현 어떤 network를 선택하는지, 어떤 optimizer를 선택하는지, multi-gpu인지 등등... 에 따라서 동작할 방법을 구체적으로 다 명시해놓았다.

==> 이렇게 해놓으면 나중에 SOTA를 목적으로 여러 방법으로 실험할 때 좋을 듯 하다. 이 방법 저 방법을 비교하며 최고의 성능을 뽑아낼 수 있을 것으로 보인다.

귀찮다고만 생각하여 안했지만 나중에 논문낼때 필요한 작업인듯 하다.

 

이 코드와 비교하기 전 마지막으로 내가 작성했던 거지같은 코드는 아래에서 확인할 수 있다.

github.com/chunsungho/pytorch_example/tree/master/Torch_Exam/resnet/resnet_experiment_code

 

chunsungho/pytorch_example

my pytorch tutorial. Contribute to chunsungho/pytorch_example development by creating an account on GitHub.

github.com

 

반응형