keras中的卷積層&池化層

卷積層

創建卷積層

首先導入keras中的模塊

from keras.layers import Conv2D
卷積層的格式及參數:
Conv2D(filters, kernel_size, strides, padding, activation='relu', input_shape)

filters: 過濾器數量
kernel_size:指定卷積窗口的高和寬的數字
strides: 卷積stride,如果不指定任何值,則strides設爲1
padding: 選項包括’valid’和’same’,默認值爲’valid’
activation: 通常爲’relu’,如果不指定任何值,則不應用任何激活函數,通常應該向網絡中每個卷積層添加一個Relu激活函數
如果卷積層出現在輸入層之後,必須提供另一個input_shape參數:
input_shape: 指定輸入的高度、寬度和深度的元組;如果卷積層不是網絡的第一個層級,則不應該包含input_shape參數。

示例1:
假設我要構建一個 CNN,輸入層接受的是 200 x 200 像素(對應於高 200、寬 200、深 1 的三維數組)的灰度圖片。然後,假設我希望下一層級是卷積層,具有 16 個過濾器,每個寬和高分別爲 2。在進行卷積操作時,我希望過濾器每次跳轉 2 個像素。並且,我不希望過濾器超出圖片界限之外;也就是說,我不想用 0 填充圖片。要構建該卷積層,我將使用下面的代碼

Conv2D(filters=16, kernel_size=2, strides=2, activation='relu', input_shape=(200, 200, 1))

示例 2
假設我希望 CNN 的下一層級是卷積層,並將示例 1 中構建的層級作爲輸入。假設新層級是 32 個過濾器,每個的寬和高都是 3。在進行卷積操作時,我希望過濾器每次移動 1 個像素。我希望卷積層查看上一層級的所有區域,因此不介意過濾器在進行卷積操作時是否超過上一層級的邊緣。然後,要構建此層級,我將使用以下代碼:

Conv2D(filters=32, kernel_size=3, padding='same', activation='relu')
卷積層中的參數數量

卷積層中的參數數量取決於filters, kernel_size, input_shape的值
K: 卷積層中的過濾器數量, K=filters
F:卷積過濾器的高度和寬度, F = kernal_size
D_in: 上一層級的深度, D_in是input_shape元組中的最後一個值
卷積層中的參數數量計算公式爲:K * F * F * D_in + K

卷積層的形狀

卷積層的形狀取決於kernal_size, input_shape, padding, stride的值
K: 卷積層中的過濾器數量,K = filters
F: 卷積過濾器的高度和寬度, F = kernal_size
H_in: 上一層級的高度
W_in: 上一層級的寬度
S: stride
卷積層的深度始終爲過濾器數量K
如果padding=‘same’, 那麼卷積層的空間維度計算公式如下:
height = ceil(float(H_in) / float(S))
width = ceil(float(W_in) / float(S))
如果padding = ‘valid’, 那麼卷積層的空間維度計算公式如下:
height = ceil(float(H_in - F + 1) / float(S))
width = ceil(float(W_in - F + 1) / float(S))

可以使用如下形式檢測卷積層的維度:

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=3, strides=2, padding='same', 
    activation='relu', input_shape=(128, 128, 3)))
model.summary()

池化層

keras中的最大池化層

創建池化層,首先導入keras中的模塊

from keras.layers import MaxPooling2D

然後用以下形式創建池化層

MaxPooling2D(pool_size, strides, padding)
參數

pool_size:指定池化窗口高度和寬度的數字
strides:垂直和水平stride,默認參數爲pool_size
padding:選項包括’valid’和’same’,默認參數爲’valid’

示例:
假設我要構建一個 CNN,並且我想通過在卷積層後面添加最大池化層,降低卷積層的維度。假設卷積層的大小是 (100, 100, 15),我希望最大池化層的大小爲 (50, 50, 15)。要實現這一點,我可以在最大池化層中使用 2x2 窗口,stride 設爲 2,代碼如下:

MaxPooling2D(pool_size=2, strides=2)

如果你想將 stride 設爲 1,但是窗口大小依然保留爲 2x2,則使用以下代碼:

MaxPooling2D(pool_size=2, strides=1)

可以使用如下形式檢測最大池化層的維度:

from keras.models import Sequential
from keras.layers import MaxPooling2D

model = Sequential()
model.add(MaxPooling2D(pool_size=2, strides=2, input_shape=(100, 100, 15)))
model.summary()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章