pytorch 시작하기

chi yeong Yu·2022년 2월 25일
0

pytorch

목록 보기
1/1

pytorch 공부하기 part_1

import torch
import torch.nn as nn
# model 
import torch.optim as optim
# optimizer
import torch.nn.functional as f
# functional cross_entropy 등등
from torchvision import transforms, datasets
-----------------------------------------------
epochs = 30
batch_size = 64

transform = transforms.Compose([transforms.ToTensor()])
------------------------------------------------
# 데이터 저장

trainset = datasets.FashionMNIST(
root = 'data',
train = True,
download = False,
# True이면 현재 경로에 root 이름으로 폴더 만들어서 데이터 저장 
transform = transform)

testset = datasets.FashionMNIST(
root = 'data',
train = False, # testset =False
download = False,
transform = transform)
------------------------------------------------
#데이터 불러오기 = torch.utils.data.DataLoader

train_loader = torch.utils.data.DataLoader(
dataset  = trainset,
batch_size = batch_size,
shuffle = True)

test_loader = torch.utils.data.DataLoader(
dataset = testset,
batch_size = batch_size,
shuffle = True)
------------------------------------------------
#model 만들기

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10) # 마지막 10개 class
        
    def forward(self, x):
        #x.shape = torch.Size([64, 1, 28, 28])
        x = x.view(-1, 784) # view를 통해 1차원으로 만듦 linear layer를 거치기 위해 
        # x.shape = torch.Size([64, 784])
        x = f.relu(self.fc1(x))
        # x.shape = torch.Size([64, 256])
        x = f.relu(self.fc2(x))
        # x.shape = torch.Size([64, 126])
        x = self.fc3(x)
        # x.shape = torch.Size([64, 10])
        return x

model = Net().to('cuda')# gpu 정의
optimizer = optim.SGD(model.parameters(), lr = 0.01)
--------------------------------------------------

def train(model, train_loader, optimizer):
    # 학습 모드
    model.train()
    
    for batch_idx, (data, target) in enumerate(train_loader):
        
        data, target = data.to('cuda'), target.to('cuda')
        
        optimizer.zero_grad()
        # 매 반복마다 기울기를 계산하기 위해 zero_grad
        # 이전 루프에서 .grad에 저장된 값이 backward 할 때 방해를 주기에 적용 
        output = model(data)
        # loss = mini batch인 64개의 클래스의 오차 평균 값
        loss = f.cross_entropy(output, target)
        # cross_entropy - 다중 분류
        loss.backward()
        optimizer.step()
 --------------------------------------------------
 def evaluate(model, test_loader):
    # 평가 모드
    model.eval()
    
    test_loss = 0
    # test 과정에서 Loss
    correct = 0
    #실제 모델 예측이 정답과 맞은 횟수
    with torch.no_grad():# 평가 과정에서는 기울기를 계산하지 않기에, no_grad
        for data, target in test_loader:
            data, target = data.to('cuda'), target.to('cuda')
            output = model(data)
            
            test_loss += f.cross_entropy(output, target, reduction='sum').item()
            
            pred = output.max(1, keepdim=True)[1]
            correct += pred.eq(target.view_as(pred)).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)
    test_loss, test_accuracy = evaluate(model, test_loader)
    
    print('[{}] Test Loss: {:.4f}, Accuracy: {:.2f}%'.format(epoch, test_loss, test_accuracy))

profile
호기심천국

0개의 댓글

Powered by GraphCDN, the GraphQL CDN