cnn - cccbook/py2gpt GitHub Wiki

CNN 卷積神經網路

CNN 最簡單又經典的一個例子就是郵遞區號的手寫數字辨識,該資料集稱為 MNIST,我們現在可以用 Pytorch 很容易的實作出 CNN 如下:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x): # x.shape:torch.Size([1000, 1, 28, 28])
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return x

上述程式中的 Conv2d 就是卷積層

以下是一個 CNN 的網路模型

問題是,為何 CNN 能有效的辨識影像呢?

你可以參考下列圖形

在上圖中,CNN 透過卷積層,抽取影像的特徵,逐步將特徵組合成為更大的特徵,例如

  1. 先抽取《直線、橫線、斜線》等特徵
  2. 將《直線、橫線、斜線》組合成《鼻子、眼睛、嘴巴》等器官
  3. 將《鼻子、眼睛、嘴巴》等器官,組合成一張一張的人臉

如果你想進一步理解 CNN 網路,可以參考 Karpathy 的 ConvNetJS ,該專案用 JavaScript 實作了一個網頁版的卷積神經網路,並且將所有的中間層都顯示出來

透過觀察 ConvNetJS ,你可能會對 CNN 卷積神經網路有更進一步的理解