如何计算张量流模型中可训练参数的总数?

Posted

技术标签:

【中文标题】如何计算张量流模型中可训练参数的总数?【英文标题】:How to count total number of trainable parameters in a tensorflow model? 【发布时间】:2016-11-04 18:46:42 【问题描述】:

是否有函数调用或其他方式来计算张量流模型中的参数总数?

参数我的意思是:可训练变量的 N 个暗淡向量有 N 个参数,NxM 矩阵有 N*M 参数等。所以基本上我想总结所有可训练变量的形状尺寸的乘积tensorflow 会话中的变量。

【问题讨论】:

您的问题描述和标题不匹配(除非我混淆了图形和模型的术语)。在您询问图表的问题和您询问模型的标题中。如果你有两个不同的模型怎么办?我建议在这个问题上澄清这一点。 如果您使用的是 Keras,则相关:***.com/questions/45046525/… 【参考方案1】:

现在,你可以使用这个了:

from keras.utils.layer_utils import count_params  

count_params(model.trainable_weights)

【讨论】:

【参考方案2】:
model.summary()

型号:“sequential_32”


层(类型)输出形状参数#

conv2d_88 (Conv2D) (无, 240, 240, 16) 448


max_pooling2d_87 (MaxPooling (None, 120, 120, 16) 0


conv2d_89 (Conv2D) (无, 120, 120, 32) 4640


max_pooling2d_88 (MaxPooling (None, 60, 60, 32) 0


conv2d_90 (Conv2D) (无, 60, 60, 64) 18496


max_pooling2d_89 (MaxPooling (None, 30, 30, 64) 0


flatten_29(展平)(无,57600)0


dropout_48(辍学)(无,57600)0


dense_150(密集)(无,24)1382424


dense_151(密集)(无,9)225


dense_152(密集)(无,3)30


dense_153(密集)(无,1)4

总参数:1,406,267 可训练参数:1,406,267 不可训练参数:0


【讨论】:

这是 Keras,不是 Tensorflow;问题显然是关于 TensorFlow 模型,而不是 Keras 模型。【参考方案3】:

2020 年 4 月更新:已弃用 tfprof 和 Profiler UI,取而代之的是 profiler support in TensorBoard。

如果您正在研究自己计算参数的数量,那么现有的两个答案很好。如果您的问题更多的是“有没有一种简单的方法来分析我的 TensorFlow 模型?”,我强烈建议您查看tfprof。它会分析您的模型,包括计算参数的数量。

【讨论】:

tfprof 链接已损坏。由于编辑队列已满,这里是working link。此外,tfprof 已被弃用。【参考方案4】:

循环遍历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)

更新:因为这个答案,我写了一篇文章来阐明 Tensorflow 中的动态/静态形状:https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/

【讨论】:

如果您有多个模型,tf.trainable_variables() 怎么知道要使用哪一个? tf.trainable_variables() 返回当前图中存在的所有标记为可训练的变量。如果在当前图中您有多个模型,则必须使用变量名称手动过滤变量。有人认为 if variable.name.strartswith("model2"): ... 这个解决方案给了我错误“发生异常:无法将'int'对象隐式转换为str”。您需要按照以下答案中的建议将“dim”明确转换为“int”(我建议这是正确答案) 真的很有帮助, 好像在TF2中,这个改成了tf.compat.v1.trainable_variables()!但是这会返回 0 个参数!【参考方案5】:

如果一个人更喜欢避免使用 numpy(许多项目可以忽略它),那么:

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

这是 Julius Kunze 上一个答案的 TF 翻译。

与任何 TF 操作一样,它需要运行会话来评估:

print(sess.run(all_trainable_vars))

【讨论】:

【参考方案6】:

我有一个更短的版本,使用 numpy 的单行解决方案:

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

【讨论】:

在我的版本中,v 没有 shape_as_list() 函数,只有 get_shape() 函数 我认为早期版本没有 .shape 而是 get_shape()。更新了我的答案。无论如何,我写的是 v.shape.as_list() 而不是 v.shape_as_list()。 np.sum([np.prod(v.shape) for v in tf.trainable_variables()]) 在 TensorFlow 1.2 中同样有效【参考方案7】:

我将介绍我的等效但更短的实现:

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

【讨论】:

【参考方案8】:

不确定给出的答案是否实际运行(我发现您需要将 dim 对象转换为 int 才能使其工作)。这是一个可行的方法,您可以复制粘贴函数并调用它们(也添加了一些 cmets):

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 

【讨论】:

答案确实有效 (r0.11.0)。你的更即插即用:) @f4。这似乎有一个错误,因为y 似乎没有被使用。 @CharlieParker 我几秒钟前修好了;) @f4。它仍然没有真正解决我试图做的问题(或原作者打算,因为他给了 y 作为输入),因为我正在寻找一个依赖于作为输入的模型的函数(即y) .现在给定的,我不知道它到底有什么意义。我怀疑它只计算所有模型(我有两个单独的模型)。 @CharlieParker 它计算所有可训练的变量,默认情况下是我相信的所有变量。您可以使用图形或名称等变量属性来解决问题。

以上是关于如何计算张量流模型中可训练参数的总数?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试我在真实图片上训练过的张量流模型?

如何计算张量流中RNN的困惑度

如何在张量流中对张量进行子集化?

张量流模型不更新权重

仅使用线性代数执行训练的张量流模型

从预训练模型中移除顶层,迁移学习,张量流(load_model)