ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 환급챌린지 35일차 미션 (3월 6일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기
    패스트캠퍼스 챌린지 2024. 3. 6. 21:40

     

    자, 오늘은 

     

    CH05-02. 인공신경망 코드를 위한 주요 코드의 이해(2)

    &

    CH05-03. 인공신경망을 사용한 분류기 생성

     

     

     

    CH05-02. 인공신경망 코드를 위한 주요 코드의 이해(2)

    어제는 인공신경망이 어떻게 구조되어있는지 간략하게 알아보았다면 오늘은 본격적으로 디바이스 설정부터 차근차근

    들어가보자.

     

    인공신경망은 왠만하면 GPU를 써라

     

    #Device 설정
    # - 일반적으로 인공신경망의 학습은(가능하다면) GPU를 사용하는 것이 바람직함
    # - Colab Runtime 설정 변경
    # - GPU를 사용하여 학습을 진행하도록 명시적으로 작성 필요
    # - 연산 유형에 따라 GPU에서 수행이 불가능한 경우도 존재하는데, 그럴 경우도 마찬가지로 명시적으로 어떤 프로세서에서 연산을 수행해야 하는지 코드로 작성해야함
     

     

    앞서서는 사이킨런을 쓸때는 GPU를 쓰지 않았다. 하지만 인공신경망에서는 GPU를 쓰는게 추천된다.

    하드웨어 가속기를 GPU로 설정하고 저장하면 되기 까지는 쉽고,

     

    #신경망 생성
    # - torch.nn은 신경망 생성 및 학습 시 설정해야하는 다양한 기능 제공
    import torch.nn as nn

     

    # 신경망을 nn.Module을 상속받아 정의
    # - __init__(): 신경망에서 사용할 layer를 초기화 하는 부분
    # - forward(): feed forward 연산 수행 시, 각 layer의 입출력이 어떻게 연결되는지를 가정

     

    먼저 인잇은 이 클래스를 선언했을 때 수행되는 부분이고, 신경망에서 사용할 레이어를 설정하는 부분이다.

     

    forward 는 이 신경망을 피드푸워드 할때 어떤 연산을 수행해야하는지 정의한다.

     

     

     

    자 위의 이미지가 가장 중요한 부분인데 자세히 보면 아래와 같다.

    class NeuralNetwork(nn.Module):
      def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.input_layer = nn.Linear(4, 16)
        self.hidden_layer1 - nn.Linear(16,32)
        self.output_layer = nn.Linear(32,3)
        self.relu = nn.ReLU()

      def forward(self, x):
        out = self.relu(self.input_layer(x))
        out = self.relu(self.hidden_layer1(out))
        out = self.output_layer(out)
        return out

     

    뉴럴 네트워크라는 클래스를 새로 만들었고, nn.모듈을 상속 받는다.

     

    인잇은 nn.module 에서 상속받은 이 뉴럴네트워크가 선언이 될때 수행이 된다.

    ~~ 레이어를 만들겠다는걸 작성하는 것이다.

     

    여기서는 인풋레이어라는 레이어에 리니어(풀리커넥티드 레이어) 4개의 입력, 16개의 출력 을 만든다.

    그다음  또 4개 입력, 16개 출력,

    16개 입력, 32개 출력,

    그리고 마지막에 32개 입력, 3개 출력하는 각각의 레이러를 만들어주고,

     

    활성화함수를 relu에 담아준다.

     

    위에서는 신경망을 요소들을 초기화했고,

     

    포워드는 신경망이 실행될때 수행되는연산을 정의한다.

     

    x를 인자로 받고(입력을 받을때)

    인풋레이어에 넣어줘, 그리고 렐루를 통과시킨다. x가 인풋레이어와 렐루를 차례로 통과하는 것이다.

    x는 이 레이어를 통과하기 위해서는 입력이 4니까 4차원으로 만들어주고,

     

    나오면 16개의 차원을 갖게 된다. 그다음 히든레이어는 16개를 입력받으니 또 들어갈수 있는 것이고,

    계속 이런식으로 들어가고 나오고(입출력이 맞아야함!)

     

    하면서 마지막엔 3개의 아웃값을 출력하게 되는 것이다.

     

    자 다음은 

    Model Compile

    # Model Compile
    # 학습시 필요한 정보들(loss function, optimizer)을 선언
    # 일반적으로 loss와 optimizer는 아래와 같이 변수로 선언하고, 변수를 train/test 시 참고할 수 있도록 매개변수로 지정해 줌
    laerning_rate = 0.01
    loss = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)

     

    일반적으로 로스와 옵티마이저는 위 처럼 변수로 만들어준다.

     

    로스는 크로스엔트로피로 사용하도록 정의가 되어있고,

     

    nn.moudule이라는 것은 신경망에서 흔히 알고 있는, 자주 사용하는 기능들을 가져다가 쓸 수 있도록 제공한다.

    오비마이저는 Adam을 설정해주었다. 아담을 통과시킬 때 파라미터를 옵티마이저에 넣어주고, 런닝레이트를 설정해준다.

     

     

    자, 이제 그럼 학습과정에 대해서 정의해줘야 한다.

    # Train
    # 신경망의 학습과정을 별도의 함수로 구성하는 것이 일반적
    # feed forward -> loss -> err back bropagation -> log - > 반복

     

    weight param을 최적하하기 위해 계소 반복 반복 반복 할때 로그에서 값을 저장하고 계속 출력하게 설계해보자.

     

    def train_loop(train_loader, model, loss_fn, optimizer):
      for batch, (X, y) in enumerate(train_loader):
        X, y = X.to(device), y.to(device)
        pred = model(X)
        loss = loss_fn(pred, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

     

    데이터로더: 학습을 쉽게 하기 위해 만들어 준 거.

    모델: 선언한 신경망으로 만든 모델

     

    어떤 데이터셋, 어떤 로더, 로스, 옵티마이저를 설정했다.

    데이터 로더이기 때문에 배치만큼 짤라서 쓸 수있다.

     

    연산할 값들을 앞서 선언한 디바이스(GPU)에 올려주고, 모델에다가 X의 인자를 넣어주고,

    피드포워드 연산이 수행된다.

     

    pred = 예측값

    zero_grad :  옾티마이저의 초기화

     

    테스트과정

    역전파가 없다.

     

    CH05-03. 인공신경망을 사용한 분류기 생성 

    직접 데이터셋을 입력받아서 학습을시킬 수 있는 모델을 만들어보자!

     

    Iris 데이터셋을 사용하여 꽃의 품종을 구분하는 분류기를 신경망을 사용하여 구현해봅시다.!

     

     

     

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    import torch
    import torch.nn as nn
    from torch.utils.data import TensorDataset, DataLoader

     

    데이터셋은 사이킨런에 내장되어있는 데이터셋을 사용해서 학습해보자.

     

    신경망을 만들기 위해, 엔엔 토치 , 데이터로더 다 가져온다.

     

    #데이터 불러오기
    iris = load_iris()
    df = pd.DataFrame(data=iris.data, columns = iris.feature_names)

    #데이터 분할
    y = df['label']
    X = df.drop(['label'], axis=1)

    X_train, X_test, y_train, y_test = train_test_split(X.values, y.values, random_state=42, stratify = y)

     

    아이리스의 모든 속성들을 가져오고,

    속성들을 활용해서 데이터프레임을 만들어준다.(컬럼은 아이리스 피쳐내임을 사용)

     

    레이블이라는 컬럼을 새로 만들어서 타겟 속성을 반영하는 컬럼을 만들어준다.

     

    그다음 데이터분할은 X, y 로 분할하고 트레인 스플릿으로 분할해주고, stratify를 Y로 활성화해준다.
    (몇퍼센트 분할하라는 말이 없으니 디폴트 값으로 각각의 품종이 동일한 비율로 들어가게 스트레티파이를 활성화해준다.)

     

    X_train = torch.tensor(X_train, dtype = torch.float32)
    X_test = torch.tensor(X_test, dtype = torch.float32)
    y_train = torch.tensor(y_train, dtype = torch.int64)
    y_test = torch.tensor(y_test, dtype = torch.int64)

    train_dataset = TensorDataset(X_train, y_train)
    test_dataset = TensorDataset(X_test, y_test)

    train_datalaoder = DataLoader(train_dataset, batch_size = 10, shffle =True)
    test_datalaoder = DataLoader(test_dataset, batch_size = 10, shffle =True)

     

    위와 같이 모델을 만들어주고,

     

    이후에 신경망을 만들어준다.

     

     

     

     

     

    35일차 끝.

     

     

     

    본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

    https://bit.ly/48sS29N

Designed by Tistory.