본문 바로가기
Study/DL

[파이썬 딥러닝 파이토치] Part 4. CNN

by hyeon827 2024. 1. 14.

[예제 4-1] CIFAR-10 데이터를 이용해 MLP 설계하기

 

#1: PyTorch 모듈 중 인공 신경망 모델을 설계하는데 필요한 함수를 모아둔 모듈

#2: 'torch.nn' 모듈 중에서도 자중 이용되는 함수 'F' 지정

#3: 컴퓨터 비전 연구 분야에서 자주 이용되는 'torchvision' 모듈 내의 'transforms', 'datasets' 함수 임포트

 

 

GPU 사용(계산속도가 빠르기 때문에 딥러닝 모델의 파라미터 값을 빠르게 업데이트 가능)

 

BATCH_SIZE = 32  : Mini-batch 1개 단위에 대해 데이터가 32개로 구성

EPOCHS : 존재하고 있는 Mini-batch를 전부 이용하는 횟수

 

CIFAR10 데이터 다운로드

 

transform

  • MLP의 Input으로 이용되기 때문에 ToTensor() 메서드 이용해 Tensor 형태로 변경
  • 또한, 한 픽셀은 0~255 범위의 스칼라 값으로 구성 -> 이를 0~1 범위로 정규화

shuffle

  • 데이터의 순서를 섞고자 할 때 이용
  • 특정 Label에 매칭된 이미지 데이터의 특징을 보고 학습하는 것이 O
  • 특정 이미지 데이터에 매칭된 Label 값만을 집중적으로 학습 X

 

X_train 

  • 3개의 이미지 데이터가 1개의 Mini-Batch 구성
  • 가로 32개, 세로 32개의 픽셀로 구성
  • 채널 3개(Red , Green, Blue) - 컬러 이미지

y_train : 32개의 이미지 데이터 각각에 대해 Label 값이 1개씩 존재

 

#1: 딥러닝 모델 관련 기본 함수를 포함하고 있는 nn.Module 클래스를 상속받는 Net 클래스 정의

#2: CIFAR-10 이미지 데이터 Input를 위해 32*32*3 크기의 노드 수 설정

#3: CIFAR-10 Dataset은 총 10가지 클래스로 구성 -> Output의 노드 수 10개

#4: MLP 모델은 1차원의 벡터 값을 입력을 받을 수 있음(2차원 -> 1차원)

 

#1: 'DEVICE' 장비를 이용해 MLP 모델을 완성하기 위한 것

#2: Back Propagation을 통해 파라미터를 업데이트 할 때 이용하는 옵티마이저 정의(Adam)

#3: MLP 모델의 output 값과 원-핫 인코딩 값과의 Loss는 CrossEntropy 이용해 계산

 

#1: 기존에 정희한 MLP 모델을 학습 상태로 지정

#2: 해당 train_loader 내에 Mini-Batch 단위로 저장된 데이터를 순서대로 이용해 MLP 모형 학습

#3: Mini-Batch 내에 있는 이미지 데이터를 기존에 정의한 장비에 할당

#4: Mini-Batch 내에 있는 이미지 데이터와 매칭된 레이블 데이터도 기존에 정의한 장비에 할당

#5: Optimizer의 Gradient 초기화

#6: 장비에 할당한 이미지 데이터를 MLP 모델의 Input으로 이용해 Output 계산

#7: CrossEntropy를 이용해 Loss값 계산

#8: Loss 값을 계산한 결과를 바탕으로 Back Porpagation을 통해 계산된 Gradient 값을 각 파라미터에 할당

#9: 각 파라미터별로 할당된 Gradient 값을 이용해 파라미터 값 업데이트

 

#1: MLP 모델을 평가 상태로 지정

#2: test_loader 내에 있는 데이터를 이용해 Loss 값을 계산하기 위해 test_loss를 0으로 임시 설정

#3: MLP 모델이 올바른 Class로 분류한 경우를 세기 위해 correct = 0으로 임시 설정

#4: MLP 모델을 평가하는 단계에서는 Gradient를 통해 파라미터 값들이 업데이트되는 현상을 방지

#5: 계산된 Output과 레이블 데이터를 기존에 정의한 CrossEntropy를 이용해 Loss 값 계산 후 test_loss에 더해 업데이트

#6: 계산된 벡터 값 내의 가장 큰 값인 위치에 대해 해당 위치에 대응하는 클래스로 예측

#7: 예측한 클래스 값과 실제 레이블이 의미하는 클래스를 비교해 맞으면 correct에 더해 올바르게 예측한 횟수 저장

#8: 현재까지 계산된 test_loss 값을 test_loader 내에 있는 Mini-Batch 개수만큼 나눠 평균 Loss 값 계산

#9: 정확도 계산

 

[예제 4-2] CIFAR-10 데이터를 이용해 CNN 설계하기

 

#1: 2차원의 이미지 데이터를 nn.Conv2d 메서드를 이용해 Convolution 연산

#2: 이미지의 채널 수와 동일하게 채널 수를 '3'으로 설정

#3: Convolution 연산을 진행하는 Filter 개수 설정. 설정해주는 Filter 개수만큼 Output의 depth 정해짐

#4: Filter의 크기 설정

#5: Padding

#6: #1에서 설정한 Filter를 이용해 생성된 Feature Map과 Convolution 연산

#7: #3에서 '8개'로 설정 -> Feature Map 채널 수와 동일하게 채널 수 '8'로 설정

#8: 2차원의 Feature Map 내에서 지정한 크기 내 가장 큰 Feature Map 값만 이용

#9: 생성된 Feature Map 내 2*2 크기의 Filter가 돌아다니면서 가장 큰 Feature Map 값 추출

#10: MaxPooling하는 과정에서 Stride

 

[convolution 연산 -> ReLU 함수 -> MaxPooling] => [1차원 데이터로 변환] =>  [Fully Connected Layer 통과]