Neural network 如何计算tensorflow模型中可训练参数的总数?

Neural network 如何计算tensorflow模型中可训练参数的总数?,neural-network,tensorflow,Neural Network,Tensorflow,是否有函数调用或其他方法来计算tensorflow模型中的参数总数 通过参数,我的意思是:可训练变量的N维向量有N个参数,NxM矩阵有N*M参数,等等。所以本质上,我想求一个tensorflow会话中所有可训练变量的形状维度的乘积之和。循环tf.trainable\u variables()中每个变量的形状 更新:我写了一篇文章来澄清Tensorflow中的动态/静态形状,因为这个答案:不确定给定的答案是否实际运行(我发现需要将dim对象转换为int才能工作)。下面是一个可行的方法,您可以复制粘

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


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

循环
tf.trainable\u variables()中每个变量的形状


更新:我写了一篇文章来澄清Tensorflow中的动态/静态形状,因为这个答案:

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


2020年4月更新:tfprof和探查器UI已被弃用,取而代之的是


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

我将加入我的等效但较短的实现:

def count_params():
“打印可训练变量的数量”
大小=λv:reduce(λx,y:x*y,v.get_shape().as_list())
n=总和(可训练变量()中v的大小(v))
打印“型号尺寸:%dK”%(n/1000)

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

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

如果一个人倾向于避免numpy(许多项目可能会忽略它),那么:

这是Julius Kunze先前回答的TF翻译

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

print(sess.run(all_trainable_vars))
型号:“顺序_32”


图层(类型)输出形状参数# conv2d_88(conv2d)(无、240、240、16)448


最大池2D池87(最大池(无、120、120、16)0


conv2d_89(conv2d)(无、120、120、32)4640


最大池2D_88(最大池(无、60、60、32)0


conv2d_90(conv2d)(无、60、60、64)18496


最大池2D_89(最大池(无、30、30、64)0


展平29(展平)(无,57600)0


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


致密150(致密)(无,24)1382424


密集型_151(密集型)(无,9)225


密集型_152(密集型)(无,3)30


密集型_153(密集型)(无,1)4 总参数:1406267 可培训参数:1406267 不可训练参数:0



如果您有多个模型,
tf.trainable_variables()
如何知道使用哪一个?tf.trainable_variables()返回当前图形中存在的所有标记为可训练的变量。如果当前图形中有多个模型,则必须使用年份名称手动筛选变量。例如If variable.name.strartswith(“model2”):…此解决方案给出了错误“发生异常:无法将'int'对象隐式转换为str”。您需要将'dim'显式转换为'int',正如下面答案中建议的那样(我认为这是正确的答案),非常有用,在TF2中,这似乎已更改为tf.compat.v1.trainable_variables()!但随后返回0个参数!答案确实有效(r0.11.0)。你的是更多的即插即用:)@f4。这似乎有一个bug,因为
y
似乎没有被使用。@CharlieParker我几秒钟前就修复了它;)@f4。它仍然不能真正解决我试图解决的问题(或者原作者打算用y作为输入)因为我在寻找一个依赖于作为输入的模型(即
y
)的函数。现在,我不知道它到底算什么。我怀疑它只算所有模型(我有两个单独的模型)@CharlieParker它计算所有可训练的变量,默认情况下,我相信所有变量都是可训练的。你可以使用变量属性,如图形或名称来计算。你的问题描述和标题不匹配(除非我混淆了图形和模型的术语)。在这个问题中,你问的是一个图形和一个模型的标题。如果你有两个不同的模型呢?我建议在这个问题上澄清这一点。如果你使用Keras相关:在我的版本中,v没有shape_as_list()函数,只有get_shape()函数,我认为早期版本没有。shape但是get_shape()。更新了我的答案。无论如何,我写了v.shape.as_list(),而不是v.shape_as_list()。
np.sum([np.prod(v.shape)表示tf.trainable_variables()中的v)
在TensorFlow 1.2中也能正常工作
tfprof
链接已断开。由于编辑队列已满,这里是。同样,对于
tfprof
,已弃用。这是Keras,而不是TensorFlow;问题显然是关于TensorFlow模型,而不是Keras模型。
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()])
print(sess.run(all_trainable_vars))
model.summary()