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.
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/
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()])
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
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.
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))
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