2016-04-29 9 views
14

Mam prosty model NN wykrywania ręcznie pisane cyfry z 28x28px obrazu napisany w Pythonie z użyciem Keras Theano (backend):Keras model.summary() Wynik - Zrozumienie liczbie parametrów

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]) 

ten działa dobrze i uzyskuję dokładność ~ 90%. Następnie wykonuję następujące polecenie, aby uzyskać podsumowanie struktury mojej sieci, wykonując print(model0.summary()). To wyprowadza następujące:

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 

Nie rozumiem, w jaki sposób uzyskują one łącznie 7850 params i co to właściwie oznacza?

Odpowiedz

10

y Liczba parametrów wynosi 7850, ponieważ przy każdej ukrytej jednostce macie 784 wagi wejściowe i jeden ciężar połączenia z odchyleniem. Oznacza to, że każda ukryta jednostka daje 785 parametrów. Masz 10 jednostek tak podsumowuje do 7850.

UPDATE:

Rola tego dodatkowego terminu bias jest naprawdę ważne. Znacznie zwiększa to pojemność Twojego modelu. Możesz przeczytać szczegóły, np. tutaj:

Role of Bias in Neural Networks

+0

Dziękujemy! Dlaczego jest jedna waga połączenia z uprzedzeniem? Jaki jest tego cel? – user3501476

6

Karmię się 514 wymiarową rzeczywistą wycenione wejście do Sequential modelu w Keras. Mój model jest skonstruowany w następujący sposób:

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']) 

Kiedy drukować model.summary() dostaję następujący wynik:

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 
________________________________________________________________ 

Dla warstwy dense_1, ilość params jest 264710. ten otrzymuje się jako: 514 (wartości wejściowe) * 514 (neurony w pierwszej warstwie) + 514 (wartości odchylenia)

Dla warstwy gęstej_2 liczba par wynosi 132355. Uzyskano jako: 514 (wartości wejściowe) * 257 (neurony w drugiej warstwie) + 257 (wartości przesunięcia dla neuronów w drugiej warstwie)

0

"Brak" w kształcie oznacza, że ​​nie ma on zdefiniowanej liczby. Na przykład może to być wielkość partii, której używasz podczas treningu, i chcesz uczynić ją elastyczną, nie przypisując jej żadnej wartości, abyś mógł zmienić rozmiar partii. Model wywnioskuje kształt z kontekstu warstw.

Aby uzyskać węzły połączone ze sobą warstwy, można wykonać następujące czynności:

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

Najprostszym sposobem, aby obliczyć liczbę neuronów w jednej warstwie wynosi: wartość Param/(liczba jednostek * 4)

  • Liczba jednostek jest w predictivemodel.add (Gęsty (514, ...)
  • wartość Param Param jest w model.summary function()

Na przykład w odpowiedzi Paul Lo liczba neuronów w jednej warstwie wynosi 264710/(514 * 4) = 130