Rylah's Study & Daily Life
PyTorch 02. MNIST 본문
import torch
# 입력 뉴런 : 5개, 출력 뉴런 : 3개
# 총 사용 시냅스 15개
hello = torch.nn.Linear(5, 3)
# 임의의 입력 벡터 2개 만들기
data = torch.randn(2, 5)
# 인공 신명망에 입력하고 결과를 출력
print(data)
print(hello(data))
# 필요한 패키지 가져오기
from torchvision.datasets import MNIST # TorchVision에서 MNIST 함수를 가져옴 (배치 설정 등)
import torchvision.transforms as transforms # Torchvision에서 Transform 함수를 수입
from torch.utils.data import DataLoader # Dataloader, 학습용 데이터를 한줄씩 가져올 때 사용
import torch.nn as nn # 인공신경망을 만드는 층 NN 패키지
from torchsummary import summary
# 데이터 변환 방식 지정
rules = transforms.Compose([ # DNN이 PyTorch로 만들어지기 때문에 Pytorch Tensor로 전환
transforms.ToTensor(), # Numpy -> PyTorchTensor
])
# 학습용 데이터 로더
train_loader = DataLoader( # 6만개의 이미지, 한 배치 = 500개씩
MNIST('mnist', train=True, download=True, transform=rules),
batch_size=500, shuffle=True
)
# 평가용 데이터 로더
test_loader = DataLoader(
MNIST('mnist', train=False, download=True, transform=rules),
batch_size=500, shuffle=False
)
# 임의의 이미지 한 batch 가져오기
# i = iter(train_loader)
# images, labels = i.next()
#
# print(images[0])
# print(labels[0])
# PyTorch DNN을 Sequential 모델로 구현
model = nn.Sequential(
nn.Flatten(), # Flatten() -> 784개 은닉 층
nn.Linear(784, 128), # 784 * 128 Connect
nn.ReLU(), # ReLu : 음수를 모두 0으로 만들어 줌
nn.Dropout(p=0.2), # 20%를 임의로 선택해서 0으로 만들어 줌
nn.Linear(128, 10), # 출력 층 128개 뉴런과 출력층 뉴런 10개를 연결
nn.Softmax(dim=1)
)
# 인공신경망 요약
print('\nDNN 요약')
summary(model, (1, 28, 28))
# 최적화 함수와 손실 함수 지정
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 최적화 Adam
criterion = nn.CrossEntropyLoss() # 교차 엔트로피, 손실 함수
# 인공 신경망 학습
for epoch in range(5): # 기계 학습 5번 반복
for data in train_loader: # 데이터는 학습용 데이터를 사용 (120번 반복)
inputs, labels = data # data 안에 담긴 데이터를 분리
outputs = model(inputs) # 순방향으로 DNN을 계산
# print(inputs.shape)
# print(outputs.shape)
# print(labels.shape)
# 손실값 계산
loss = criterion(outputs, labels) # 교차 엔트로피로 손실값 계산 (1개만 있음), Pytorch는 평균 손실 하나가 있음
# print(loss.shape)
# exit()
# 역전파 알고리즘(Adam)으로 가중치 보정
model.zero_grad()
loss.backward()
optimizer.step()
# 손실값 출력
print('Epoch : {},'.format(epoch),
'Loss : {:.3f}'.format(loss.item()))
# 인공 신경망 평가
correct = 0
for images, labels in test_loader:
with torch.no_grad(): # 기울기 연산 Skip
pred = model(images)
# softmax 활성화를 라벨로 전환
pred = torch.argmax(pred, dim=1)
# print(pred.shape)
for i in range(500):
if (pred[i] == labels[i]):
correct += 1
print('Percent : ', correct / 10000)
tensor([[ 0.8771, 1.0424, 1.8757, -0.7725, -0.6370],
[-0.5681, 2.1966, -1.9787, 0.9368, 0.4686]])
tensor([[-0.5113, -0.4410, -0.4694],
[ 1.3189, -0.2006, -0.1333]], grad_fn=<AddmmBackward>)
DNN 요약
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Flatten-1 [-1, 784] 0
Linear-2 [-1, 128] 100,480
ReLU-3 [-1, 128] 0
Dropout-4 [-1, 128] 0
Linear-5 [-1, 10] 1,290
Softmax-6 [-1, 10] 0
================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.01
Params size (MB): 0.39
Estimated Total Size (MB): 0.40
----------------------------------------------------------------
Epoch : 0, Loss : 1.637
Epoch : 1, Loss : 1.603
Epoch : 2, Loss : 1.533
Epoch : 3, Loss : 1.509
Epoch : 4, Loss : 1.487
Percent : 0.9591
Process finished with exit code 0
'Study > Deep Learning' 카테고리의 다른 글
RNN 시계열로 추측해보는 감자 가격 (0) | 2022.05.12 |
---|---|
PyTorch 03. DNN - Heart Disease Dataset (0) | 2022.02.11 |
PyTorch 01. Basic PyTorch (0) | 2022.02.11 |
Pytorch 00. Hello Pytorch (0) | 2022.02.11 |
[Tensorflow] 04. RNN - AirLine (0) | 2022.01.26 |