Mnist DataSet

Uomnf97·2021년 5월 10일
0

Mnist Dataset

Mnist Dataset : Handwriteen digits dataset을 의미하고, 0~9까지 숫자 데이터가 입력되어 있다. 우편번호를 인식하고 싶어서 만들어진 데이터 셋이다.

  • 데이터 형태 :
  1. 28 * 28 이미지로 되어있으며2.
  2. 1개의 channel의 gray image
  3. 0~9까지의 숫자로 이루어있다.
  • torchvision : torchvision이라는 패키지를 통해서 여러 라이브러리 및 데이터 셋을 제공한다.
  1. torchvision.dataset: Mnist를 비롯한 여러 데이터 셋을 제공.
  2. torchvision.model: 모델링 아키텍셔 제공
  3. torchvision.transforms: 트랜스폼 아키텍쳐 제공
  4. torchvision.utils: 읽어 올 수 있도록 하는 함수
  • Epoch: Train데이터의 반복 횟수
  • Batch Size: Train Data의 추출 된 부분으로, 이 단위로 데이터를 학습시킴.
  • Iteration : 에폭 동안 반복하는 Batch데이터 셋의 횟수

  • 코드
# Lab 7 Learning rate and Evaluation
import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import random
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# for reproducibility
random.seed(777)
torch.manual_seed(777)
if device == 'cuda':
    torch.cuda.manual_seed_all(777)
    
# parameters
training_epochs = 15
batch_size = 100

# MNIST dataset
mnist_train = dsets.MNIST(root='MNIST_data/',
                          train=True,
                          transform=transforms.ToTensor(),
                          download=True)

mnist_test = dsets.MNIST(root='MNIST_data/',
                         train=False,
                         transform=transforms.ToTensor(),
                         download=True)
                         
# dataset loader
data_loader = torch.utils.data.DataLoader(dataset=mnist_train,
                                          batch_size=batch_size,
                                          shuffle=True,
                                          drop_last=True)
                                          
                                          # MNIST data image of shape 28 * 28 = 784
linear = torch.nn.Linear(784, 10, bias=True).to(device)

# define cost/loss & optimizer
criterion = torch.nn.CrossEntropyLoss().to(device)    # Softmax is internally computed.
optimizer = torch.optim.SGD(linear.parameters(), lr=0.1)

for epoch in range(training_epochs):
    avg_cost = 0
    total_batch = len(data_loader)

    for X, Y in data_loader:
        # reshape input image into [batch_size by 784]
        # label is not one-hot encoded
        X = X.view(-1, 28 * 28).to(device)
        Y = Y.to(device)

        optimizer.zero_grad()
        hypothesis = linear(X)
        cost = criterion(hypothesis, Y)
        cost.backward()
        optimizer.step()

        avg_cost += cost / total_batch

    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))

print('Learning finished')

# Test the model using test sets
with torch.no_grad():
    X_test = mnist_test.test_data.view(-1, 28 * 28).float().to(device)
    Y_test = mnist_test.test_labels.to(device)

    prediction = linear(X_test)
    correct_prediction = torch.argmax(prediction, 1) == Y_test
    accuracy = correct_prediction.float().mean()
    print('Accuracy:', accuracy.item())

    # Get one and predict
    r = random.randint(0, len(mnist_test) - 1)
    X_single_data = mnist_test.test_data[r:r + 1].view(-1, 28 * 28).float().to(device)
    Y_single_data = mnist_test.test_labels[r:r + 1].to(device)

    print('Label: ', Y_single_data.item())
    single_prediction = linear(X_single_data)
    print('Prediction: ', torch.argmax(single_prediction, 1).item())

    plt.imshow(mnist_test.test_data[r:r + 1].view(28, 28), cmap='Greys', interpolation='nearest')
    plt.show()
profile
사회적 가치를 실현하는 프로그래머

0개의 댓글