web-dev-qa-db-fra.com

Keras model.summary () result - Comprendre le nombre de paramètres

J'ai un modèle NN simple pour détecter les chiffres écrits à la main à partir d'une image de 28 x 28 pixels écrite en python à l'aide de Keras (backend Theano):

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

Cela fonctionne bien et j'obtiens une précision d'environ 90%. J'exécute ensuite la commande suivante pour obtenir un résumé de la structure de mon réseau en effectuant print(model0.summary()). Cela génère les éléments suivants:

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

Je ne comprends pas comment ils atteignent 7850 paramètres et ce que cela signifie réellement?

25
user3501476

Le nombre de paramètres est 7850 car avec chaque unité cachée, vous avez 784 poids d’entrée et un poids de connexion avec biais. Cela signifie que chaque unité cachée vous donne 785 paramètres. Vous avez 10 unités, donc ça fait 7850. 

METTRE À JOUR :

Le rôle de ce terme de biais supplémentaire est vraiment important. Cela augmente considérablement la capacité de votre modèle. Vous pouvez lire des détails, par exemple ici :

Rôle des biais dans les réseaux de neurones

22
Marcin Możejko

Je nourris une entrée de valeur réelle 514 dimensions à un modèle Sequential dans Keras . Mon modèle est construit de la manière suivante:

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

Lorsque j’imprime model.summary() j’obtiens le résultat suivant:

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
________________________________________________________________ 

Pour la couche dense_1, le nombre de paramètres est 264710 . Il est obtenu comme suit: 514 (valeurs d'entrée) * 514 (neurones dans la première couche) + 514 (valeurs de biais)

Pour la couche dense_2, le nombre de paramètres est de 132355 . Il est obtenu comme suit: 514 (valeurs d'entrée) * 257 (neurones de la deuxième couche) + 257 (valeurs de biais pour les neurones de la deuxième couche)

11
tauseef_CuriousGuy

Le "néant" dans la forme signifie qu'il n'a pas de numéro prédéfini. Par exemple, il peut s'agir de la taille du lot que vous utilisez lors de la formation et vous souhaitez le rendre flexible en ne lui attribuant aucune valeur, de sorte que vous puissiez modifier la taille de votre lot. Le modèle déduira la forme du contexte des calques.

Pour que les nœuds soient connectés à chaque couche, vous pouvez procéder comme suit:

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

La manière la plus simple de calculer le nombre de neurones dans une couche est la suivante: Param value/(nombre d'unités * 4)

  • Le nombre d’unités est en prédictivemodel.add (Dense (514, ...)
  • La valeur de Param est Param dans la fonction model.summary ()

Par exemple, dans la réponse de Paul Lo , le nombre de neurones dans une couche est 264710/(514 * 4) = 130 

0
user6596781