2016-04-29 26 views
14

Ho un semplice modello NN per la rilevazione le cifre scritte a mano da un'immagine 28x28px scritto in python utilizzando Keras (Theano backend):Keras model.summary() risultato - Capire il # dei parametri

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

Questo funziona bene e ottengo un'accuratezza del ~ 90%. Quindi eseguo il seguente comando per ottenere un riepilogo della struttura della mia rete eseguendo print(model0.summary()). Emette la seguente:

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 

Non capisco come si arriva a 7850 params totali e ciò che in realtà significa?

risposta

10

yIl numero di parametri è 7850 perché con ogni unità nascosta si hanno 784 pesi di input e un peso di connessione con bias. Ciò significa che ogni unità nascosta ti dà 785 parametri. Hai 10 unità in modo che riassume al 7850.

UPDATE:

Il ruolo di questo termine pregiudizio supplementare è veramente importante. Aumenta in modo significativo la capacità del tuo modello. Puoi leggere i dettagli ad es. qui:

Role of Bias in Neural Networks

+0

Grazie! Perché c'è un solo peso di connessione con pregiudizi? Qual è lo scopo di questo? – user3501476

6

nutro un 514 dimensionale di ingresso a valori reali a un modello Sequential in Keras. Il mio modello è costruito in modo seguente:

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

Quando stampo model.summary() ottengo seguente risultato:

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 
________________________________________________________________ 

Per lo strato dense_1, numero di params è 264710. Questo si ottiene come: 514 (valori di input) * 514 (neuroni nel primo strato) + 514 (valori di polarizzazione)

Per strato denso_2, il numero di parametri è 132355. Questo valore è ottenuto come: 514 (valori di input) * 257 (neuroni nel secondo strato) + 257 (valori di polarizzazione per i neuroni nel secondo strato)

0

Il "nessuno" nella forma significa che non ha un numero predefinito. Ad esempio, può essere la dimensione del batch che si utilizza durante l'allenamento e si desidera renderla flessibile non assegnandogli alcun valore in modo da poter modificare la dimensione del batch. Il modello dedurrà la forma dal contesto dei livelli.

Per ottenere nodi collegati a ogni livello, è possibile effettuare le seguenti operazioni:

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

Il modo più semplice per calcolare il numero di neuroni in uno strato è: valore Param/(numero di unità * 4)

  • Numero di unità è in predictivemodel.add (denso (514, ...)
  • valore Param Param è in funzione model.summary()

Ad esempio nella risposta Paul Lo, il numero di neuroni in un livello è 264710/(514 * 4) = 130