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ể

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ệ 28×28 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!

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ