it-swarm.com.de

Wie zählt man die Gesamtzahl der trainierbaren Parameter in einem Tensorflow-Modell?

Gibt es einen Funktionsaufruf oder eine andere Möglichkeit, die Gesamtzahl der Parameter in einem Tensorflow-Modell zu zählen?

Mit Parametern meine ich: Ein N-Dim-Vektor von trainierbaren Variablen hat N-Parameter, eine NxM-Matrix hat N*M-Parameter usw. Im Wesentlichen möchte ich das Produkt der Formabmessungen aller trainierbaren Variablen in einer Tensorflow-Sitzung summieren.

49
j314erre

Schleife über die Form jeder Variablen in 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)

Update: Ich habe einen Artikel geschrieben, um die dynamischen/statischen Formen in Tensorflow aufgrund dieser Antwort zu klären: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensor-tensors-shape-static-dynamic/

68
nessuno

Ich habe eine noch kürzere Version, eine Lösung mit numpy:

np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()])
32
Michael Gygli

Nicht sicher, ob die Antwort tatsächlich ausgeführt wird (ich habe festgestellt, dass Sie das dim-Objekt in ein int konvertieren müssen, damit es funktioniert). Hier ist eine Funktion, die funktioniert, und Sie können die Funktionen einfach kopieren, einfügen und aufrufen (einige Kommentare hinzugefügt):

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
Pinocchio

Die zwei vorhandenen Antworten sind gut, wenn Sie die Anzahl der Parameter selbst berechnen möchten. Wenn Ihre Frage eher nach dem Motto "Gibt es eine einfache Möglichkeit, meine TensorFlow-Modelle zu profilieren?" War, würde ich wärmstens empfehlen, in tfprof zu suchen. Es erstellt ein Profil Ihres Modells und berechnet die Anzahl der Parameter.

7
Gabriel Parent

Ich werde meine gleichwertige aber kürzere Implementierung einwerfen:

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

Wenn Sie es vorziehen, "numpy" zu vermeiden (es kann für viele Projekte ausgelassen werden), dann:

all_trainable_vars = tf.reduce_sum([tf.reduce_prod(v.shape) for v in tf.trainable_variables()])

Dies ist eine TF-Übersetzung der vorherigen Antwort von Julius Kunze.

Wie bei jeder TF-Operation ist ein Sitzungslauf erforderlich, um Folgendes auszuwerten:

print(sess.run(all_trainable_vars))
1
Ran Feldesh

Wenn es sich bei Ihrem Modell um ein Keras-Modell handelt, insbesondere um einen tensorflow.python.keras.engine.training.Model, können Sie model.count_params() verwenden.

Die Dokumente sind hier: https://www.tensorflow.org/api_docs/python/tf/keras/backend/count_params

0
bers