2016-07-02 14 views
24

Czy istnieje wywołanie funkcji lub inny sposób zliczania całkowitej liczby parametrów na wykresie tensorflow?Jak liczyć całkowitą liczbę parametrów do trenowania w modelu tensorflow?

Przez parametry mam na myśli: N wektor dim zmiennych nadających się do pociągu ma N parametrów, macierz NxM ma parametry N*M itp. Tak więc zasadniczo chciałbym podsumować iloczyn wymiarów kształtu wszystkich zmiennych, które można wyuczyć w sesja tensorflow.

+0

Twój opis i tytuł pytanie nie pasują (chyba że mylę terminologię wykresu i modelu). W pytaniu o wykres i tytuł pytasz o model. Co jeśli masz dwa różne modele? Proponuję wyjaśnić to na pytanie. –

Odpowiedz

35

Pętla nad kształtem każdej zmiennej w 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) 
+2

jeśli masz więcej niż jeden model, w jaki sposób 'tf.trainable_variables()' wie, którego użyć? –

+2

tf.trainable_variables() zwraca wszystkie zmienne oznaczone jako nadające się do szkolenia, które są obecne na bieżącym wykresie. Jeśli na bieżącym wykresie masz więcej niż jeden model, musisz ręcznie filtrować zmienne, używając nazw imion. Coś jakby zmienna.name.strartswith ("model2"): ... – nessuno

+0

to rozwiązanie daje mi błąd "Wystąpił wyjątek: Nie można przekonwertować obiektu" int "na str niejawnie". Musisz rzucić 'dim' jawnie na 'int' jak sugeruje w odpowiedzi poniżej (co sugeruję być poprawną odpowiedzią) –

6

Nie jestem pewien, czy podana odpowiedź rzeczywiście działa (znalazłem, że musisz przekonwertować dim obiektu na int, aby działał). Tutaj jest to taki, który działa i można po prostu skopiować i wkleić funkcje nazywają je (dodał kilka uwag zbyt):

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 
+0

odpowiedź działa (r0.11.0). twoja jest bardziej plug n play :) –

+0

@ f4. wydaje się, że jest to błąd, ponieważ 'y' nie wydaje się być używane. –

+0

@CharlieParker Naprawiłem to kilka sekund temu;) –

4

Dwa istniejące odpowiedzi są dobre, jeśli szukasz do obliczania liczby parametrów yourself . Jeśli twoje pytanie było bardziej zbliżone do tego, "czy istnieje prosty sposób profilowania moich modeli TensorFlow?", Gorąco poleciłabym przejrzeć tfprof. Profiluje model, w tym obliczanie liczby parametrów.

1

dorzucę mojego równoważnego ale krótszy realizacji:

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

mam jeszcze krótsza wersja, jedno rozwiązanie linia użyciem za pomocą numpy:

np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()]) 
+0

w mojej wersji, v nie ma funkcji shape_as_list(), ale tylko funkcję get_shape(). – mustafa

+0

Myślę, że wcześniejsze wersje nie mają .shape, ale get_shape(). Zaktualizowałem moją odpowiedź. W każdym razie napisałem v.shape.as_list(), a nie v.shape_as_list(). –

+5

'np.sum ([np.prod (v.shape) dla v in tf.trainable_variables()])' działa również w TensorFlow 1.2 –