1. 程式人生 > >自己動手實現深度學習框架-6 卷積層和池化層

自己動手實現深度學習框架-6 卷積層和池化層

程式碼倉庫: 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