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?
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 :
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)
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)
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)
Par exemple, dans la réponse de Paul Lo , le nombre de neurones dans une couche est 264710/(514 * 4) = 130