Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

模型参数文件为何这么大? #56

Closed
swim2sun opened this issue Jan 8, 2018 · 6 comments
Closed

模型参数文件为何这么大? #56

swim2sun opened this issue Jan 8, 2018 · 6 comments

Comments

@swim2sun
Copy link

swim2sun commented Jan 8, 2018

如果你想从头自己训练: 下载好数据到任意目录下,然后修改cnn_coarse_to_fine/data_provider目录下所有文件的self.data_dir路径。
如果你只想跑一下我们的模型: 下载好train log文件(包括train_logs_coarse and train_log_fine)并解压到resource目录。

然后我看了一下train log竟然有1.22G, 而训练数据data.tar是239M. 虽然我对机器学习还没入门, 但按目前所了解的, 模型比训练数据大那么多总是不正常的. 模型其实就是几个权重矩阵, 再大应该也大不到这种程度. 真大到这种程度, 就那点训练数据也拟合不了吧

@pkuanjie
Copy link
Collaborator

pkuanjie commented Jan 9, 2018

第一个问题,你要区分train_logs和参数有什么不同,没错,我写的模型参数量应该是MB量级的,如果单纯存参数的话其实只有MB大小,但是,为了方便导入导出的操作,各个深度学习框架都提供了直接保存计算图的接口(当然也有保存参数的接口),这里我使用的是tensorflow保存计算图的接口,计算图中包括了模型训练到当前状态的很多参数以外的状态信息,所以,比较大是很正常的。第二个问题,有关于过拟合,模型是否过拟合与train_logs大小和存储的数据多少没有任何关系,甚至可以说与参数量也不是完全线性的关系,目前我们的模型还没有观察到明显的过拟合现象

@Prinsphield
Copy link
Owner

Prinsphield commented Jan 9, 2018

我们重新精简了一下云盘的文件。因为有两个cnn model,fine model有440M,coarse model有380M,这个是正常的大小,你可以看一下model.pymodel_fine.py里的架构,或者用TensorFlow下提供的工具看看模型的参数。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/inspect_checkpoint.py

带你检查一下fine model的参数储存大小。

python /path/to/tensorflow/python/tools/inspect_checkpoint.py --file_name resource/train_logs_fine/best_model.ckpt-53999 --all_tensor_names >> params.txt

这样你得到了一个params.txt文件,记录了所有的参数。然后我们大致估计一下参数需要的储存空间,在当前目录新建一个estimate.py文件

import ast
from six.moves import reduce

def main(filename):
    f = open(filename, 'r')
    storage = 0
    for i, line in enumerate(f):
        if len(line) <= 1: continue
        l = ast.literal_eval(line.split()[-1])
        if len(l) == 0:
            storage += 1 * 4
        else:
            storage += reduce(lambda x,y: x*y, l) * 4
    print(storage)

if __name__ == "__main__":
    filename = 'params.txt'
    main(filename)

然后运行python estimate.py,输出463876640,刚好是fine模型的参数储存大小。

这个是data文件的大小。我们提供的下载文件里面还有个meta文件,你要是觉得占硬盘了,可以删掉meta文件,还是可以正常运行的。

@swim2sun
Copy link
Author

swim2sun commented Jan 9, 2018

@RICHARD-AN @Prinsphield 感谢解答, 谢谢你们的工作☺️

@swim2sun swim2sun closed this as completed Jan 9, 2018
@zkailinzhang
Copy link

厉害 学习了

@zkailinzhang
Copy link

运行python estimate.py出错,params.txt 生成ok的
_20180202144131
_20180202144118

@zkailinzhang
Copy link

zkailinzhang commented Feb 2, 2018

@Prinsphield大神

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants