二元與多類別影像分類

使用 PyTorch 進行影像深度學習

Michal Oleszak

Machine Learning Engineer

用 PyTorch 會學到什麼?

tasks

使用 PyTorch 進行影像深度學習

用 PyTorch 會學到什麼?

tasks

使用 PyTorch 進行影像深度學習

用 PyTorch 會學到什麼?

tasks

使用 PyTorch 進行影像深度學習

用 PyTorch 會學到什麼?

tasks

使用 PyTorch 進行影像深度學習

先修需求

使用 PyTorch 進行影像深度學習

PyTorch 函式庫

torchvision

使用 PyTorch 進行影像深度學習

PyTorch 函式庫

torchvision

使用 PyTorch 進行影像深度學習

PyTorch 函式庫

torchvision

使用 PyTorch 進行影像深度學習

PyTorch 函式庫

torchvision

使用 PyTorch 進行影像深度學習

影像分類

             二元分類

binary

  • 兩個類別(貓、狗)
  • 啟用函式:Sigmoid

             多類別分類

multi-class

  • 多個類別(船、火車、汽車)
  • 啟用函式:Softmax
  • 最高機率作為預測
使用 PyTorch 進行影像深度學習

卷積神經網路模型

  cnn

使用 PyTorch 進行影像深度學習

卷積神經網路模型

  binary

使用 PyTorch 進行影像深度學習

卷積神經網路模型

  binary

使用 PyTorch 進行影像深度學習

卷積神經網路模型

  binary

使用 PyTorch 進行影像深度學習

卷積神經網路模型

  binary

使用 PyTorch 進行影像深度學習

資料集:類別標籤

image folders

from torchvision import datasets
import torchvision.transforms as transforms


train_dir = '/data/train' train_dataset = ImageFolder(root=train_dir, transform=transforms.ToTensor())
classes = train_dataset.classes
print(classes)
['cat', 'dog']
print(train_dataset.class_to_idx)
{'cat': 0, 'dog': 1}
使用 PyTorch 進行影像深度學習

二元影像分類:卷積層

  • Conv2d():
    • 輸入:3 個 RGB 通道(red、green、blue)
    • 輸出:16 個通道
    • 卷積核:3 x 3 矩陣
    • 步幅 = 1:卷積核移動 1 格
    • 邊界補零 = 1:邊緣各 1 像素
  • ReLU():
    • 非線性啟用函式
  • MaxPool2d():
    • 卷積核:2x2
    • 步幅:2 格
class BinaryCNN(nn.Module):
    def __init__(self):
        super(BinaryCNN, self).__init__()

self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
def forward(self, x): return x
使用 PyTorch 進行影像深度學習

二元影像分類:全連接層

  • Flatten():
    • 將張量攤平成 1 維向量
  • Linear():
    • 輸入:特徵圖 x 高 x 寬
    • 輸出:單一類別
  • Sigmoid():
    • [0,1]
class BinaryCNN(nn.Module):
    def __init__(self):
        super(BinaryCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16,
                kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, 
                     stride=2)

self.flatten = nn.Flatten()
self.fc1 = nn.Linear(16 * 112 * 112, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.pool(self.relu(self.conv1(x))) x = self.fc1(self.flatten(x)) x = self.sigmoid(x)]
return x
使用 PyTorch 進行影像深度學習

使用 CNN 的多類別影像分類

class MultiClassCNN(nn.Module):
    def __init__(self, num_classes):
        super(MultiClassCNN, self).__init__()
        ...

self.fc = nn.Linear(16 * 112 * 112, num_classes)
self.softmax = nn.Softmax(dim=1)
def forward(self, x): ...
x = self.softmax(x)
return x
使用 PyTorch 進行影像深度學習

一起來練習吧!

使用 PyTorch 進行影像深度學習

Preparing Video For Download...