-
데이터 분석_파이토치 : Pytorch3DATA_STUDY 2024. 1. 22. 17:08
https://datawithu.tistory.com/59 에서는 모델정의 및 파라미터 옵션 등을 알아봤습니다
오늘은 예제를 첨부합니다.
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)
'DATA_STUDY' 카테고리의 다른 글
파이썬_워드클라우드 2 (0) 2024.01.22 파이썬_파일읽고쓰기_워드클라우드 (1) 2024.01.22 데이터 분석_파이토치 : Pytorch2 (0) 2024.01.22 데이터 분석_파이토치 : Pytorch1 (0) 2024.01.19 데이터 분석_라이브러리_함수_모음_ (1) 2023.11.01