부트캠프/SK Networks AI Camp 10기

[플레이데이터 SK네트웍스 Family AI 캠프 10기] 7주차 회고

kqe123 2025. 3. 2. 21:23

 

1. Intro

7주차가 끝났다. 원래는 지난주에 썼어야 하는 회고지만 늦게 쓴 이유는 내용이 심각할 정도로 광범위하고, 자격증 시험도 겹쳐서 할 여유가 없었다. 그래서 오늘 이렇게 작성하게 되었는데 회고 하나를 더 써야된다 ㅋㅋ... 딥러닝이 난이도 높은 영역이기도 하지만 솔직히 머신러닝 배울 때처럼 모델 생성하고 실행만 하면 다 될줄 알았다. 그런데 코드를 보니 모델 생성, 모델 훈련, 모델 테스트 등등 모두 코드를 내가 짜야되서 이해하는데만 시간이 꽤 걸렸다. 

 

2. 배웠던 내용 (요약)

내용이 너무나 광범위하기 때문에 진짜 필요한 부분만 요약했다.

딥러닝 개요

1. 인공지능 VS 딥러닝

  • 인공지능: 사람의 지능을 모방하는 시스템, 딥러닝은 머신러닝의 한 기술.
  • 인공신경망: 뉴런을 모방한 노드로 구성된 신경망. feed-forward 신경망은 한방향으로 흐르는 구조
  • 인공 뉴런(퍼셉트론) :
    • 입력(Input, x) : 여러 개의 특징(Feature)을 입력값으로 받음.
    • 가중치(Weight, w) : 입력값에 각각 곱해지는 값. 결과에 미치는 영향을 조절함
    • 편향(Bias, b) : 결과값을 조정하는 역할.
    • 활성화 함수(Activation Function) : 입력 신호의 총합을 받아 출력을 결정하는 함수.
      • 단순 퍼셉트론에서는 계단 함수(Step Function)를 사용하여 0 또는 1을 출력.
    • 출력(Output, y) : 최종적으로 0 또는 1(또는 -1과 1)을 출력하여 이진 분류를 수행.
  • 딥러닝:
    • 딥러닝은 머신러닝 알고리즘 중 하나인 인공신경망을 다양하게 쌓은 것
    • 인공신경망을 여러 겹으로 쌓으면 딥러닝
    • Simple Neural Network : 은닉층( hidden layer)이 1개인 Neural network
    • Deep learning Neural Network : 은닉층( hidden layer)이 여러개인 Neural network

2. 핵심 개념

  • 손실함수: 모델 출력과 실제값의 차이를 나타내며, 학습의 목표는 이 손실을 최소화하는 파라미터를 찾는것!
  • 회귀에서의 손실함수: MSE(이상치 민감)와 MAE(이상치 강건).
  • Optimizer: 신경망 가중치와 편향을 업데이트하는 알고리즘.
  • 역전파: 손실값을 기반으로 가중치를 수정하는 알고리즘.
  • 기울기 소실: Sigmoid 함수의 기울기 소실 문제. ReLU 함수로 해결 가능.

3. 학습 용어

  • Epoch: 전체 데이터를 한 번 학습하는 단위.
  • Batch: 한 번의 가중치 업데이트에 사용되는 데이터 단위.

4. 딥러닝의 한계

  • 많은 데이터와 계산 리소스를 요구하고, 결과에 대한 예측이 어려움.

5. Pytorch

  • Tensor 생성: 다양한 방법으로 텐서를 만들 수 있음.
  • CPU, GPU 사용: GPU 활용 가능 여부 확인 및 텐서를 GPU로 옮기기.
  • Tensor 연산: 텐서 간 합치기, 곱셈, 차원 변경 등 다양한 연산 지원.
  • 인덱싱/슬라이싱: 텐서의 특정 부분을 추출하거나 변경.
  • Tensor 사용시 주의점 : python 자료형과 호환되지 않는다! (즉 item() 필요)

 

Pytorch에서 데이터셋을 로드하는 법

1. Torch에서 제공하는 Dataset 사용

  • torchVision : PyTorch의 이미지 처리 관련 라이브러리로 다양한 도구와 데이터셋을 제공
  • datasets.FashionMNIST() : torchvision의 FashionMNIST를 가져오는 함수
  • Dataloader : 전체 데이터를 배치 사이즈로 분리하는 함수
  • 실습 : 
    • 1. datasets.FashionMNIST()를 이용해 훈련 데이터 60000개의 이미지, 테스트 데이터의 이미지와 각각의 라벨을 가져옴.
    • 2. DataLoader 객체에 테스트 이미지 10000개를 넣고, batch_size를 64로 설정한다. -> 10000개의 이미지중 64개를 골라 배치 단위로 데이터를 로드함.
    • 3. next(iter(dataloader객체))를 이용해 다음 배치(64개의 데이터)를 뽑고, features와 targets 리스트로 분리해 이미지와 라벨을 저장한다. 
    • 4. plt.show()로 출력해본다.

2. ImageFolder모듈을 이용해 Dataset 만들기

  • drive.mount() : Google Colab에서 Google Drive를 연결
  • Path 모듈 : 파일 경로를 다루기 쉽게 만들어주는 모듈
  • parent.stem : 부모 디렉터리의 이름(확장자 제외) 반환
  • Image.open() : 해당 이미지 파일 열기
  • ImageFolder 객체 : 이미지가 저장된 폴더를 자동으로 읽어와 라벨과 함께 텐서로 변환
  • 실습 :
    • 1. google drive에 데이터를 넣고, drive.mount()로 데이터를 불러옴
    • 2. Path(image_path)를 통해 Path객체에 경로를 넣고, glob()로 해당 파일 경로를 검색해 가져옴
    • 3. ImageFolder 객체를 이용해 디렉토리 구조에 기반하여 이미지를 로드하고, 해당 이미지를 클래스별로 레이블링
    • 4. classes, classes_to_idx 필드로 클래스(타겟)의 종류, 클래스의 라벨링을 손쉽게 다룰수 있음.

3. Dataset Class를 만들기

  • 말 그대로 Dataset Class를 자기가 직접 만들어서 로드하는 방법이다.
  • 아래처럼 직접 Class를 만든다.

  • CustomDataset 객체를 하나 생성한뒤, 이미지와 인덱스를 feature와 target으로 분리해 저장함.

 

  • feature를 찍어보면 사진이 나온다.

 

 

이진분류 모델을 딥러닝으로 구현하기

  • 1. 다음과 같이 모델을 만든다. '여러개의 계층을 쌓아서 파이프처럼 연결한다.'라고 생각하면 된다. 
    • nn.Module : PyTorch의 신경망 모델을 만들 때 사용하는 기본 클래스
    • nn.Linear() : 입력 데이터를 out_features 크기의 벡터로 선형 변환하는 레이어
    • nn.ReLU() :  ReLU 활성화 함수로, 비선형성을 추가해 복잡한 패턴을 더 잘 학습할 수 있게 돕는다.
    • input_size, out_size, hidden_size를 입력받아 각 계층의 입력, 출력 사이즈를 지정하면 된다.

 

  • 2. 모델 학습 과정에서 쓸 모델, loss_fn(손실 함수), optimizer를 생성
  • 3. 모델을 지정한 에포크(여기선 500에포크)만큼 훈련와 테스트를 반복하며 모델을 학습시킨다.
    • model.train()으로 모델을 학습모드로 변경해 모델 학습, 역전파(파라미터 update), 손실값과 정확도 계산을 진행
    • model.eval()로 모델을 평가모드로 변경해 테스트를 진행해 손실값과 정확도 계산을 진행
    • 50에포크마다 훈련 세트의 손실값, 정확도, 테스트 세트의 손실값과 정확도를 보여준다.   

 

  • 4. 아래와 같이 정확도가 점점 오르는걸 볼 수 있다.

 

5. 그래프로 찍어봤을 때 선명하게 분리가 되는걸 볼 수 있다.

 

 

3. 느낀점

🧐Facts (내가 한 일) 

딥러닝이 무엇인지 배우고, 이미지셋을 로드하는 방법에는 어떤 것들이 있는지 알아보았다. 또한, 딥러닝 모델을 만들고 학습시키고 테스트한 후, 결과를 출력하는 과정까지 학습했다.

 

🎶Feelings ( 나의 감정적인 반응, 느낌 ) 

처음 접했을 때는 무슨 말인지 전혀 이해할 수 없을 정도로 어려웠다. 하지만 하나하나 정리하고, ChatGPT를 활용해 코드 분석을 해보니 어느 정도 의미를 파악할 수 있었다. 물론 아직 모든 내용을 완벽하게 이해한 것은 아니다. 하지만 처음부터 모든 걸 완벽히 이해하기 어려운 것이 당연하다는 걸 받아들이게 되었다. 앞으로의 학습은 내용을 이해하고 따라가는 것에 초점을 맞춰야할 것 같다.

 

🎓Findings ( 배운 것 ) 

이번에 ADSP 자격증 시험을 봤는데, 생각보다 어렵게 느껴졌다. 공부 기간이 짧았던 것도 있지만, 가장 큰 이유는 통계 용어가 익숙하지 않아서였다. SQLD와 달리 통계 관련 개념이 중심이 되는 시험이었기 때문에, 단순히 1주일 정도의 학습 기간으로는 부족했다고 생각한다. 실제로 이번 시험 난이도가 높았다는 평이 많지만, 나에게는 학부 시절에 다루지 않았던 통계 지식을 새롭게 배운다는 점이 더 어렵게 느껴졌다. 또한, 딥러닝 강의를 들으면서 난이도가 급격하게 상승했기 때문에 앞으로는 자격증 공부보다 강의 내용을 따라가는 것에 집중해야겠다고 결심했다.

 

🏢Future ( 미래 ) 

다음 주도 딥러닝을 배우고, 새 미니 프로젝트를 준비 해야 된다. 자격증 시험이 끝났기 때문에 밀린 강의 내용과 미니 프로젝트에 힘쓸 계획이다!