2016-04-29 69 views
14

我具有用於從使用Keras(Theano後端)寫在python 28x28px圖像檢測手寫數字的簡單神經網絡模型:Keras model.summary()結果 - 瞭解參數的#

model0 = Sequential() 

#number of epochs to train for 
nb_epoch = 12 
#amount of data each iteration in an epoch sees 
batch_size = 128 

model0.add(Flatten(input_shape=(1, img_rows, img_cols))) 
model0.add(Dense(nb_classes)) 
model0.add(Activation('softmax')) 
model0.compile(loss='categorical_crossentropy', 
     optimizer='sgd', 
     metrics=['accuracy']) 

model0.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, 
     verbose=1, validation_data=(X_test, Y_test)) 

score = model0.evaluate(X_test, Y_test, verbose=0) 

print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

這運行良好,準確度達到〜90%。然後我執行以下命令,通過執行print(model0.summary())來獲得我的網絡結構的摘要。這輸出以下內容:

Layer (type)   Output Shape Param #  Connected to      
===================================================================== 
flatten_1 (Flatten) (None, 784)  0   flatten_input_1[0][0]    
dense_1 (Dense)  (None, 10)  7850  flatten_1[0][0]     
activation_1  (None, 10)   0   dense_1[0][0]      
====================================================================== 
Total params: 7850 

我不明白他們是如何得到7850總參數,這實際上是什麼意思?

回答

10

y參數的數量是7850,因爲對於每個隱藏的單位,您都有784個輸入權重和一個帶偏差的權重。這意味着每個隱藏的單位都會爲您提供785個參數。你有10個單位,因此總計爲7850

UPDATE:

這種額外的偏項的作用是非常重要的。它顯着增加了模型的容量。您可以閱讀詳細信息在這裏:

Role of Bias in Neural Networks

+0

謝謝!爲什麼與偏見有一個重要的聯繫?它的目的是什麼? – user3501476

6

我養活514維實值輸入到Keras一個Sequential模型。

predictivemodel = Sequential() 
    predictivemodel.add(Dense(514, input_dim=514, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal')) 
    predictivemodel.add(Dense(257, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal')) 
    predictivemodel.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 

當我打印model.summary()我獲得以下結果:: 我的模型是在下列方式構建

Layer (type) Output Shape Param #  Connected to     
================================================================ 
dense_1 (Dense) (None, 514) 264710  dense_input_1[0][0]    
________________________________________________________________ 
activation_1 (None, 514) 0   dense_1[0][0]      
________________________________________________________________ 
dense_2 (Dense) (None, 257) 132355  activation_1[0][0]    
================================================================ 
Total params: 397065 
________________________________________________________________ 

對於dense_1層,則params的數量爲264710. 這爲獲得:514 (輸入值)* 514(第一層中的神經元)+ 514(偏差值)

對於dense_2層,參數的數量是132355. 這得到如下:514(輸入值)* 257 (第二層中的神經元)+ 257(第二層中的神經元的偏差值)

0

形狀中的「無」意味着它沒有預定義的數字。例如,它可以是您在培訓期間使用的批量大小,並且您希望通過不分配任何值來使其更靈活,以便您可以更改批量大小。該模型將從圖層的上下文中推斷出形狀。

爲了得到連接到每個層的節點,則可以執行以下操作:計算在一個層中的神經元的數目

for layer in model.layers: 
    print(layer.name, layer.inbound_nodes, layer.outbound_nodes) 
0

最簡單的方法是: 帕拉姆庫馬拉值/(單元數* 4)

  • 單位數是在predictivemodel.add(密集(514,...)
  • 帕拉姆值。PARAM IN model.summary()函數

例如在Paul Lo的答案中,一層神經元數爲264710 /(514 * 4)= 130