Tensorflow的tf.train.Saver保存的.ckpt文件大小异常大?

6
我正在使用一个相当规模的神经网络(1个卷积层,2个全连接层)。每次使用tf.train.Saver保存变量时,.ckpt文件占用了半个千字节的磁盘空间(确切地说是512 MB)。这正常吗?我有一个与之相同架构的Caffe网络,只需要7MB的.caffemodel文件。TensorFlow为什么要保存如此大的文件大小,有什么特殊原因吗?
非常感谢。

你能分享一下你的模型架构的更多细节吗?最好是以一组tf.Variable声明的形式。 - mrry
3个回答

6
难以确定您的网络规模,根据您所描述的信息——两个全连接层之间的连接数量随着每层的大小呈二次比例增长,因此根据您的全连接层大小不同,您的网络可能非常庞大。
如果您希望在检查点文件中节省空间,可以将以下代码行:
saver = tf.train.Saver()
替换为以下内容:
saver = tf.train.Saver(tf.trainable_variables())
默认情况下,tf.train.Saver()会保存图中的所有变量,包括由优化器创建的变量以累积渐变信息。告诉它仅保存可训练的变量意味着仅保存网络的权重和偏差,并且舍弃了累积的优化器状态。您的检查点文件可能会更小,代价是在恢复训练后的前几个批次中经历较慢的训练速度,当优化器重新累积渐变信息时。根据我的经验,这并不需要很长时间,因此我认为为了获得更小的检查点而进行的这种权衡是值得的。

嗨,我想知道,如果网络包含BN层,我该怎么办?因为均值和方差是变量,但它们不可训练。如果我只保存tf.tf.trainable_variables(),当我恢复模型时,tensorflow找不到BN均值参数...... - Ariel

1

但缺点是您必须手动创建变量,然后才能恢复它们。否则,它会报告错误,因为找不到适当的变量。 - ArtificiallyIntelligence
你的意思是tensorflow1.0保存模型较小吗?因为我使用的是tensorflow 1.3,所以保存的模型大小可能比tensorflow1.0大...... - Ariel

0
通常只需要保存tf.global_variables()(这是tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)的缩写,即全局变量集合)。该集合旨在包括恢复模型状态所必需的变量,例如批归一化的当前移动平均值、全局步数、优化器的状态以及tf.GraphKeys.TRAINABLE_VARIABLES集合,当然也包括可训练的变量集合。更临时性质的变量,例如梯度,会被收集到LOCAL_VARIABLES中,通常无需存储它们,因为它们可能会占用大量磁盘空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接