這幾天我們要講如何搭DQN的model,如果有玩過CNN的同學可直接跳過這章節,這篇會盡可能用好理解方式,讓沒接觸過CNN的讀者能有些概念。
稍微了解過AI的人應該都聽過tensorflow,跟pytorch一樣皆是類神經的計算框架,提供高效率、便捷的計算方法,讓使用者很彈性的建構類神經網路。不過我們將會使用Keras-高階封裝的類神經框架,底層也是tensorflow運作(新版的tensorflow聽說要keras化了),搭建個13層的network,由卷積(Conv2D)、池化層(MaxPooling2D)、激活層(Activation)、平展層(Flatten)、隱藏層(Dense)所組成,這章我們先來介紹卷積跟池化層。
卷積可想像成對於圖像,會有小視窗(濾鏡/filter)逐格橫掃。
早期某些圖像處理,會用3x3或5x5的filter使用固定的權重,做影像處理,例如銳利化。
如果圖像通過了好幾層的卷積做處理,可讓網路從一開始的輪廓解析,至局部解析,最後到接近輸出端衍生全局解析,進而達到對整張照片預測。對卷積不熟的人建議可以實際動手算一遍,其實卷積計算很簡單,在每次移動時會讓掃的地方match值相乘,接著把相乘結果相加做總和。
可調的參數很多,我們僅會介紹會重要的幾個:keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid')
池化層是種資訊壓縮的方法,設定好大小(通常都設2x2),簡化值(2x2→1x1)。有取最大值方法(maxpool-pooling)跟平均值方法(average-pooling)。原因是很多影像的局部有很多不必要空白,除了減少計算資源外,還可把重要資訊保留,不重要的捨棄(去噪),以此增加模型的收斂跟穩定性。keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid')
今天介紹兩個是影像處理非常通用的layer,還有其他種例如擴充卷積、轉至卷積、可分離卷積,有興趣都可以再研究看,每個卷積都有不同的特性跟應用場景。我們明天見拉!