-
패스트캠퍼스 환급챌린지 36일차 미션 (3월 7일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기패스트캠퍼스 챌린지 2024. 3. 7. 18:18
자, 오늘은
CH06-01. 인공신경망 코드를 위한 주요 코드의 이해
&
CH06-02. 인공신경망 설계하기
CH06-01. 인공신경망 코드를 위한 주요 코드의 이해
이번 시간에는 패션 엠니스트 데이터셋을 사용하여 클래시파이어를 만들어보도록 하자.
# 인공신경망 활용하기# 실습 목표# torchvision 데이터셋을 사용하여 이미지 분류기를 생성한다.# 생성한 모델을 저장하고, 저장된 모델을 다시 불러와서 사용한다.# 데이터셋 Fashion MNIST다시한번 리뷰하고 시작하자.
파이토치를 사용해서 인공신경망을 만들 때 데이터 로더라는 클래스를 사용하여 데이터를 처리했다.
DataLoader : 입력 데이터를 쉽게 처리하고 배치 단위로 짤라서 학습할수 있게 도와주는 모듈
그리고 학습시 인스턴스에 쉽게 접근할 수 있도록 순회 가능한 객체(iterable)를 생성
하는일은 shuffle, batch...
Dataset : 학습시에 사용하는 feature(들어가는 아이, x)와 target(y, 값)을 pair로 만들어주는 것
기존의 x,y를 데이터셋을 만들고 이 데이터셋을 데이터로드에 집어넣는다.
Device 설정
- 일반적으로 인공신경망 학습은(가능하다면) GPU 쓰자고 했었다.
신경망 생성
- torch.nn패키지는 신경망 생성 및 학습시 설정해야하는 다앙햔 기능을 제공한다.
- 신경망을 nn.module을 상속받아 정의
신경망을 정의한다라는 것은 신경망이 어떤 레이어로 정의되어있고, 각각의 레이어의 인풋과 아웃풋이 어떻게 되는지
정의한다.
- __init__(): 신경망에서 사용할 layer를 초기화하는 부분
- forward() : feed forward 수행시, 각 layer의 입출력이 어떻게 연결되는지를 지정!
노드를 작성할 때, 인풋 수, 출력수를 각각 결정해서 작성해야한다.
또한 데이터가 들어가서 순차적으로 통과할때 어떤레이어에서 어떤레이어로 들어갈지 등등 미리 설계를 해야한다.
(특히, 전 레이어에서의 출력이 지금 레이어의 입력 숫자를 꼭 맞춰줘야한다.)
model copile
- loss function, optimizer를 변수로 선언하고, 변수를 test/train 시 참고할 수 있도록 매개변수로 지정해준다.- 학습루프
신경망 학습 진행(feed forward -> loss -> error back propagation -> (log) -> (반복))
- 테스트
feed forward -> loss -> (log) -> (반복)
학습루프와 테스트의 차이는 백프로파게이션이 있냐 없냐 차이.
Iteration
- 여러번 epoch르 반복하면서 최적의 파라미터를 찾고, 지정한 epoch 수만큼 학습 과정과 평과 가정을 반복하면서
모델의 성능을 체크함.
import numpy as npimport matplotlib.pyplot as plt
import torchfrom torch.utils.data import DataLoaderfrom torch import nn
from torchvision import datasetsfrom torchvision.transforms import ToTensor주요 클래스들을 보자
넘파이와 맷플랏을 임포트
토치, 데이터로더, 신경망을 위한 NN 모듈 , 데이터셋을 불러오기 위한 데이터셋, 전처리를 위한 투텐서
이전에 우리가 Iris 데이터셋을 사용해서 그 데이터셋을 데이터로더로 만들 때에는
1. 넘파이 어레이로 불러왔던 데이터를 데이터 프레임 형태로 만들고,
2. 데이터 프레임 형태를 파이토치에서 사용할 수 있도록 데이터셋으로 바꾸고,
3. 데이터셋을 다시 다이터 로더로 바꾸는 형태로 진행 했었지만,

오늘 사용한 Fashion MNIST는 데이터셋 자체로 받아올 수가 있다.
데이터 셋은 xy를 페어로 관리하다보니 인자로 어디에 받고 어떻게 쓸지 설정을 해줄수 있으니 바로 데이터를 쓸 수 있다.
#FashionMNIST 데이터 불러오기training_data = datasets.FashionMNIST(root = 'data',train = True,download = True,transform = ToTensor(),)
test_data = datasets.FashionMNIST(root = 'data',train = False,download = True,transform = ToTensor(),)이런식으로 불러온다.

이렇게 되면 다운 완료!
CH06-02. 인공신경망 설계하기
자, 다운을 다 받았다면 이제 슬 시작해보자.

데이터로더를 만들어봅시다!
(이전까지 데이터셋을 받아왔으니 바로 데이터로더를 만들 수 있을 것이다.)
# Create DataLoader
train_dataloader = DataLoader(training_data, batch_size=64, shuffle = True)test_dataloader = DataLoader(test_data, batch_size=64, shuffle = False)위에서 아까 트레이닝 데이터와 테스트 데이터를 만들었으니, 데이터로더의 인자로 넣어서 트레인 데이터 로더를 만들자.
# Device 설정device = 'cuda' if torch.cuda.is_available() else 'cpu'print(f'device = {device}')런타임 바꾸고, 디바이스 GPU로 하자. 잘 되었다면 device = cuda 라고 뜬다.
그러면 이제 본격적으로 모델을 설계하기 전에, 여태까지 우리가 만든 트레이닝,테스트 데이터셋이 어떻게 구성되어
있는지 먼저 한번 봐보자.

총 6만개의 이미지, 투텐서 프래임이고, 스플릿도 되어있고...음 좋아!

트레이닝 데이터의 1번을 한번 꺼내보면... 이렇게 다차원(아마 내가 보니까 3차원인거 같은데 RGB 값인가...?)
배열이 되어있는 숫자가 들어있구나... 라고 알면 된다.

그리고, 마지막의 저 9라는 값이 중요한데,
아까부터 내가 말헀던 데이터셋은 x, y로 페어로 구성되어있다고 하였고, x는 저 숫자들로 이미지를 말한것이고,
저 9는 y 즉 답을 말하는 것이다.
(이미지, 9) 이런식으로 페어되어있다는 말.(레이블 번호가 9인듯)

그려면, 데이터셋말고 우리가 데이터 로더도 만들어줬는데 그것도 궁금하지 않으심니까?

train_features.size는 우리가 넘파이 어레이에서 .shpae 알아본것처럼 형태의 배열 구조를 반환해준다.
64,1,28,28 이 의미가 뭘까?
이미지는 28 바이 28이고 차원은 1차원(흑백) 앞에있는 64는 배치 사이즈의 숫자다.
트레인 피쳐의 쉐입이 그래서 저런 숫자가 나오는 것이다.
레이블은 64... 즉 0부터 9까지 하나의 카테고리를 포함하고 있기 때문에 여기서는 64, 즉 배치사이즈를 반환한다.

이제 레이블 맵을 이렇게 지정해주고,
자, 이제 본격적으로 신경망을 구성해보자.
# SetNetwork Structure
class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = nn.Flatten()self.classifier = nn.sequential(nn.Linear(28*28, 128),nn.ReLU(),nn.Dropout(0,2),nn.Linear(128,10),)def forward(self, x):x = self.flatten(x)output = self.classifier(x)return output1. nn.module을 상속받은 뉴럴 네트워크 클래스를 선언.
2. 입력데이터는 28바이 28이미지(1차원)을 입력을 받을건데, 리니어를 사용해서 데이터를 처리할것이다.
3. 756개의 노드를 받아서 128개로 설정했다.(128 아웃풋)
4. 렐루를 통과시키고 드롭아웃 연산
5. 마지막에 리니어(128개를 받아 10개로 출력)
6. 10개인 이유는 우리가 가진 레이블이 10개기때문임.
Ffaltten : 2차원을 1차원으로 바까준다.
classifier : 시퀸셜을 사용하여 여러개의 레이어가 순차적으로 통과할수 있는 구조를 만들어준다.
포워드를 봐보자.
1. 엑스를 인자로 넣으면,
2. flatten에 엑스를 넣어 다시 엑스가 튀어나오고,
3. 그 엑스를 클래시파이어에 넣어서 아웃풋으로 뽑아내는데,
4. 이 클래시파이어는 위에서 본것처럼 리니어 렐루 드랍아웃 리니어 순으로 공장에서 우다다다 하고 정리되어 나오는것.
output은 y햇이다.

자, 이제 모델을 GPU에 올려놓고!
그전에 모델 생김새좀 한번 다시보자.
flatten 과 classifier로 구성이 잘 되어있다.
#Model TestX = torch.rand(1,28,28, device = device)output = model(X)print(f'모델출력결과:{output}\n')pred_probab = nn.Softmax(dim=1)(output)print(f'Softmax결과: {pred_probab}\n')y_pred = pred_probab.argmax()print(y_pred)모델테스트를 왜 해여?
우리가 신경망을 복잡하게 구성하다보면 입력값을 받는 것과 출력값 아웃풋에서 그다음 인풋 노드의 수 이런게 맞지 않으면 피드포워드를 제대로 할수 없어서 에러가 난다.
그래서 말이 되는 모델인지 체크해보자는 것이다.
테스트 까지 해봤고 내일 본격적으로 학습 한번 해보자!!
36일차 끝.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지' 카테고리의 다른 글