+4

Tutorial Pytorch From Basic to Expext.P2: Classification Fashion-MNIST

Tổng quan

Chúng ta đã học qua lí thuyết cơ bản ở phần một rồi, bây giờ bắt tay vào code thử 1 model đơn giản. Ở đây mình sẽ phân loại quần áo dựa trên bộ dữ liệu Fashion-MNIST.
MNIST thực sự khá tầm thường với các mạng neuron networks mà bạn có thể dễ dàng đạt được độ chính xác lớn hơn 97%. Fashion-MNIST là một tập hợp các hình ảnh quần áo có tỷ lệ 28x28 màu xám. Nó phức tạp hơn MNIST, vì vậy nó thể hiện tốt hơn hiệu suất thực tế trong mạng của bạn và thể hiện tốt hơn các tập dữ liệu mà bạn sẽ sử dụng trong thế giới thực.

Tiếp theo chúng ta cần phải đề ra phương hướng tiếp cận.

Phương hướng tiếp cận

Theo kinh nghiệm code gà của mình 😂 thì cách tiếp cận bài toán theo các bước sau đây :
B1. Thu thập, chuẩn bị dữ liệu

  • 👍Có thể thu thập dữ liệu từ các nguồn có sắn trên mạng: dataset có sắn, crawl data,...
    
  • 👍Dùng GAN (Generative Adversarial Networks) để sinh thêm dữ liệu
    

B2. Xử lí, chuẩn hóa dữ liệu

  • 👍 Augmentation data: resize, flip, affine,crop,...
    
  • 👍 Normalize data
    
  • 👍Chia làm 2 tập dữ liệu : training để huấn luyện và testing để kiểm tra kết quả
    

B3. Viết class Dataset, DataLoader

  • Cái này mình sẽ giành phần riêng để nói về phần này. Các bạn có thể xem phần3 để hiểu thêm.

B4. Build model

  • 👍 Xây dựng kiến trúc model
    
  • 👍 Viết hàm loss, optimizer. Có thể sử dụng hàm có sẵn cho khỏe
    

B5. Train model

  • 👍 Viết hàm train
    
  • 👍 Train trên CPU hoặc GPU
    

B6. Test, visualize

Vì bài này đơn giản để tiếp cận pytorch nên mình chỉ code theo các bước sau:

  • 👍 Load dữ liệu FASHION-MNIST
    
  • 👍 Build model
    
  • 👍 Train model
    
  • 👍 Test, visualize
    

Load dữ liệu FASHION-MNIST

Đầu tiên cần load dataset từ thư viện torchvision

import torch
from torchvision import datasets, transforms
import helper

# Define a transform to normalize the data
transform = transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.5,), (0.5,))])
# Download and load the training data
trainset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

# Download and load the test data
testset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=False, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)

Tại đây bạn có thể xem một số bức ảnh trong dataset

# example of loading the fashion mnist dataset
from matplotlib import pyplot
# plot first few images
for i in range(9):
	# define subplot
	pyplot.subplot(330 + 1 + i)
	# plot raw pixel data
	pyplot.imshow(trainset[i], cmap=pyplot.get_cmap('gray'))
# show the figure
pyplot.show()

Build model

Import các thư viện cần thiết

import torch
from torch import nn, optim
import torch.nn.functional as F

Xây dựng kiến trúc mạng

# TODO: Define your network architecture here
class Classifier(nn.Module):
    def __init__(self):
        super().__init__()
        # Because images is 28x28 which is a total of 784 pixels
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 64)
        # 10 classes
        self.fc4 = nn.Linear(64, 10)
        
    def forward(self, x):
        # make sure input tensor is flattened
        x = x.view(x.shape[0], -1)
        
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = F.log_softmax(self.fc4(x), dim=1)
        
        return x

Train model

Đầu tiên bạn cần định nghĩa hàm loss (ví dụ như nn.CrossEntropyLoss hoặc nn.NLLLoss hoặc nn.MSELoss) và hàm optimizers (ví dụ như optim.SGD hoặc optim.Adam).

# TODO: Create the network, define the criterion and optimizer
model = Classifier()
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)

Sau đó viết hàm train

# TODO: Train the network here
epochs = 5
def train():
    for e in range(epochs):
        running_loss = 0.0
        for images, labels in trainloader:
            log_ps = model(images)
            loss = criterion(log_ps, labels)
            
            optimizer.zero_grad() # cần xóa gradient sau mỗi vòng lặp để tránh chồng chất gradient vì đạo hàm hàm hợp của backpropagation
            loss.backward() # backpropagation process
            optimizer.step() # update weights

            running_loss += loss.item()
        else:
            print(f"Training loss: {running_loss/len(trainloader)}")

Quá trình training

Test , visualize

Visualize kết quả

%matplotlib inline
%config InlineBackend.figure_format = 'retina'

import helper

# Test out your network!

dataiter = iter(testloader)
images, labels = dataiter.next()
img = images[1]

# TODO: Calculate the class probabilities (softmax) for img
ps = torch.exp(model(img))

# Plot the image and probabilities
helper.view_classify(img, ps, version='Fashion')

Exercise

Link all code : https://github.com/trungtruc123/Pytorch/blob/master/intro-to-pytorch/Part 4 - Fashion-MNIST (Solution).ipynb
Các bạn có thể tải 8 bài tập từ link để làm. Bài tập gồm 2 phần exercises và solutions. Làm exercise xong mới quay lại xem đáp án nhé 😂. Chúc các bạn thành công!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí