iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
AI & Data

從零開始或許曾經想過但想想還是算了的深度雜技系列 第 11

[DAY 11] 當風扇開始轉的那一刻 : CNN的實現

  • 分享至 

  • xImage
  •  

前言


再來個阿峻廢文:

與其在宿舍想明天7:00的早餐要吃啥,不如半夜的現在去樓下小七買泡麵!
-----阿峻20190927

我們已經知道了組成一個簡單的 CNN 做 classification 所需要的部件了,那麼接著我們就需要使用 Pytorch 的 Tool 來建構一個真實能夠動的 Model來看看效果了~

CNN 實作

我們拿 Pytorch 官網的 tutorial 來進行說明,一般來說我們要建構一個 CNN 的 model 並進行 training 以及 Testing , 我們需要完成以下幾件事:

  1. 載入 Dataset 並進行預處理
    (Load and normalizing the CIFAR10 training and test datasets using torchvision)
  2. 定義我們的神經網路 (Model)
    (Define a Convolution Neural Network)
  3. 定義 Loss Function
    (Define a loss function)
  4. 使用 Training dataset 來訓練我們的 Model
    (Train the network on the training data)
  5. 使用 Testing dataset 來測試我們訓練好的 Model
    (Test the network on the test data)

為了方便給大家練習,我們一樣使用之前介紹過的 Colab 來練習,相關文章可以參考這個~

載入 Dataset 並進行預處理

我們這一個 Part 其實之前在 [DAY 05] 從頭訓練大Model?想多了 : Torchvision 簡介 這一章中的 "使用 Dataset" 這一 Part 介紹過了~所以這邊我們就只貼上 Code 吧 :

import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

如果你想看看現在 load 進來的 Dataset長啥樣,可使用下方程式:

import matplotlib.pyplot as plt
import numpy as np

# functions to show an image


def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()


# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

定義我們的神經網路 (Model)

話先不多說,我們先貼上完整的 Code ,再逐步解釋每個 Part 跟 Function 是啥意思:

import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()

好了先打到這,我先睡個,明天順便一起補完XD

定義 Loss Function

使用 Training dataset 來訓練我們的 Model

使用 Testing dataset 來測試我們訓練好的 Model


上一篇
[DAY 10] CNN的反向傳播 : Backpropagation
下一篇
[DAY 12] 輪迴故事裡的那些因果 : RNN 簡介
系列文
從零開始或許曾經想過但想想還是算了的深度雜技30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言