Hayden's Archive
[AI/딥러닝/Python-pytorch] Colab(코랩) / MNIST를 활용한 Fully Connected Network 코드 본문
[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
환경 설정
코드를 보기 전 이해를 돕기 위한 그림
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를 사용하지 않았음.