본문 바로가기
Study/Deep learning

Deep Learning(8)-Pytorch

by 왕방개 2024. 3. 26.

1.Pytorch

1)개요

=>pytorch는 python을 위한 오픈 소스 머신러닝 라이브러리

=>facebook이 만든 라이브러리

하는 일은 tensorflow 와 동일

=>설치는 pip install torch torchvision

=>딥러닝을 학습할 때 Tensorflow 나 Pytorch 둘 중 하나는 가지고 학습을 합니다.

딥러닝 모델을 이용해서 서비스를 개발하다보면 모델들이 둘 중 하나의 형태로만 제공되는 경우가 있습니다

이런 경웅에는 어쩔 수 없이 학습한 라이브러리가 아닌 다른 라이브러리를 이용해서 작업을 수행해야 합니다.

=>현재는 딥러닝 연구 분야에서는 pytorch를 많이 사용하고 서비스 개발에는 tensorflow 를 많이 씀

=>tensorflow 는 버전이 너무 자주 바뀜

 

import numpy as np
import matplotlib.pyplot as plt

#딥러닝 프레임워크 중 하나인 파이토치의 기본 모듈
import torch

#PyTorch Module 중 딥러닝 모델을 설계할 때 필요한 함수를 모아놓은 모듈
import torch.nn as nn

#torch.nn Module 중에서도 자주 이용되는 함수를 ‘F’로 지정
import torch.nn.functional as F

#컴퓨터 비전 연구 분야에서 자주 이용하는 ‘torchvision’ 모듈 내 ‘transforms’, ‘datasets’ 함수를 임포트
from torchvision import transforms, datasets

=>GPU 사용가능할시

if torch.cuda.is_available():
    DEVICE = torch.device('cuda')
else:
    DEVICE = torch.device('cpu')

print('Using PyTorch version:', torch.__version__, ' Device:', DEVICE)

 

=>MNIST 데이터 실습

BATCH_SIZE = 32
EPOCHS = 10

'''  MNIST 데이터 다운로드 (Train set, Test set 분리하기) '''
train_dataset = datasets.MNIST(root = "./data/MNIST",
                               train = True,
                               download = True,
                               transform = transforms.ToTensor()) # tensor로 변경

test_dataset = datasets.MNIST(root = "./data/MNIST",
                              train = False,
                              transform = transforms.ToTensor())

#데이터를 메모리에 가져오는 작업
#데이터를 메모리에 가져오는 작업을 로드한다라고 합니다
train_loader = torch.utils.data.DataLoader(dataset = train_dataset,
                                           batch_size = BATCH_SIZE,
                                           shuffle = True)

test_loader = torch.utils.data.DataLoader(dataset = test_dataset,
                                          batch_size = BATCH_SIZE,
                                          shuffle = False)

 

tensorflow 는 일반적으로 데이터가 풀어진 상태로 다운을 많이 받음. pytorch는 numpy로 압축해놔서 train_loader 를 활용해서 데이터를 메모리에 가져옴

=>type 및 사이즈 확인

for (X_train, y_train) in train_loader:
    print('X_train:', X_train.size(), 'type:', X_train.type())
    print('y_train:', y_train.size(), 'type:', y_train.type())
    break

 

=>모델 생성

#모델 설계 - 사용자 정의 클래스 이용
#python은 다중 상속이 가능한 언어

class Net(nn.Module):
    def __init__(self):
    	#첫번째 상속받은 클래스의 init을 호출
        super(Net, self).__init__()
        #layer를 구성
        self.fc1 = nn.Linear(28 * 28, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, 10)

    def forward(self, x):
    	#1차원 펼치기
        x = x.view(-1, 28 * 28)
        #입력층 생성
        x = self.fc1(x)
        x = F.sigmoid(x)
        #히든층 쌓기
        x = self.fc2(x)
        x = F.sigmoid(x)
        #출력층 만들기
        x = self.fc3(x)
        x = F.log_softmax(x, dim = 1)
        return x
        
model = Net().to(DEVICE)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01, momentum = 0.5)
criterion = nn.CrossEntropyLoss()

print(model)

 

=>train 함수 

#훈련하는 사용자 함수 정의
#훈련 중 원하는 로그를 출력하기 위해서

def train(model, train_loader, optimizer, log_interval):
    model.train()
    #데이터를 순회하면서 
    for batch_idx, (image, label) in enumerate(train_loader):
        #훈련 가능한 데이터로 변경
        image = image.to(DEVICE)
        label = label.to(DEVICE)
        #image 를 가지고 출력을 생성
        optimizer.zero_grad()
        output = model(image)
        #손실 계산
        loss = criterion(output, label)
        #역전파
        loss.backward()
        #다음 스텝으로 진행
        optimizer.step()

        if batch_idx % log_interval == 0:
            print("Train Epoch: {} [{}/{} ({:.0f}%)]\tTrain Loss: {:.6f}".format(
                epoch, batch_idx * len(image), 
                len(train_loader.dataset), 100. * batch_idx / len(train_loader), 
                loss.item()))

 

=>evaluate 함수

def evaluate(model, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for image, label in test_loader:
            image = image.to(DEVICE)
            label = label.to(DEVICE)
            output = model(image)
            test_loss += criterion(output, label).item()
            prediction = output.max(1, keepdim=True)[1]
            correct += prediction.eq(label.view_as(prediction)).sum().item()
    
    test_loss /= len(test_loader.dataset)
    test_accuracy = 100. * correct / len(test_loader.dataset)
    return test_loss, test_accuracy

 

=>결과 확인

#실제 훈련
for epoch in range(1, EPOCHS + 1):
    train(model, train_loader, optimizer, log_interval = 200)
    test_loss, test_accuracy = evaluate(model, test_loader)
    print("\n[EPOCH: {}], \tTest Loss: {:.4f}, \tTest Accuracy: {:.2f} % \n".format(
        epoch, test_loss, test_accuracy))

 

'Study > Deep learning' 카테고리의 다른 글

Deep learning(9)-LLM  (0) 2024.03.26
DeepLearning(7)- AutoEncoder,생성모델  (0) 2024.03.26
Deep learning(6) - 자연어처리  (1) 2024.03.25
Deep Learning(5)-RNN  (0) 2024.03.22
Deep learning(4) - CNN  (0) 2024.03.21