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

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

通过参数我的意思是: N 个可训练变量的向量有 N 个参数,一个 NxM矩阵有 N*M参数,等等。所以本质上,我想要求和张量流会话中所有可训练变量的形状尺寸的乘积。

58029 次浏览

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

不确定给出的答案是否确实运行(我发现需要将 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

更新于2020年4月: tfprof 和 Profiler UI 已被弃用,转而支持 TensorBoard 中的剖析器支持

如果您想自己计算参数的数量,那么这两个现有的答案是不错的。如果你的问题更像是“有没有一种简单的方法来描述我的 TensorFlow 模型?”,我强烈建议看看 Tfprof。它描述您的模型,包括计算参数的数量。

我将抛出我的类似但更短的实现:

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

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

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

如果一个人喜欢避免麻木(很多项目都可以省略它) ,那么:

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

这是昆泽先前答案的 TF 翻译。

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

print(sess.run(all_trainable_vars))
model.summary()

模型: “序列 _ 32”


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

(non,240,240,16)448


Max _ pooling2d _ 87(MaxPooling(None,120,120,16)0


(non,120,120,32)4640


Max _ pooling2d _ 88(MaxPooling(None,60,60,32)0


(non,60,60,64)18496


Max _ pooling2d _ 89(MaxPooling(Nothing,30,30,64)0


Flatten _ 29(Flatten)(None,57600)0


辍学 _ 48(辍学)(无,57600)0


稠密 _ 150(稠密)(无,24)1382424


稠密 _ 151(稠密)(无,9)225


稠密 _ 152(稠密)(无,3)30


稠密 _ 153(稠密)(无,1)4

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


现在,你可以用这个:

from keras.utils.layer_utils import count_params


count_params(model.trainable_weights)

我在 TF V2.9台工作,感谢 这个答案

import numpy as np


trainable_params = np.sum([np.prod(v.get_shape()) for v in model.trainable_weights])
non_trainable_params = np.sum([np.prod(v.get_shape()) for v in model.non_trainable_weights])
total_params = trainable_params + non_trainable_params
    

print(trainable_params)
print(non_trainable_params)
print(total_params)