Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow模型文件大小差异很大_Tensorflow - Fatal编程技术网

Tensorflow模型文件大小差异很大

Tensorflow模型文件大小差异很大,tensorflow,Tensorflow,我使用的是tensorflow框架,我注意到tensorflow模型文件的大小存在重大差异 例如,该框架提供了两种模型: 其中一个预训练模型将用于微调,例如 还有一个包含未经训练的版本 它们的大小都是172.539kb 当我在我的模型中应用微调,并在图形中进行一些小的更改(框架中有一个模块)并保存我的模型时,大小基本保持不变:178.525kb 首先,我有点惊讶,我的微调模型有点大,因为我只是将最后一层从21类更改为14类,所以我希望模型文件的大小稍微小一些,但由于差异太小,我没有注意到 但

我使用的是tensorflow框架,我注意到tensorflow模型文件的大小存在重大差异

例如,该框架提供了两种模型:

  • 其中一个预训练模型将用于微调,例如
  • 还有一个包含未经训练的版本
它们的大小都是
172.539kb

当我在我的模型中应用微调,并在图形中进行一些小的更改(框架中有一个模块)并保存我的模型时,大小基本保持不变:
178.525kb

首先,我有点惊讶,我的微调模型有点大,因为我只是将最后一层从21类更改为14类,所以我希望模型文件的大小稍微小一些,但由于差异太小,我没有注意到

但是,当我使用相同的模型文件(我指的是预训练的文件)训练相同的模型并将模型保存在磁盘中时,文件大小就大不相同了:
340.097kb
。我所说的“训练”是指我允许网络修改所有参数,而不仅仅是最后一层的参数

正在实现的模型是用于语义图像分割的resnet的变体(如果有人可以从模型本身中扣除预期的模型文件大小)

所以,我的问题是,为什么我的模型文件大小有如此大的差异,为什么我保存的微调模型比原始模型大?是否有方法在要保存的模型中包含/排除参数

p.S.1一些可能有用的信息:

  • 我使用的是tensorflow v2模型保存,而我认为框架文件使用的是v1。除了前者生成3个文件之外,我不知道如何识别它
  • 该框架称为tensorflow deeplab resnet,可以找到该框架,并且可以创建模型
  • p.S.2
    我不确定stack overflow是否适合这个问题。

    这是因为,在训练模型并保存它们时,Tensorflow也会保存操作的渐变


    因此,允许在最后一层上进行训练将稍微增加保存模型的大小。允许对整个模型进行训练实际上会使保存文件的大小增加一倍,因为每个op都会保存其梯度。

    但这也不会影响提供的预训练模型?此保存的模型不包括渐变?如果他们提供了预先训练的模型,他们可能会从保存文件中删除渐变,因为您不需要它们进行测试。只有在以后继续训练模型才有用。@Eypros检查是否保存了渐变的一个简单方法是使用文本编辑器打开Tensorflow saver创建的
    .index
    文件(
    gedit
    )然后搜索
    梯度
    。我的
    索引
    文件似乎是二进制文件,而不是文本文件。它是,但其中仍然有一些可读的文本,用于变量的名称。您是否可能继续向图形中添加内容,而不是替换它?在微调过程中,可能您正在添加新权重,但仍将旧权重存储在保存的文件中?在恢复之后,也许你正在重新创建所有东西,这就是你接近两倍大小的东西?你可以检查和。我的模型中肯定有冗余操作。有没有关于如何使用这些函数的例子?我意识到这些函数在对象上工作,这对于将模型保存为protobuf很有用,但对于保存检查点却没有直接作用。也许你可以使用这个模块,尽管我对它不太了解(也许与输出一起使用?)。