2016-07-02 5 views
24

関数呼び出し、またはテンソルフローグラフのパラメータの総数を数える別の方法はありますか?テンソルフローモデルのトレイン可能なパラメータの総数をカウントするにはどうすればよいですか?

私は、訓練可能な変数のN dimベクトルがNパラメータを持ち、NxM行列のパラメータがN*Mであることを意味します。したがって、本質的には、すべての訓練可能な変数の形状次元の積をテンソルフローセッション。

+0

をあなたの質問の説明とタイトルが一致しません(私がグラフとモデルの用語を混同しない限り)。質問では、あなたはモデルについて尋ねるグラフとタイトルについて質問します。 2つの異なるモデルがあればどうでしょうか?私はその質問を明確にすることをお勧めします。 –

答えて

35

tf.trainable_variables()のすべての変数の形状をループします。

+2

複数のモデルがある場合、 'tf.trainable_variables()'はどちらを使いますか? –

+2

tf.trainable_variables()は、現在のグラフに存在するtrainableとしてマークされたすべての変数を返します。現在のグラフに複数のモデルがある場合は、変数を手動でフィルタリングする必要があります。次のようなものがあります:variable.name.strartswith( "model2"):... – nessuno

+0

この解決策は私にエラー "例外が発生しました: 'int'オブジェクトをstrに暗黙的に変換できません。 以下の回答に示唆されているとおり、明示的に 'dim'を 'int'にキャストする必要があります(私は正解とすることをお勧めします) –

6

回答が実際に実行されているかどうかわかりません(私はあなたがdimオブジェクトをintに変換する必要があることがわかりました)。あなたはパラメータを独自の数を計算するに探しているなら

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

回答はうまくいきます(r0.11.0)。あなたはより多くのプラグアンドプレイです:) –

+0

@ f4。 'y'は使われていないようだから、バグがあるようです。 –

+0

@CharlieParker数秒前に修正しました;) –

4

2つの既存の答えが良好である:ここで動作するものがあるされ、あなただけの関数を貼り付け、それらを呼び出すコピーすることができます(あまりにもいくつかのコメントを追加しました) 。あなたの質問が「私のTensorFlowモデルを簡単にプロファイリングする方法はありますか?」の行に沿っていれば、tfprofを調べることを強くお勧めします。パラメータの数を計算するなど、モデルをプロファイルします。

1

私は私の同等より短い実装でスローされます:

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

を私も短いバージョン、numpyのを使用して使用して1つのラインのソリューションがあります。

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

私のバージョンでは、vはshape_as_list()関数を持っていませんが、get_shape()関数だけがあります。 – mustafa

+0

以前のバージョンでは.shapeではなくget_shape()があると思います。私の答えを更新しました。とにかく、v.shape.as_list()ではなくv.shape_as_list()を書きました。 –

+5

'np.sum(tf.trainable_variables()内のvのnp.prod(v.shape)))'もTensorFlow 1.2で動作します –

関連する問題