有没有一种函数调用或其他方式来计算 TensorFlow 模型中参数的总数?
在这里,参数指的是:可训练变量的 N 维向量具有 N 个参数,一个 NxM
矩阵具有 N*M
个参数,依此类推。因此,我想对 TensorFlow 会话中所有可训练变量的形状尺寸的积求和。
有没有一种函数调用或其他方式来计算 TensorFlow 模型中参数的总数?
在这里,参数指的是:可训练变量的 N 维向量具有 N 个参数,一个 NxM
矩阵具有 N*M
个参数,依此类推。因此,我想对 TensorFlow 会话中所有可训练变量的形状尺寸的积求和。
循环遍历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()
如何知道要使用哪一个? - Charlie Parker.trainable_variables
- 不再有全局图! - nessuno我有一个更短的版本,使用numpy实现一行代码解决:
np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()])
np.sum([np.prod(v.shape) for v in tf.trainable_variables()])
同样有效。 说明:该代码用于计算TensorFlow模型中可训练参数的数量。 - Julius Kunzenp.sum([np.prod(v.shape) for v in model.trainable_variables])
这行代码在我这儿能运行,末尾不需要加上函数调用 "()". - Manute不确定给出的答案是否实际运行(我发现您需要将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
y
似乎没有被使用。 - Charlie Parker2020年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,)
all_trainable_vars = tf.reduce_sum([tf.reduce_prod(v.shape) for v in tf.trainable_variables()])
print(sess.run(all_trainable_vars))
在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)
from keras.utils.layer_utils import count_params
count_params(model.trainable_weights)
model.summary()
Model: "sequential_32"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_88 (Conv2D) (None, 240, 240, 16) 448
_________________________________________________________________
max_pooling2d_87 (MaxPooling (None, 120, 120, 16) 0
_________________________________________________________________
conv2d_89 (Conv2D) (None, 120, 120, 32) 4640
_________________________________________________________________
max_pooling2d_88 (MaxPooling (None, 60, 60, 32) 0
_________________________________________________________________
conv2d_90 (Conv2D) (None, 60, 60, 64) 18496
_________________________________________________________________
max_pooling2d_89 (MaxPooling (None, 30, 30, 64) 0
_________________________________________________________________
flatten_29 (Flatten) (None, 57600) 0
_________________________________________________________________
dropout_48 (Dropout) (None, 57600) 0
_________________________________________________________________
dense_150 (Dense) (None, 24) 1382424
_________________________________________________________________
dense_151 (Dense) (None, 9) 225
_________________________________________________________________
dense_152 (Dense) (None, 3) 30
_________________________________________________________________
dense_153 (Dense) (None, 1) 4
=================================================================
Total params: 1,406,267
Trainable params: 1,406,267
Non-trainable params: 0
_________________________________________________________________