Hayden's Archive

[AI/딥러닝/Python-pytorch] Colab(코랩) / MNIST를 활용한 Fully Connected Network 코드 본문

Study/AI & Math

[AI/딥러닝/Python-pytorch] Colab(코랩) / MNIST를 활용한 Fully Connected Network 코드

_hayden 2020. 7. 29. 17:53

코랩 설치 및 설명 참고 : https://theorydb.github.io/dev/2019/08/23/dev-ml-colab

 

[Colab] Google Colab (코랩) 환경설정 및 사용법

개요 파이썬을 활용한 머신러닝의 첫 관문! 구글 Colab(코랩)의 환경구성 및 기본 사용법을 다룬 포스트입니다. 목차 Colab이란 무엇인가? Colab 환경설정 Colab을 활용한 간단한 예제 작성 Colab & Markdow

theorydb.github.io

 

환경 설정

 


코드를 보기 전 이해를 돕기 위한 그림

Loss Function
MSE (정량화된 값일 때)
Cross Entropy Loss (분류일 때)

1장도 시간 엄청 많이 걸리는데 6만장 동시에 못함. 그래서 쪼개서 돌려야 하는데 그게 batch size임. 

epoch 1 -> 학습 1번...
epoch 100 -> 보통 학습 100번은 해야 함... GPU 안 쓰면 안 돌아감.


하이퍼파라미터, DataLoader

input_size와 num_classes는 엄밀히 따지면 하이퍼파라미터 아님. 원래부터 정해져 있고, 인간이 조정할 수 없음.

epoch는 학습 횟수와 관련된 것으로 기본적으로 100번 이상은 돌아야 하지만, 시간이 너무 오래 걸리므로 여기서는 5번 돈다.

 

1단계) 로컬에 물리적으로 저장
- Test DataSet과 Training DataSet을 분리해서 따로 저장. train을 기준으로 True면 트레이닝 데이터, False면 테스트 데이터.
- 이 때 ToTensor()를 쓰는데 역할
    1) 모든 값들이 0~1 사이의 안정적인 값의 분포를 갖도록 255로 나눠서 스케일링함(값이 들쭉날쭉하지 안혿록 분산을 작게 가져간다, Variance(변화량)를 낮춤. -> Overfitting을 막기 위함)
    2) Tensor 타입으로 바꿔줌
    3) (3, 32, 32) 이렇게 파이토치에서는 내부적으로 RGB 채널이 맨 앞에 와 있게 되는데 맨 앞에 있는 RGB 채널을 맨 뒤로 보내줌.(그래서 reshape 안해줘도 됨)

2단계) 저장된 것을 읽어들여서 Forward Propagation을 할 것임.
- 이 때 batch size를 쓰는데 역할
    1) 한꺼번에 로딩되면 Computation Cost에 영향을 미쳐서 못 읽어들임. 그래서 batch size 별로 나눔.
    2) batch size를 쓰면 퍼포먼스를 훨씬 높일 수 있음.
       batch size 안 돌리는 것 => 문제 6만개 풀고, 1번 채점
       batch size를 100으로 하고 돌리는 것 => 문제 100개 풀고, 600번 채점
      학습을 하는 게 batch size 단위로 하게 됨. batch size별로 부분적으로 학습을 하고 전체적인 학습 1번이 1 Epoch이 됨.

 

모델을 만들 때 nn.Module을 상속받아야 한다.

__init__ 함수는 자바에서의 생성자 함수와 같다.

forward 함수는 Forward Propagation 하는 순서를 만들어놓은 것이다.

* 활성화 함수가 오는 위치

- 출력으로 가기 전에, 더 정확히는 Hidden Layer로 가기 전에 ReLU 함수를 써서 선형을 비선형으로 만들어줌. 역치 이상의 값은 내부적으로 알아서 정함. 마지막 최종적인 출력으로 가기 전에는 ReLU 함수를 쓰지 않음.

=> 결론 > 활성화 함수는 Hidden Layer 직전에 쓴다.

-> 참고 : 최종적인 출력 직전에 Sigmoid를 쓸 때가 있긴 함. Binary Classification에서 Softmax를 못 쓰고 Sigmoid를 쓰는데, 이 때는 활성화 함수로 쓰이는 게 아니라 그렇다, 아니다로 나눠줄 뿐.
딥러닝에서 그래프의 파형을 보는 게 도움이 됨.
ReLu 함수 그래프의 파형을 기억. 0 이상이 들어오면 발산, 음수가 들어오면 0으로 수렴
시그모이드 파형도 알아두면 좋음.

 


인스턴스화

model을 정의하고 forward()를 호출한다. model.forward(images)에서 forward는 생략 가능해서 model(images)로 쓸 수 있다.

실제로는 Loss가 줄어들기만 하지 않고 오른쪽과 같이 변화를 보이며 전반적으로는 내려감

 

 

* 여기까지의 과정 정리

1. Data Load
2. 모델 만든다. (nn.Module을 상속받음)
3. 위에서 정의된 모델에서 forward() 호출하고, 예측값을 리턴받는다.
4. 예측값과 결과값을 비교해서 Loss 값을 구한다.
5. step() - 학습한다.

 


Model Test

트레이닝할 때는 Loss를 구해야 하는데, 테스트할 때는 Loss 구할 필요 없음.

테스트할 때는 학습하지 않으므로 Back Propagation하지 않아도 되고, 그러므로 미분하지 않아도 됨. 굳이 안 해도 되는데 하면 속도가 느려지므로 하지 않게 함. 

기본적으로 backpropagation 중요한 부분... 필수!! 학습에 있어서 필수.
메모리... 이 부분이 동작할 수 있도록 메모리를 훨씬 더 많이 할당... (지금 당장 필요하지 않는 공간 확보를 미리 해놓는다. 메모리를 따로 빼놓는다.)
하지만, 아래의 코드를 해주면... 메모리를 따로 빼두는 부분을 생략.
==> 결론 : 하는 것과 안 하는 것의 속도 면에서 크게 차이가 난다. 
with torch.no_grad():
	some code
	# --> code 부분에서는 gradient 사용하지 않겠다.
	# Back Propagation 하지 않겠다

 

torch.set_grad_enabled(False) 로도 쓸 수 있다.

참고 :  https://pytorch.org/docs/master/generated/torch.set_grad_enabled.html

 

 

위를 보면 Softmax를 사용하지 않았음.