ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 분석_파이토치 : Pytorch3
    DATA_STUDY 2024. 1. 22. 17:08

    https://datawithu.tistory.com/59   에서는 모델정의 및 파라미터 옵션 등을 알아봤습니다

     

    데이터 분석_라이브러리_함수_모음_2탄 : Pytorch2

    파이토치 (상편) https://datawithu.tistory.com/58 데이터 분석_라이브러리_함수_모음_2탄 : Pytorch1 해당 자료는 이수안 컴퓨터 연구소의 유튜브에 올라와있는 자료입니다. ! 유튜브에 이수안 컴퓨터 연구

    datawithu.tistory.com

    오늘은 예제를 첨부합니다. 


    Fashion_MNIST 분류 모델

    라이브러리 import

    import torch, math, numpy as np, pandas as pd
    from torch.utils.data import Dataset, DataLoader
    
    import torchvision.transforms as transforms
    from torchvision import datasets
    
    import matplotlib.pyplot as plt
    
    import torch.nn as nn
    import torch.nn.functional as F
    
    #평가지표 !pip install torchmetrics
    import torchmetrics
    
    #학습을 하기 위한 손실 함수 정의하기
    import torch.optim as optim

     

    1.GPU 설정

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    device #device(type='cuda')

    데이터 로드

    - 미리 Transform해두기

    import torchvision.transforms as transforms
    transform = transforms.Compose([transforms.ToTensor(),
                                   transforms.Normalize( (0.5, ), (0.5, ) )])

    - Transform 적용

    from torchvision import datasets
    # 데이터 가져오기
    trainset = datasets.FashionMNIST(root='/content/',
                                      train=True, download=True,
                                      transform=transform
                                      )
    testset = datasets.FashionMNIST(root='/content/',
                                      train=False, download=True,
                                      transform=transform
                                      )

    - 데이터 로더

    train_loader = DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
    test_loader = DataLoader(testset, batch_size=128, shuffle=True, num_workers=2)

    -어떤 이미지/데이터 인지 확인 

    #어떤 데이터인지/ 이미지인지 확인
    images, labels = next(iter(train_loader))
    images.shape, labels.shape
    
    # python 3.6 version
    # dataiter = iter(train_loader)
    # images, labels = dataiter.next()
    # images.shape, labels.shape
    
    # python 3.7 version부터는
    #dataiter = iter(train_loader)
    #images, labels = next(dataiter)
    #images.shape, labels.shape
    
    # (torch.Size([8, 1, 28, 28]), torch.Size([8])) # 28*28짜리 이미지, 1이면 흑백, 8개  => 8개의 흑백 사진이라는# 왜 8개인가 batch_size가 8이라서

    - 레이블 맵핑하고, 이미지 출력하기 

    #레이블 맵핑하기
    labels_map = {
        0:'T-Shirt',
        1:'Trouser',
        2:'Pullover',
        3:'Dress',
        4:'Coat',
        5:'Sandal',
        6:'Shirt',
        7:'Sneaker',
        8:'Bag',
        9:'Ankle Boot'
    }
    
    #이미지 일부 출력하기
    figure = plt.figure(figsize=(12,12))
    cols, rows = 4,4  #총 16개의 이미지를 뽑을예정임
    
    for i in range(1, cols*rows + 1):
        image = images[i].squeeze() #이미지 한개씩 가져와서 차원축소
        label_idx = labels[i].item() # 인덱스값 한개씩 가져와
        label = labels_map[label_idx] #인덱스값이 해당하는 레이블값으로
    
        figure.add_subplot(rows, cols, i)
        plt.title(label) #어떤 옷인지
        plt.axis('off') #이미지 출력이라 축은 필요없고
        plt.imshow(image, cmap='gray')#이미지 출력하기
    
    plt.show() #이제 보여줘!

    - 모델 정의 및 파라미터 만들기 

    class NeuralNet(nn.Module):
        def __init__(self):
            super(NeuralNet, self).__init__()
    
            self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=3)
            self.conv2 = nn.Conv2d(6, 16, 3)
            #fullyconnected
            self.fc1 = nn.Linear(in_features=16 * 5 *5, out_features=120 )
            self.fc2 = nn.Linear(120, 84 )
            self.fc3 = nn.Linear(84, 10 ) # 총 10개로 !!
    
        def forward(self, x ):
            x = F.max_pool2d(F.relu(self.conv1(x)), (2,2))
            x = F.max_pool2d(F.relu(self.conv2(x)), 2 )
            #리니어전에 Flatten
            x = x.view(-1, self.num_flat_features(x))
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    
        def num_flat_features(self, x):
            size = x.size()[1:] #전체사이즈 계산
            num_features = 1
    
            for s in size : #크기 만큼 반복ㅎ해서
             num_features *= s
    
            return num_features
    
    
    #neural net 만들기
    net = NeuralNet()
    print(net)

    - 파라미터 확인 

    #파라미터 확인
    params = list(net.parameters())
    print(len(params)) # 파라미터 크기 10
    print(params[0].size())
    # 랜던으로 fashion 이미지 하나 넣어서 테스트
    input = torch.randn(1,1, 28,28)
    out = net(input)
    print(out)

    - 손실 함수 & 옵티마이저 

    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

    - 모델 학습하기 

    - 배치수 확인 

    #몇 번을 돌아야하는지 배치수 확인
    total_batch = len(train_loader)
    print(total_batch)
    for epoch in range(10):
    
        running_loss = 0.0 # 0.0값으로 초기화
    
        for i, data in enumerate(train_loader, 0):
            inputs, labels = data
    
            optimizer.zero_grad()
    
            outputs = net(inputs)
            loss = criterion(outputs, labels) # 손실함수를 통해 결과값이랑, 레이블값을 비교
            loss.backward() #반영시켜주고
            optimizer.step()# step하면서 최적화할수있게
    
            running_loss += loss.item()
    
            if i % 100 == 99:
                print('Epoch: {}, iter:{}, Loss:{}'.format(epoch+1, i+1, running_loss/2000))
                running_loss = 0.0 #출력하고 나면 0으로 초기화시켜주는 것으로

    모델의 저장 및 로드

    • torch.save: net.state_dict()를 저장
    • torch.load: load_state_dict로 모델을 로드
    PATH = './fsahion_mnist.pth'
    torch.save(net.state_dict(), PATH) #해당 모댈 net을 현재상태의 dict으로 저장해줘

    - 저장 모델 확인하기 

    # 저장한 모델 불러오기
    net = NeuralNet()
    net.load_state_dict(torch.load(PATH))
    # <All keys matched successfully> 잘들어왔따.
    #모델 확인하기
    net.parameters

    모델 테스트

    #이미지를 넣었을 때 확인하는 함수만들기
    def imshow(image) :
        image = image / 2 + 0.5
        npimg = image.numpy()
    
        fig = plt.figure(figsize=(16,8))
        plt.imshow(np.transpose(npimg, (1,2,0))) # transpose로 이미지 순서 바꿔주고
        plt.show()
    # 테스트 데이터 확인하기
    import torchvision
    
    # python 3.6 version
    # dataiter = iter(test_loader)
    # images, labels = dataiter.next()
    # images.shape, labels.shape
    
    # python 3.7 version부터는
    dataiter = iter(test_loader)
    images, labels = next(dataiter)
    images.shape, labels.shape
    
    imshow(torchvision.utils.make_grid(images[:6]))

    확인1.

    outputs = net(images)
    _, predicted = torch.max(outputs, 1) # 10개에 대한 확률값이 나오고 그 중 최대값을 가진것으로
    print(predicted)
    
    # 값 정리하기 해서 리스트 뽑기
    print(''.join('{},  '.format(labels_map[int(predicted[j].numpy())]) for j in range(6) ))

    정확도 측정하기 

    # 검증 과정에는 역전파가 필요하지 않기 때문에 with torch.no_grad() 를 사용하여 기울기 값을 저장하지 않도록 한다. (메모리, 연산 시간 줄이기)
    
    correct = 0
    total = 0
    
    with torch.no_grad():
        for data in test_loader :
             images, labels = data
             outputs = net(images)
             _, predicted = torch.max(outputs.data, 1)
             total += labels.size(0)
             correct += (predicted == labels).sum().item()
    
    print(100*correct /total ) #정확도 체크

    pytorch mnist는  요기 사이트에 가면 빠밤하고 나온다.

    [Python] 파이토치(PyTorch)를 사용한 MNIST 문자인식 구현 예제 :: . . . (tistory.com)

     

    [Python] 파이토치(PyTorch)를 사용한 MNIST 문자인식 구현 예제

    머신러닝을 통한 음식 분류를 하기 전에, 어떤 라이브러리를 사용할 것인지에 대해 고민해보기로 했다. Keras는 TensorFlow위에서 동작이 가능하다고 하니 PyTorch와 TensorFlow로 가장 기본적인 예제인 M

    yong0810.tistory.com

     

Designed by Tistory.