Comment compter le nombre total de paramètres entraînables dans un modèle tensorflow?

Existe-t-il un appel de fonction ou un autre moyen de compter le nombre total de paramètres dans un graphique tensorflow?

Par Paramètres, je veux dire: un vecteur n dim de variables entraînables A N Paramètres, une matrice NxM a des paramètres N*M, etc. Donc, essentiellement, je voudrais résumer le produit des dimensions de forme de toutes les variables entraînables dans une session tensorflow.

44
demandé sur j314erre 2016-07-02 16:55:11

6 réponses

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)
59
répondu nessuno 2017-08-24 06:00:35

J'ai une version encore plus courte, une solution de ligne en utilisant numpy:

np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()])
27
répondu Michael Gygli 2017-05-06 11:34:16

Je ne sais pas si la réponse donnée fonctionne réellement (j'ai trouvé que vous devez convertir l'objet dim en int pour que cela fonctionne). Voici celui 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 
8
répondu Pinocchio 2016-11-21 23:34:29

Les deux réponses existantes sont bonnes si vous cherchez à calculer le nombre de paramètres vous-même. Si votre question allait plus dans le sens de "existe-t-il un moyen facile de profiler mes modèles TensorFlow?", Je recommande fortement de regarder dans tfprof. Il profile votre modèle, y compris le calcul du nombre de paramètres.

6
répondu Gabriel Parent 2016-12-21 06:45:03

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,)
2
répondu Gregor Mitscha-Baude 2016-12-29 15:00:15

Si on préfère éviter numpy (il peut être laissé pour de nombreux projets), alors:

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 TF, elle nécessite une session pour évaluer:

print(sess.run(all_trainable_vars))
0
répondu Ran Feldesh 2018-08-07 02:44:45