이번 학기에 학교에서 프로젝트 중 ESGAN 모델을 써야하는 프로젝트가 있어서 ESGAN을 사용하다가

삽질을 8328483번 정도 했다.

나중을 위해서 후기를 써보겠다.

 

1. git clone github.com/open-mmlab/mmsr.git

 

open-mmlab/mmsr

Open MMLab Image and Video Super-Resolution Toolbox, , including SRResNet, SRGAN, ESRGAN, EDVR, etc. - open-mmlab/mmsr

github.com

 

2. 사전작업

training 시키기 전에 install 해줘야 할 것들을 다 해주자

 

3. dataset 전처리 과정

https://github.com/open-mmlab/mmsr/blob/master/datasets/DATASETS.md

 

open-mmlab/mmsr

Open MMLab Image and Video Super-Resolution Toolbox, , including SRResNet, SRGAN, ESRGAN, EDVR, etc. - open-mmlab/mmsr

github.com

위 링크에서 시키는 대로 dataset를 가공해야한다..

안그러면 tensor shape error 같은게 뜬다..

물론 mmsr이 제공하는 dataset으로 하면 문제 없지만 나처럼 다른 dataset을 가지고 학습을 진행한다면 가공을 해야한다!!!

 

- 쉽게 정리

1) GT  image 준비 - 해상도 좋은 이미지

2) 그 와 이름이 같은 LR image 준비 - 해상도 낮은 이미지 -> data_scripts/generate_mod_LR_bic.py 파일을 이용하여 만드는 것을 추천..

3) 이미지를 crop하기

4) LMDB file 만들기 

5) 테스트 해보기

 

위 과정들을 완료하여야 training을 진행할 수 있다.

 

4. pretrain model 준비

https://drive.google.com/drive/folders/17VYV_SoZZesU6mbxz2dMAIccSSlqLecY 

 

ESRGAN_models - Google 드라이브

 

drive.google.com

위 링크에서 pre-trained 모델을 다운받을 수 있다.

 

5. config 파일 수정

1) dataset 경로 수정하기

2) 진짜진짜 중요한거 -> gpu가 우리는 한개였는데 

gpu_ids: [3] 이거를 [0]으로 바꿔줘야한다.... 이거 때문에 2일을 꼬박 날렸다!!!!

 

6. training 해주기

github에서 하라는대로 training을 해주면 된다.

 

이와 같은 과정과 함께라면 별다른 에러없이 진행될 수 있다. 그럼 안농~

부스트코스에서 진행하는 "파이토치로 시작하는 딥러닝 기초"를 듣고있다.

Part 2를 끝내고 지금까지 배운 것을 가지고 패션 분류기를 만들었다.

코드를 바탕으로 정리하는 것을 목표로 글을 쓰도록 하겠다. 하지만 모든 코드는 공유할 수 없으니 기억해둘 것만,,

 

패션 분류기에 사용할 데이터 셋은 Fashion-Mnist이다.

Mnist와 같이 784차원의 입력과 10차원의 출력이 있다.

1. 코드 초반에는 모듈과 라이브러리들을 import 해준다.

2. batchsize, epochs, learning rate를 정해준다.

이 값들은 초기에 세팅해주는 값들인데 딥러닝을 많이 하다보면 잘 정할 수 있다고 강의에서 말씀해주셨다.

3. dataset과 dataloader를 설정해준다

데이터는 training set과 test set를 구분해서 학습, 검증해야 정확한 accuracy가 나온다.

FashionMNIST 데이터셋을 불러오기 위해 torchvision.datasets을 import 하였다.

import torchvision.datasets as datasets

train = datasets.FashionMNIST(root, train=True, transform, download)
test = datasets.FashionMNIST(root, train=False, transform, download)

train_loader = DataLoader(data, batchsize, shuffle)

이와 같이 train 의 bool 값을 기준으로 나눌 수 있다.

또한 DataLoader(데이터, batchsize, shuffle)를 이용하여 train_dataloader와 test_dataloader를 설정해준다.

 

4. 네트워크 및 모델 설계

이번 실습에서 사용할 네트워크는 MLP(Multi Layer Perceptron)이다.

하나의 퍼셉트론이 아닌 hidden layer를 포함한 신경망이라고 생각하면 되겠다.

이때 activation function은 ReLU를 사용한다.

다른 activation function으로는 Sigmoid가 있지만 이 함수는 미분을 계속하게되면 0으로 수렴하는 값을 내기 때문에

gradient vanishing 문제가 발생할 수 있다. 그래서 좀 덜한 ReLU를 사용한다.

 

각 layer 마다 입력, 출력, batch nomalization, activation function을 지정해줄 수 있다.

입력, 출력에는 특징의 갯수, 즉 차원을 써주면 되고

activation function은 사용할 활성화 함수를 써주면 된다.

batch nomalization은 뭘까?

각 layer를 지날때마다 입력된 분포와 출력된 분포가 달라지고 이에 따라 발생하는 문제를 줄이기 위해 각 mini batch마다 nomalization을 해주는 방법이다. 이 batchnorm은 activation function을 사용하기 전에 사용하는 것이 일반적이라고 한다.

모델을 설계할때는

import torch.nn as nn

model = nn.Sequential(layer, batch_norm, activation_func)

이런 형식으로 설계할 수 있고

model = model.to(device)

이런 형식으로 생성할 수 있다.

device는 gpu 또는 cpu로 설정할 수 있다.

마지막 layer의 activation function은 softmax 함수이다. (현재상황에서는)

하지만 activation_func 자리에 nn.softmax 이런식으로 쓰지않는다.

이유는 6번에서 알려주도록 하겠다.

 

5. weight initialization

weight initialization은 weight를 0으로 초기화하지 않고 적절한 초기화방법을 이용하여 학습의 성능을 높여줄 수 있다.

방법에는 "Restricted Boltzmann Machine", "Xavier", "He" 초기화 방법이 있는데 RBM은 복잡해서 잘 안쓰이고

간단한 Xavier, He를 쓴다. He는 Xavier의 변형된 방법이다.

import torch.nn as nn

#Xavier를 이용한 초기화
nn.init.xavier_uniform_(layer.weight) #이거 혹은
nn.init.xavier_normal_(layer.weight) #이거

 

6. loss function, optimizer 

딥러닝의 궁극적인 목표는 loss 값을 최소로 하는 모델을 만드는 것이다.

loss function에는 cross entropy loss, binary cross entropy 등등이 있지만 여기서의 출력값이 두가지가 아니기 때문에

cross entropy loss function을 쓰도록 했다.

import torch.nn as nn

criterion = nn.CrossEntropyLoss().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

이렇게 쓸 수 있다.

아까 출력 층의 activation function을 써주지 않는 이유를 말하자면

cross entropy loss function이 softmax 기능도 해주기 때문이다!!

 

optimizer는 gradient를 최적화 해주는 친구이다.

optimizer의 종류에는 Adam, SGD(Stochastic Gradient Descent) 등이 있는데 SGD는 Adam에 비해 느리다고 배웠다..

그래서 Adam을 사용했다. optimizer에게는 모델의 변수들과 학습률을 알려줘야한다. lr는 이미 정해둔 값이다.

 

7. train

training 시키는 단계이다.

epoch만큼 돌면서 batch size만큼 가져와서 학습을 시킨다. 

학습을 시키는 단계는 다음과 같다.

output = model(X) # 예측값 구하기
cost = criterion(output, Y)  # loss 값 구하기

optimizer.zero_grad() # 이전 계산된 gradient 초기화
cost.backward() # gradient 계산
optimizer.step() # 모델의 parameter들 학습

 

8. test

model.eval() # test 하겠다
with torch.no_grad():
	블라블라~~

이런식으로 진행한다.

torch.no_grad()는 진행하면서 gradient 학습을 하지 않겠다는 말이다.

당연한 얘기겠지??

 

이런 단계를 가지고 코드를 짰고

결과는

 

 

높은 accuracy를 가지고 잘 진행되었다.

내가 위에 적은 코드는 정말 최소~로 필요한 코드기 때문에 기본기만 훑었다고 생각하면 될 듯 하다.

인공지능에 대해 아무것도 몰랐지만 그래도 부스트코스덕분에 100중에 0.5는 안 것 같다. 설명 진짜 잘하신다!

땡큐 부스트코스~!~!

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

[ESRGAN] 삽질 후기  (2) 2020.05.31