自己動手實現深度學習框架-6 卷積層和池化層
阿新 • • 發佈:2020-05-18
程式碼倉庫: https://github.com/brandonlyg/cute-dl
(轉載請註明出處!)
# 目標
上個階段使用MLP模型在在MNIST資料集上實現了92%左右的準確率,達到了tensorflow同等模型的水平。這個階段要讓cute-dl框架支援最簡單的卷積神經網路, 並在MNIST和CIFA10資料上驗證,具體來說要達到如下目標:
1. 新增2D卷積層。
2. 新增2D最大池化層。
3. CNN模型在MNIST資料集上達到99%以上的準確率。
4. CNN模型在CIFA10資料集上達到70%以上在準確率。
# 卷積層的設計和實現
## 卷積運算
卷積運算有兩個關鍵要素: 卷積核(過濾器), 卷積運算步長。如果卷積運算的目標是二維的那麼卷積核可以用矩陣表示,卷積運算步長可以用二維向量。例如用kernel_size=(3,3)表示卷積核的尺寸,strides=(1,1)表示卷積運算的步長, 假如卷積核是這樣的:
![](https://img2020.cnblogs.com/blog/895062/202005/895062-20200518175425078-2061957728.png)
可以把它看成$R^{3 X 3}$矩陣。在步長strides=(1,1)的情況下卷積運算如下所示:
![](https://img2020.cnblogs.com/blog/895062/202005/895062-20200518175448901-1549797095.gif)
其中
$$
\begin{matrix}
128*0 + 97*1 + 53*0 + 35*1 + 22*0 + 25*1 + 37*0 + 24*1 + 28 * 0 = 181 \\
97*0 + 53*1 + 201*0 + 22*1 + 25*0 + 200*1 + 24*0 + 28*1 + 197 * 0 = 303 \\
... \\
\\
28*0 + 197*1 + 182*0 + 92*1 + 195*0 + 179*1 + 100*0 + 192*1 + 177 * 0 = 660
\end{matrix}
$$
**(注意示意圖中最後次運算計算有誤應該是660)**
這個卷積運算輸入的是一個高h=5, 寬w=5的特徵圖, 卷積運算輸出的是一個高h_=3, 寬w_=3的特徵圖。 如果已知w, h, kernel_size=$(h_k, w_k)$, strides=$(h_s, w_s)$, 那麼輸出特徵圖的高和寬分別為:
$$
\begin{matrix}
h\_ = \frac{h - h_k}{h_s} + 1 \\
w\_= \frac{w - w_k}{w_s} + 1 \\
\\
h, w, h_k, w_k, h_s, w_s \text{都是正整數,}, 1