《動手學深度學習》Pytorch版學習筆記(二):Task03

課程背景

在疫情的影響下,不少學校已經做出了延遲開學的決定,:伯禹教育Datawhale和鯨科技牽頭與多家AI企業合作,讓在家的同學也能免費學習優質的付費課程,同時爲學習者創建好的學習環境,提供就業綠色通道。

主修課程

《動手學深度學習》 代碼講解Pytorch版:該書是2019年國內最受歡迎的人工智能學習教材之一,是一本面向中文讀者的能運行、可討論的深度學習教科書,書籍作者之一亞馬遜首席科學家李沐,畢業於上海交大。伯禹教育攜手上海交通大學團隊,基於此書籍,將其中的代碼框架由MXNET遷移至PyTorch,並對這些代碼製作了講解視頻。幫助大家邊動手寫代碼邊鞏固理論知識,從原理到實踐,上手深度學習。

1 任務

【第二次打卡】內容(2月15日-17日)
1.Task03:過擬合、欠擬合及其解決方案;梯度消失、梯度爆炸;循環神經網絡進階(1天)
2.Task04:機器翻譯及相關技術;注意力機制與Seq2seq模型;Transformer(1天)
3.Task05:卷積神經網絡基礎;leNet;卷積神經網絡進階(1天)
打卡時間:【2020-02-15 08:00 -- 2020-02-17 22:00】
打卡鏈接:學習開始放出

2 卷積神經網絡基礎

2.1 卷積層

本節介紹的是最常見的二維卷積層,常用於處理圖像數據。

二維互相關(cross-correlation)運算的輸入是一個二維輸入數組和一個二維核(kernel)數組,輸出也是一個二維數組,其中核數組通常稱爲卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入數組,卷積核在輸入數組上滑動,在每個位置上,卷積核與該位置處的輸入子數組按元素相乘並求和,得到輸出數組中相應位置的元素。圖1展示了一個互相關運算的例子,陰影部分分別是輸入的第一個計算區域、核數組以及對應的輸出。

下面我們用corr2d函數實現二維互相關運算,它接受輸入數組X與核數組K,並輸出數組Y

import torch 
import torch.nn as nn

def corr2d(X, K):
    H, W = X.shape
    h, w = K.shape
    Y = torch.zeros(H - h + 1, W - w + 1)
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
    return Y

二維卷積層將輸入和卷積核做互相關運算,並加上一個標量偏置來得到輸出。卷積層的模型參數包括卷積核和標量偏置。

class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super(Conv2D, self).__init__()
        self.weight = nn.Parameter(torch.randn(kernel_size))
        self.bias = nn.Parameter(torch.randn(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias

2.2 填充和步幅

我們介紹卷積層的兩個超參數,即填充步幅,它們可以對給定形狀的輸入和卷積核改變輸出形狀。

填充(padding) 是指在輸入高和寬的兩側填充元素(通常是0元素)。

步幅 指在互相關運算中,卷積核在輸入數組上滑動,每次滑動的行數與列數即是步幅(stride)。

2.3 多輸入通道和多輸出通道

之前的輸入和輸出都是二維數組,但真實數據的維度經常更高。例如,彩色圖像在高和寬2個維度外還有RGB(紅、綠、藍)3個顏色通道。假設彩色圖像的高和寬分別是 h 和 w (像素),那麼它可以表示爲一個 3×h×w 的多維數組,我們將大小爲3的這一維稱爲通道(channel)維。

2.4 卷積層與全連接層的對比

二維卷積層經常用於處理圖像,與此前的全連接層相比,它主要有兩個優勢:

一是全連接層把圖像展平成一個向量,在輸入圖像上相鄰的元素可能因爲展平操作不再相鄰,網絡難以捕捉局部信息。而卷積層的設計,天然地具有提取局部信息的能力

二是卷積層的參數量更少。不考慮偏置的情況下,一個形狀爲 (ci,co,h,w) 的卷積核的參數量是 ci×co×h×w ,與輸入圖像的寬高無關。假如一個卷積層的輸入和輸出形狀分別是 (c1,h1,w1) 和 (c2,h2,w2) ,如果要用全連接層進行連接,參數數量就是 c1×c2×h1×w1×h2×w2 。使用卷積層可以以較少的參數數量來處理更大的圖像。

2.5 卷積層的簡潔實現

我們使用Pytorch中的nn.Conv2d類來實現二維卷積層,主要關注以下幾個構造函數參數:

in_channels (python:int) – Number of channels in the input imag
out_channels (python:int) – Number of channels produced by the convolution
kernel_size (python:int or tuple) – Size of the convolving kernel
stride (python:int or tuple, optional) – Stride of the convolution. Default: 1
padding (python:int or tuple, optional) – Zero-padding added to both sides of the input. Default: 0
bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
forward函數的參數爲一個四維張量,形狀爲 (N,Cin,Hin,Win) ,返回值也是一個四維張量,形狀爲 (N,Cout,Hout,Wout) ,其中 N 是批量大小, C,H,W 分別表示通道數、高度、寬度。

X = torch.rand(4, 2, 3, 5)
print(X.shape)

conv2d = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=(3, 5), stride=1, padding=(1, 2))
Y = conv2d(X)
print('Y.shape: ', Y.shape)
print('weight.shape: ', conv2d.weight.shape)
print('bias.shape: ', conv2d.bias.shape)

2.6 池化

池化層主要用於緩解卷積層對位置的過度敏感性。同卷積層一樣,池化層每次對輸入數據的一個固定形狀窗口(又稱池化窗口)中的元素計算輸出,池化層直接計算池化窗口內元素的最大值或者平均值,該運算也分別叫做最大池化或平均池化。圖6展示了池化窗口形狀爲 2×2 的最大池化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章