Data science/딥러닝

[딥러닝] 1. 딥러닝 개요

endingo 2025. 4. 5. 21:53

★ 딥러닝 모델링 준비 순서: 환경준비 => 필요한 함수 만들기 => 데이터 전처리 및 분할 => 스케일링 => 딥러닝 모델링이다.

★ 딥러닝 모델링 시작 순서: 딥러닝을 위한 데이터 준비 => 모델 선언 => 목적함수(손실함수), 옵티마이저 선언 => 모델학습 => 모델 평가이다.

 

1. 딥러닝 모델링 준비 

 

1) 환경 준비

metrics, train_test_split, Scaler 그리고

Pytorch, nn, Adam 등의 필요한 라이브러리를 Import 해준다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.metrics import *
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset
from torch.optim import Adam

 

2) 필요한 함수를 생성해준다.

 

- 텐서를 만드는 작업, 텐서를 합쳐서, 합친 데이터를 로드 하는 작업,

def make_DataSet(x_train, x_val, y_train, y_val, batch_size = 32) :

    # 데이터 텐서로 변환
    x_train_tensor = torch.tensor(x_train, dtype=torch.float32)
    y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32).view(-1, 1)
    x_val_tensor = torch.tensor(x_val, dtype=torch.float32)
    y_val_tensor = torch.tensor(y_val.values, dtype=torch.float32).view(-1, 1)

    # TensorDataset 생성 : 텐서 데이터셋으로 합치기
    train_dataset = TensorDataset(x_train_tensor, y_train_tensor)

    # DataLoader 생성
    train_loader = DataLoader(train_dataset, batch_size = 32, shuffle = True)

    return train_loader, x_val_tensor, y_val_tensor

 

- 배치는 어떻게할 것인가? 데이터셋의 크기는 얼마인가, 순방향파는 어떻게 선언하고, 역전파 알고리즘을 쓸것인가?

def train(dataloader, model, loss_fn, optimizer, device):
    size = len(dataloader.dataset)                  # 전체 데이터셋의 크기
    num_batches = len(dataloader)                   # 배치 크기
    tr_loss = 0
    model.train()                                   # 훈련 모드로 설정
    for batch, (X, y) in enumerate(dataloader):     # batch : 현재 배치 번호, (X, y) : 입력 데이터와 레이블
        X, y = X.to(device), y.to(device)           # 입력 데이터와 레이블을 지정된 장치(device, CPU 또는 GPU)로 연결

        # Feed Forward
        pred = model(X)
        loss = loss_fn(pred, y)
        tr_loss += loss

        # Backpropagation
        loss.backward()             # 역전파를 통해 모델의 각 파라미터에 대한 손실의 기울기를 계산
        optimizer.step()            # 옵티마이저가 계산된 기울기를 사용하여 모델의 파라미터를 업데이트
        optimizer.zero_grad()       # 옵티마이저의 기울기 값 초기화. 기울기가 누적되는 것 방지

    tr_loss /= num_batches          # 모든 배치에서의 loss 평균

    return tr_loss.item()

 

- 모델의 평가는 어떤식으로 할 것인가? 

def evaluate(x_val_tensor, y_val_tensor, model, loss_fn, device):
    model.eval()                        # 모델을 평가 모드로 설정

    with torch.no_grad():               # 평가 과정에서 기울기를 계산하지 않도록 설정(메모리 사용을 줄이고 평가 속도를 높입니다.)
        x, y = x_val_tensor.to(device), y_val_tensor.to(device)
        pred = model(x)
        eval_loss = loss_fn(pred, y).item()    # 예측 값 pred와 실제 값 y 사이의 손실 계산

    return eval_loss, pred

 

- CPU vs GPU

쿠다가 없으면 CPU를 사용하고 있으면 쿠다써라

# cpu 혹은 gpu 사용
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")

 

3) 데이터 전처리

 

- 데이터 준비

path = '~.csv'
adv = pd.read_csv(path)
adv.head()

 

- 독립변수와 종속변수 나누기

target = 'Sales'
x = adv.drop(target, axis=1)
y = adv.loc[:, target]

 

- 데이터 분할: x_train, y_train으로 학습하고 x_val, y_val로 검증

x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=.2, random_state = 20)

 

- 스케일링: 딥러닝은 스케일링을 필요로 한다.

스케일링방법: 정규화, 표준화, 최소최대

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)

 

2. 딥러닝 모델링 시작

 

1) 딥러닝을 위한 데이터 준비: Pandas 데이터 프레임을 Pytorch의 DataLoador(데이터 텐서)로 변환해야 딥러닝을 할 수 있다.

train_loader, x_val_ts, y_val_ts = make_DataSet(x_train, x_val, y_train, y_val, batch_size = 4)

 

이러면 텐서 데이터셋으로 x, y 의 조합으로 합쳐진다.

 

2) 모델 선언

 

- 텐서 확인

x.shape

 

배치크기가 4이면 4번씩 나누어서 공부해라라는 뜻이다.

특성수가 3인 텐서가 만들어졌고 이는 키, 몸무게, 나이에 비유 할 수 있다.

이 3개의 특성을 보고 딥러닝은 점수를 산출하고 활성함수에 값을 넣어 출력값을 도출한다.

 

- 모델 설계

앞에 나왔던 3개의 특성 값을 보고 심층신경망을 설계해보자

n_feature = x.shape[1]

# 모델 구조 설계
model = nn.Sequential(
            nn.Linear(n_feature, 3),    # hidden layer(input, output)
            nn.ReLU(),                  # 활성함수
            nn.Linear(3, 1)             # output layer
        ).to(device)                    # cpu, gpu 사용 설정. cpu인 경우 생략가능

print(model)

 

 

여기서 in_features=3은 들어올때 특성의 수가 3개 였고 out_features=3이라는 것은 이 Linear 신경망을 지날 때 3개의 출력값이 도출된다는 뜻이다.

 

ReLU()는 활성함수이고, 마찬가지고 2번째 Linear() 함수에서 in_features=3은 들어올때 특성의 수가 3개이고 out_features=1 이라는 것은 이제 출력값을 완전히 도출해야되니까 Linear() 신경을 지나갈 때는 하나의 출력값이 나온다는 것이다.

 

 3) 목적함수(손실함수) 옵티마이저 설계

 

목적함수는 손실함수라고도 하고 오차를 어떻게 줄여나갈 것인가 선언하는 것이고 딥러닝은 모델을 학습할 수록 목적함수가 최저가되는 목표를 가지고 학습한다.

옵티마이저는 최소의 목적함수를 찾아내는데 도와주는 최적화 도구이다.

 

MSELoss(): MSE 목적함수 선언

Adam(): 옵티마이저 중에 최고!

loss_fn = nn.MSELoss()          # MSE
optimizer = Adam(model.parameters(), lr=0.01)  # model.parameters() : 모델의 가중치와 편향

 

4) 모델 학습

 

반복횟수 = 20

필요한 함수에서 나왔던 train, evaluate를 설정하여 계산을 하고 

옵티마이저를 통해 목적함수가 최소가 되는 방향으로 학습해 나간다.

epochs = 20
for t in range(epochs):
    tr_loss = train(train_loader, model, loss_fn, optimizer, device)
    val_loss, _ = evaluate(x_val_ts, y_val_ts, model, loss_fn, device)

    print(f"Epoch {t+1}, train loss : {tr_loss:4f}, val loss : {val_loss:4f}")

 

이렇게 각 에포크 당 train 할 때 점수는 몇이고 검증할 때 점수는 몇이고 알려준다.

훈련: 우리가 단어를 외우고, 수학문제를 풀고, 개념을 외우고 준비하는 과정

검증: 우리가 연습 문제를 풀고 채점하는 과정

테스트: 실제 우리가 수능보고 중간/기말고사 보는 과정

 

5) 모델 평가

 

자 이제 시험을 보자!

loss, _ = evaluate(x_val_ts, y_val_ts, model, loss_fn, device)
loss

여기서는 val 세트로 evaluate를 했기 때문에 연습문제를 푼 격이 되지만

train으로 열심히 훈련하고 val로 연습문제 한번풀어보고 또 train으로 열심히 훈련하고 val로 연습문제 한번풀어보고..

 

반복하다가 최종적으로 test 세트로 시험을 보게된다.