題目
2019TOI1214 新手同好會 5. 卷積神經網路 (CNN) {試題連結}
問題敘述
卷積神經網絡 (Convolutional Neural Network) 簡稱 CNN,是現在最火紅的深度學習課程必教的模型。 CNN 在影像識別方面非常厲害,許多影像辨識的模型都是以 CNN 的架構為基礎去做延伸。 CNN 分為三個部分:卷積層 (convolution layer)、池化層 (pooling layer) 和全連接層 (fully connected layer)。 卷積層用於提取影像特徵,池化層減小資料的空間大小,全連接層主要目的為實現分類。 池化層最常見的作法是最大池化法 (max pooling),它將輸入的影像劃分為若干個 2×2 的矩形子區域,對每個子區域輸出最大值。 給定一個 n×n 的二維陣列,請實作最大池化演算法並輸出池化後的結果。
最大池化法示意圖 圖片來源:https://embarc.org/embarc_mli/doc/build/html/MLI_kernels/pooling_max.html
輸入格式
第一行有一個正整數n(4 <= n <= 20,n為2的倍數),代表輸入影像邊長。接下去有n行,每行各有n個數字,數值範圍在正負 2^31 之間,以空白隔開,代表影像陣列中的資料值。
輸出格式
輸出經2x2 最大池化後的結果。
範例測資
|
|
解題方向
簡化題目後,我們可以得出題目是要我們把一個大矩陣都拆成2*2的小矩陣。然後把每個小矩陣的最大值輸出成一個新的矩陣,而這個過程被稱作池化。了解題目的要求後就簡單了,我的作法是以一個小區塊先池化,輸出後再處理下一個小區塊。
如下圖所示,而實際的方法可以把輸入的影像邊常除2,再丟進迴圈裡跑。這樣迴圈每跑次就是處理一組小矩陣。 比較要注意的是後續處理比較四格大小的時候,要記得把迴圈索引值乘2。
參考程式碼
|
|