gpt4 book ai didi

python - 学习变量的预期 tensorflow 模型大小

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:35 25 4
gpt4 key购买 nike

在为图像分类任务训练卷积神经网络时,我们通常希望我们的算法学习将给定图像转换为正确标签的过滤器(和偏差)。我有几个模型,我试图在模型大小、操作次数、准确性等方面进行比较。但是,从 tensorflow 输出的模型的大小,具体是 model.ckpt.data存储图中所有变量值的文件不是我预期的文件。事实上,它似乎大了三倍。

为了直接解决问题,我将根据 this 提出问题木星笔记本。以下是定义变量(权重和偏差)的部分:

# Store layers weight & bias
weights = {
# 5x5 conv, 1 input, 32 outputs
'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32]),dtype=tf.float32),
# 5x5 conv, 32 inputs, 64 outputs
'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64]),dtype=tf.float32),
# fully connected, 7*7*64 inputs, 1024 outputs
'wd1': tf.Variable(tf.random_normal([7*7*64, 1024]),dtype=tf.float32),
# 1024 inputs, 10 outputs (class prediction)
'out': tf.Variable(tf.random_normal([1024, num_classes]),dtype=tf.float32)
}

biases = {
'bc1': tf.Variable(tf.random_normal([32]),dtype=tf.float32),
'bc2': tf.Variable(tf.random_normal([64]),dtype=tf.float32),
'bd1': tf.Variable(tf.random_normal([1024]),dtype=tf.float32),
'out': tf.Variable(tf.random_normal([num_classes]),dtype=tf.float32)
}

为了在训练过程结束时保存模型,我添加了几行:

# Save the model
save_path = saver.save(sess, logdir+"model.ckpt")
print("Model saved in file: %s" % save_path)

将所有这些变量加起来,我们希望得到一个大小为 12.45Mb 的 model.ckpt.data 文件(我通过计算我们的模型学习的浮点元素的数量获得了这个,然后将该值转换为兆字节)。但!保存的 .data 文件是 39.3Mb。这是为什么?

我对一个更复杂的网络(ResNet 的变体)采用了相同的方法,我预期的模型。数据大小也比实际 .data 文件小约 3 倍。

所有这些变量的数据类型都是float32。

最佳答案

Adding up all those variables we would expect to get a model.ckpt.data file of size 12.45Mb

传统上,大多数模型参数都在第一个全连接层中,在本例中为 wd1。仅计算其大小会产生:

7*7*128 * 1024 * 4 = 25690112

... 或 25.6Mb。注意 4 系数,因为变量 dtype=tf.float32,即每个参数 4 字节。其他层也对模型大小有影响,但影响不大。

如您所见,您的估计值 12.45Mb 有点偏差(您是否为每个参数使用了 16 位?)。检查点还存储了一些通用信息,因此开销大约为 25%,这仍然很大,但不是 300%。

[更新]

所讨论的模型实际上具有形状为 [7*7*64, 1024] 的 FC1 层,正如已澄清的那样。所以上面计算出的大小确实应该是12.5Mb。这让我更仔细地查看保存的检查点。

在检查之后,我注意到我原来错过的其他大变量:

...
Variable_2 (DT_FLOAT) [3136,1024]
Variable_2/Adam (DT_FLOAT) [3136,1024]
Variable_2/Adam_1 (DT_FLOAT) [3136,1024]
...

Variable_2 正好是 wd1,但 Adam 优化器还有 2 个副本。这些变量由 the Adam optimizer 创建,它们被称为 slots 并保存 mv 累加器所有可训练变量。现在总大小有意义了。

您可以运行以下代码来计算图形变量的总大小 - 37.47Mb:

var_sizes = [np.product(list(map(int, v.shape))) * v.dtype.size
for v in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)]
print(sum(var_sizes) / (1024 ** 2), 'MB')

所以开销实际上很小。额外的大小是由于优化器造成的。

关于python - 学习变量的预期 tensorflow 模型大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47314011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com