Existe-t-il un appel de fonction ou un autre moyen de compter le nombre total de paramètres dans un modèle tensorflow?
Par paramètres, j'entends: un vecteur dim variable de variables pouvant être formées a N paramètres, une matrice NxM
a des paramètres N*M
, etc. J'aimerais donc résumer le produit des dimensions de la forme de toutes les variables pouvant être entraînées dans une session tensorflow.
Boucle sur la forme de chaque variable dans tf.trainable_variables()
.
total_parameters = 0
for variable in tf.trainable_variables():
# shape is an array of tf.Dimension
shape = variable.get_shape()
print(shape)
print(len(shape))
variable_parameters = 1
for dim in shape:
print(dim)
variable_parameters *= dim.value
print(variable_parameters)
total_parameters += variable_parameters
print(total_parameters)
Mise à jour: j'ai écrit un article pour clarifier les formes dynamiques/statiques dans Tensorflow en raison de cette réponse: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/
J'ai une version encore plus courte, une solution à une ligne utilisant numpy:
np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()])
Je ne suis pas sûr que la réponse donnée fonctionne réellement (j'ai trouvé qu'il fallait convertir l'objet dim en int pour qu'il fonctionne) En voici une qui fonctionne et vous pouvez simplement copier-coller les fonctions et les appeler (ajouté quelques commentaires aussi):
def count_number_trainable_params():
'''
Counts the number of trainable variables.
'''
tot_nb_params = 0
for trainable_variable in tf.trainable_variables():
shape = trainable_variable.get_shape() # e.g [D,F] or [W,H,C]
current_nb_params = get_nb_params_shape(shape)
tot_nb_params = tot_nb_params + current_nb_params
return tot_nb_params
def get_nb_params_shape(shape):
'''
Computes the total number of params for a given shap.
Works for any number of shapes etc [D,F] or [W,H,C] computes D*F and W*H*C.
'''
nb_params = 1
for dim in shape:
nb_params = nb_params*int(dim)
return nb_params
Les deux réponses existantes sont utiles si vous envisagez de calculer vous-même le nombre de paramètres. Si votre question ressemblait davantage à "Existe-t-il un moyen simple de profiler mes modèles TensorFlow?", Je vous conseillerais vivement de vous pencher sur tfprof . Il profil votre modèle, y compris le calcul du nombre de paramètres.
Je vais ajouter mon équivalent mais une implémentation plus courte:
def count_params():
"print number of trainable variables"
size = lambda v: reduce(lambda x, y: x*y, v.get_shape().as_list())
n = sum(size(v) for v in tf.trainable_variables())
print "Model size: %dK" % (n/1000,)
Si on préfère éviter numpy (on peut l'oublier pour beaucoup de projets),
all_trainable_vars = tf.reduce_sum([tf.reduce_prod(v.shape) for v in tf.trainable_variables()])
Ceci est une traduction TF de la réponse précédente de Julius Kunze.
Comme toute opération de TF, il faut une session en cours pour évaluer:
print(sess.run(all_trainable_vars))
Si votre modèle est un modèle Keras
, en particulier un tensorflow.python.keras.engine.training.Model
, vous pouvez utiliser model.count_params()
.
Les documents sont ici: https://www.tensorflow.org/api_docs/python/tf/keras/backend/count_params