연랩

[Microsoft AI School 6기] 2/7(33일차) 정리 - ResNet, CNN, FCL, Pytorch, Torchvision 본문

MS AI school 6기

[Microsoft AI School 6기] 2/7(33일차) 정리 - ResNet, CNN, FCL, Pytorch, Torchvision

parkjiyon7 2025. 2. 7. 17:44

파이썬으로 배우는 딥러닝(Deep Learning)

 

 

전이 학습과 ResNet

 

 

전이 학습

 

전이학습(Transfer Learning)

전이학습 의미 : 한 분야의 문제 해결을 위해 얻은 지식/정보를 다른 문제 해결에 사용

딥러닝 분야의 전이학습 : 하나의 작업을 위해 학습된 신경망 모델을 유사한 다른 작업에 적용시키는 것을 의미함

 

권진욱 강사님 강의 자료

 

 

CNN 모델은 네트워크 깊이에 따라 서로 다른 종류의 feature들을 학습함

전이학습을 사용하여 새로운 데이터세트로 학습 à 깊은 계층의 파라미터를 조정 가능

잘 훈련된 모델이 새로 구성하려는 모델과 유사한 경우, 짧은 시간 내에 높은 정확도 달성 가능

 

전이 학습

 

- 얕은 layer에서 깊은 layer로 갈수혹 구체적인 특징 추출

 

전이 학습

 

전이 학습 방법

Transfer Learning : 최종 Layer의 파라미터(가중치)를 조정(업데이트)

Fine-Tunning : 모든 Layer의 파라미터(가중치)를 미세 조정 – 초기값은 사전 학습된 모델의 파라미터 사용

 

전이 학습

 

Filter와 FCL를 변형하여 사용 -> low level filter는 그대로 사용, high level만 변경 -> 여러 부분 transfer하여 사용

frozen: 사전 학습된 모델

 

 

ResNet

 

사전 학습된 신경망 : ResNet

ILSVRC(ImageNet Large Scale Visual Recognition Challenge) : 2010년에 시작된 ImageNet 인식 경진대회

ImageNet : 1000가지 사물로 이루어진 100만개 이미지 데이터

 

ResNet - ILSVRC 우승 모델 분류 에러율(%)

 

ResNet 부터 인간의 인식률과 유사

 

사전 학습된 신경망 : ResNet50

ResNet50 : 50개의 layer로 구성된 CNN

ImageNet 데이터세트의 이미지(100만개 이상의 이미지)에 대해 사전 학습된 모델

 

  • 다양한 이미지를 대표하는 많은 특징을 학습하여 키보드, 마우스, 연필, 각종 동물 등 1000여개의 사물로 분류 가능
  • 224 x 224 크기의 이미지를 입력으로 사용함
  • 새로운 이미지 분류에 활용하기 위해 Fully-Connected layer를 수정해야 함
  • 최종 출력은 1000개에서 2개로 수정하여 전이학습에 사용 예정

 

ResNet

 

ResNet – Residual Block, Bottleneck 구조

Vanishing Gradient 문제를 피하기 위해 shortcut connection을 추가한 Residual Block을 사용

층을 깊게 쌓을 때 발생할 수 있는 성능저하(파라미터 수, 연산량 증가)를 막기 위해 BottleNeck 구조를 사용함(1x1 convolution을 사용하여 채널/차원 축소, 비선형성 증가, 과적합 방지)

 

Residual Block, Bottleneck 구조 - 권진욱 강사님 강의자료

 

shortcut data 데이터를 추가하여 과적합 완화

 

ResNet50 – Bottleneck 구조

ResNet50은 ResNet34와 달리 bottleneck 구조가 적용됨

 

ResNet – Downsampling

BasicBlock이나 Bottleneck 출력을 결정할때 F(x) 와 x 의 텐서 사이즈가 다를때 Downsampling을 사용함

 

ResNet – Dropout

뉴런이라 부르는 노드를 무작위로 껐다 켰다를 반복하는 것을 Dropout이라 함

  • Overfitting 방지
  • 학습 시간 단축
  • 매번 다른 형태의 노드로 학습하기 때문에 여러 형태의 네트워크들을 통해서 앙상블 효과 얻음

 

ResNet50 – Layers

총 50개의 layer를 가지고 있으며, 각 conv에 있는 행렬( [ ] )이 residual block 임

ResNet50은 layer마다 다른 residual block 형태가 반복되어 학습됨

 

권진욱 강사님 강의 자료

 

ResNet50 – Residual Block 구성

 

권진욱 강사님 강의 자료

 

ResNet50 적용 방법

암석 이미지 식별 실습을 위해 Python의 PyTorch를 이용함

PyTorch의 라이브러리 중 하나인 TorchVision에서 ResNet50 등 사전 학습된 이미지 인식 모델 제공

TorchVision은 dataset, models, transforms 등 다양한 하위 라이브러리를 제공함.

 

ResNet50 적용 방법

1) ResNet50 : torchvision.models의 ResNet에서 모델 제

2) pretrained=True로 하이퍼파라미터 설정 -> 사전 학습된 ResNet50 모델 사용. Pre-trained 모델을 사용하면 사전 학습된 가중치, 편향 등의 파라미터를 사용함. model = models.ResNet50(pretrained=True

3) Input size가 다른 경우 ResNet50의 적용 : 이미지의 변환 필요 ResNet50 모델의 입력은 224 x 224 이므로 torchvision.transforms.Compose()를 사용하여 변환

 

ResNet50 살펴보기 – 첫 convolution/pooling

ResNet50의 layer 블록 별로 구성을 살펴본다

 

권진욱 강사님 강의 자료

 

Max Pooling (최대 풀링):

합성곱 신경망(CNN)에서 사용되는 다운샘플링(downsampling) 기법으로, 입력 특성 맵(feature map)에서 특정 영역의 최대값(maximum value)을 추출하여 공간 크기를 줄이는 데 사용

 

ResNet50 살펴보기 – Fully-Connected layer / 수정할 곳

Fully Connected Layer : 한 layer의 모든 뉴런이 그 다음 layer의 모든 뉴런과 연결된 구조를 의미함. 1차원 배열의 형태로 평탄화된 행렬을 통해 이미지를 분류.

-> Average Pooling(AdaptiveAvgPool2d)을 통해 output 사이즈를 (1, 1)로 평탄화 후, 활성화 함수로 Relu 적용. Dropout 적용 후, 마지막 활성화 함수로 LogSoftmax 함수 사용

 

정리

 

정리

 

암석식별 머신 실습

 

데이터 수집/이해

 

NASA가 공개한 달 암석 이미지 수집

달 암석 이미지는 NASA의 Curation 페이지에서 찾을 수 있음

- 현무암 이미지 확인 가능

 

Basalt 이미지

 

- 고지대 암석 확인 가능

 

Highland

 

 

모델링 환경 이해

 

AI 프로젝트를 위한 Python 라이브러리

Matplotlib

  • 데이터의 시각화에 사용되는 패키지. 다양한 저수준 API 제공
  • PyPlot : matplotlib의 서브 패키지. 간단한 시각화를 위한 API 제공

 

NumPy

  • Numerical Python을 줄여서 표기한 것
  • 수학 및 과학 연산을 위한 패키지
  • 수치해석 및 통계 분야에 널리 사용됨

 

PyTorch

  • AI 라이브러리로서 신경망을 만들기 위한 함수들 제공

 

Torchvision

  • Pytorch와 함께 사용되는 computer vision용 라이브러리
  • 효율적인 이미지 및 비디오 변환을 위한 유틸리티와 사전 학습된 모델 및 데이터 세트 제공 (별도로 설치해서 사용해야 함)

GitHub

GitHub 페이지 접속 > Code > CodeSpaces > Open in codespace > ClassifySpaceRockCode.ipynb

 

 

모델링

 

파이썬 코딩 실습 절차

 

1) 설정 및 데이터 로딩 함수 준비

- 필요한 라이브러리 import

- 데이터 디렉토리, 분할 비율, 변환 방법 설정

- 데이터 로딩 함수 작성(로딩 코드 연습, 로딩 함수 작성)

- 샘플 이미지 로딩 및 확인

 

2) 모델링/평가: FCL 수정

- Compute device 결정(GPU, CPU)

- ResNet50모델 지정(사전 학습)

- FCL 설정(layer, 손실함수, 최적화 함수)

 

3) 모델링/평가: FCL 학습 테스트

- 학습/테스트 변수 설정(에폭, 학습 단계 )등

- 학습/검증/평가 구현

- 평가 결과 확인

- 모델 저장

 

4) 암석 이미지 예측

- 학습된 모델 불러오기

- 이미지 예측 함수 작성

- 이미지 예측

 

 

라이브러리 import

 

pip install torchvision

pip install torch 

후 라이브러리 import

 

라이브러리 import

 

데이터 디레토리, 분할 비율, 변환 방법 설정

 

데이터 디레토리, 분할 비율, 변환 방법 설정

 

ResNet이 처리하는 이미지는 224*224로 지정되어 있기 대문에 이에 맞춰서 이미지를 변경

-> 신경망이 처리할 수 있도록 tensor로 변경

-> CNN은 tensor 구조의 연관관계 확인 가능

 

이미지 변환 확인

 

이미지 변환 확인

 

데이터 로딩 함수 - 연습 : 데이터 세트 폴더 등 지정

데이터 로더(loader) 생성을 위한 함수 작성을 위해 코드를 여러 블록으로 나누어 실행

 

데이터 로딩 함수

 

일단은 로딩을 다 하여야 하기 때문에 길이가 155로 통일

 

데이터 로딩 함수 - 연습 : 인덱스 섞기

 

데이터 로딩 함수

 

- 데이터의 순서를 랜덤하게 지정

-> 추출 시 랜덤하게 분할하는 효과

 

분할 지점 계산 - 분할 비율에 따른 지점의 인덱스 값(split)을 계산

 

split 계산

 

분할 비율(valid_size = 0.2)에 따른 분할 지점 계산

split으로 확인하면 어디가 0.2가 되는 지점인지 알 수 있음

 

분할 지점 계산 - split을 기준으로 학습 데이터와 테스트 데이터 인덱스를 나눔

 

 

 

split으로 찾은 해당 부분 뒷부분 부터 train으로 쓰겠다는 의미이다.

-> 즉, 인덱스를 20%가 되는 지점에서 분리하고, 앞의 인덱스에 적용된 데이터들은 train, 뒤의 인덱스들은 test로 쓰겠다는 의미이다

 

권진욱 강사님 강의 자료

 

샘플러 및 로더

 

샘플러 및 로더

 

샘플러는 데이터셋에서 어떤 방식으로 데이터를 선택(샘플링)할지를 정의
- 기본적으로 데이터는 순서대로 가져올 수 있지만, 샘플링 전략을 커스터마이즈하고 싶을 때 sampler를 사용

- 인덱스 값으로 이미지를 pick함

 

데이터 로더는 데이터를 배치(batch) 단위로 나누고, 반복(iteration) 가능한 형태로 제공

- 로더는 실제로 이미지를 load

 

데이터 로딩 함수 – 데이터 로딩 함수 작성

연습한 코드를 묶어서, 데이터 분할 및 샘플러를 포함하는 데이터 로딩 함수 작성

 

함수로 제작

 

- 데이터 사이즈 조절 등 변경

- 이미지를 분할하여 test와 train으로 나누어줌

- sampler와 loader 사용하여 이미지 load

 

데이터 로딩 함수 확인

만든 load_split_train_test() 이용하여 trainloader, testloader 생성

 

데이터 로딩함수 확인

 

샘플 이미지 로딩 및 확인 – 이미지/레이블 가져오기 함수

 

이미지/레이블 가져오기 함수

 

이미지를 불러와서 해당 만큼 indices 생성 후 shuffle

-> 지정한 개수(num) 만큼 별도의 인덱스 생성

-> num 만큼 이미지 pick

-> DataLoader는 미니 배치 단위로 데이터를 반환하는 역할

batch_size=num으로 설정했으니, 데이터셋에서 num개의 데이터를 한 번에 반환할 준비가 되어 있음

DataLoader는 기본적으로 이터러블(iterable) 객체 -> 데이터를 반환하려면 반드시 이터레이터를 생성하거나 반복문(for)을 사용

 

 

DataLoader는 이터러블이라 for 루프를 돌릴 수도 있지만, 여기서는 "딱 한 번" 데이터를 가져오는 게 목적 -> 따라서 iter(loader)로 이터레이터를 명시적으로 만들어 next()로 한 번만 데이터를 가져오게 

--->

 

  • batch_size=num이므로 한 번에 원하는 개수만큼 데이터를 가져오게 설정되어 있음
  • 그러나 DataLoader는 이터러블 객체라서 데이터를 가져오기 위해서는 이터레이터 또는 반복문이 필요
  • 여기서는 "데이터를 한 번만 가져온다"는 것을 코드로 명시하기 위해 이터레이터와 next()를 사용

 

iterator 이해

 

iterator 이해

 

샘플 이미지 로딩 및 확인 - 이미지/레이블 표시

 

 

이미지/레이블 표시

 

결과

 

 

Compute Device 확인

 

compute device 확인

 

ResNet50 모델 지정

 

모델 지정

 

Fully Connected Layer(FCL) 수정 (전이학습)

ResNet에 FCL을 연결해야 함

- 사실 이미 연결되어 있으나, 우리의 모델은 수정이 필요함

ResNet 50: 1000여 개로 분리하는 모델

CNN에서 FCL 연결이 2048개 output node가 1000여개

이를 input 2048 -> 512 -> output 2개로 만드는 것이 목

 

FCL 수정

 

FCL 확인

 

FCL 확인

 

FCL 학습 – 학습/테스트 변수 설정

에폭, 학습단계 등 학습/테스트를 위한 변수를 설정함

 

모델의 학습/검증을 위한 변수 설정

 

Fully Connected Layer(FCL) 수정 (전이학습)

 

코드

 

이를 그래프로 결과를 확인하면 다음과 같다

 

결과 확인

 

파라미터 변경하여 모델 수정 가능)

학습률, epoch, 전결합층 늘리기, 드롭아웃 비율 수정

epoch=50으로 한 결과는 다음과 같다

 

결과 확인

 

FCL 학습/테스트/평가 – 결과 확인

학습/테스트 완료된 모델을 저장하면 추후 불러 와서 사용 가능함

 

model

 

 

예측

 

학습된 모델 불러오기

이미지 예측을 위해 학습/테스트 완료된 모델을 load 한다

 

모델 불러오기

 

이미지 예측 함수 작성

이미지 예측 함수 작성 : predict_image()

 

이미지 예측 함수

 

이미지 데이터 예측

 

이미지 예측

 

이미지 레이블의 암석 이름은 정답

뒤의 True/False는 답을 맞춘 유무를 나타낸다

 

 

오늘의 간단한 후기

 

오늘은 뭔가 억까를 많이 당한 것 같다... 갑자기 한글이 안나와서 놀랐는데 alt+shift를 누르면 해결된다는 사실을 처음 알게되었다. 또한, 코드를 똑같이 썼는데 에러가 발생하는 오류가 생겨서 그것을 해결하느라 애를 먹었다(여전히 무엇이 잘못되었는 지는 모른다). 그래도 코드를 통해 pytorch도 써보고 여러 AI 툴을 써서 코드를 작성하는 것은 많은 도움이 되는 것 같다.

 

 

 

출처

 

[1] MathWorks, "전이 학습(Transfer Learning)," *MathWorks*, https://kr.mathworks.com/discovery/transfer-learning.html (accessed Feb. 7, 2025).

[2] Data Hacker, "Edge Detection," *Data Hacker*, https://datahacker.rs/edge-detection/ (accessed Feb. 7, 2025).

[3] Choice Life, "전이 학습(Transfer Learning)과 활용 사례," *Tistory*, https://choice-life.tistory.com/40 (accessed Feb. 7, 2025).

[4] ResearchGate, "Algorithms that won the ImageNet Large Scale Visual Recognition Challenge (ILSVRC)," *ResearchGate*, https://www.researchgate.net/figure/Algorithms-that-won-the-ImageNet-Large-Scale-Visual-Recognition-Challenge-ILSVRC-in_fig2_346091812 (accessed Feb. 7, 2025).

[5] Stack Overflow, "How to split ResNet50 model from top as well as from bottom?," *Stack Overflow*, https://stackoverflow.com/questions/54207410/how-to-split-resnet50-model-from-top-as-well-as-from-bottom (accessed Feb. 7, 2025).

 

-If any problem for references, or any questions please contact me by comments.

-This content is only for recording my studies and personal profiles

 

일부 출처는 사진 내에 표기되어 있습니다

본문의 내용은 학습과 개인 profile 이외의 다른 목적이 없습니다

출처 관련 문제 있을 시 말씀 부탁드립니다

상업적인 용도로 사용하는 것을 금합니다

본문의 내용을 Elixirr 강의자료 내용(권진욱 강사님)을 기반으로 제작되었습니다

깃허브 소스코드의 내용을 담고 있습니다

강의 커리큘럼이 '밑바닥부터 시작하는 딥러닝' 교재를 바탕으로 제작되었습니다

본문의 내용은 MS AI School 6기의 강의 자료 및 수업 내용을 담고 있습니다

 

 

 

 

 

 

반응형