2017-06-17 146 views
1

我使用Keras 1.1.1創建的cnn模型有兩個卷積池層,後面是兩個密集層,在第二個卷積池層和第一個密集層之後添加了丟失。的代碼如下:Keras CNN模型參數計算

model = Sequential() 
#convolution-pooling layers 
model.add(Convolution2D(32, 5, 5, input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Convolution2D(64, 5, 5)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
#dense layers 
model.add(Flatten()) 
model.add(Dense(100)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add((Dense(2))) 
model.add(Activation('softmax')) 
#optimizer 
sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer = sgd, 
       metrics=['accuracy']) 
print model.summary() 

模型總結出表格如下:

enter image description here

我不清楚如何的第二卷積層的參數(即,51264的數由紅色矩形指示)被計算。我認爲這個數字是(5 * 5 + 1)* 64 = 1664,因爲卷積核的大小是5 * 5,要提取64個特徵地圖。

此外,我已經實施了丟失。爲什麼參數表不能反映這一點。看起來沒有丟失的參數號碼被給出,儘管在表格中列出了丟失(層)。任何人都可以幫我解釋參數摘要?

+0

關於丟失:這在訓練期間隨機禁用神經元。它們仍然存在於您的模型中,因此不會因模型摘要中的參數數量而減少。 – petezurich

+0

我認爲你是對的 – jingweimo

回答

3

它是一個相當簡單的計算與基本概念。並通過查看您的代碼和模型總結這是我的步驟。

步驟1:式計算參數

total_params =
(filter_height * filter_width * input_image_channels + 1)* NUMBER_OF_FILTERS

步驟2:計算參數第一層

filter_height = 5
filter_weight = 5
input_image_channels = 1
number_of_filters = 32
雖然你還沒有給我們提供了開關輸入 圖像通道,但我理解了它從你的參數值。現在

我們將計算爲第一CONV層參數的數目。

total_param =(5 * 5 * 1 + 1)* 32 = 832

步驟3:同樣,我們可以計算出第二CONV層。 請注意,來自上一層的濾鏡數量將成爲當前圖層輸入圖像的通道數量。

filter_height = 5
filter_weight = 5
input_image_channels = 32
number_of_filters = 64

現在,我們將計算爲第二CONV層參數的數目。

total_param =(5 * 5 * 32 + 1)* 64 = 51264

+1

謝謝!這是有道理的 – jingweimo

+0

嘿@jingweimo,如果我的答案是有道理的,你可以請接受它。 – blitu12345

2

至於問題的第二部分:

漏失層隨機訓練過程中禁用的神經元。它們仍然存在於您的模型中,因此不會從模型摘要中的參數數量中折扣。