我有以下情况:
我有2个模型用2个独立的脚本编写:
A型是由变量a1
,a2
和a3
,并且被写入A.py
模型B由变量b1
,, b2
和组成 b3
,并用B.py编写
在每一个A.py
和B.py
我有一个tf.train.Saver
来保存所有的局部变量的检查点,并让我们把检查点文件ckptA
和ckptB
分别.
我现在想要做的是使用C型a1
和b1
.我可以a1
通过使用var_scope(和相同的b1
)在A和C中使用完全相同的变量名.
现在的问题是我怎么可能会加载a1
,并b1
从ckptA
和ckptB
成C型?例如,以下工作会怎样?
saver.restore(session, ckptA_location)
saver.restore(session, ckptB_location)
Run Code Online (Sandbox Code Playgroud)
如果您尝试两次恢复同一个会话,是否会引发错误?难道抱怨说,有没有分配"槽"的额外变量(b2
,b3
,a2
,a3
),或者将它简单地恢复它可以变量,且仅当在C是未初始化一些其他变量抱怨吗?
我正在尝试编写一些代码来测试这个,但我很想看到这个问题的规范方法,因为在尝试重新使用一些预先训练的权重时经常会遇到这种情况.
谢谢!
mrr*_*rry 19
tf.errors.NotFoundError
如果您尝试使用保护程序(默认情况下代表所有六个变量)从一个不包含保护程序所代表的所有变量的检查点进行恢复,您将得到一个.(但请注意Saver.restore()
,只要所有请求的变量都存在于相应的文件中,您就可以在同一会话中多次调用任何变量子集.)
规范方法是定义两个单独的tf.train.Saver
实例,涵盖完全包含在单个检查点中的每个变量子集.例如:
saver_a = tf.train.Saver([a1])
saver_b = tf.train.Saver([b1])
saver_a.restore(session, ckptA_location)
saver_b.restore(session, ckptB_location)
Run Code Online (Sandbox Code Playgroud)
根据代码的构建方式,如果有指向tf.Variable
被调用对象a1
和b1
本地范围的指针,则可以在此处停止读取.
在另一方面,如果变量a1
并b1
在不同的文件中定义,你可能需要做一些创造性检索指针的变量.尽管这不是理想的,人们通常做的是使用一个共同的前缀,举例如下(假设变量名称"a1:0"
和"b1:0"
分别对应).
saver_a = tf.train.Saver([v for v in tf.all_variables() if v.name == "a1:0"])
saver_b = tf.train.Saver([v for v in tf.all_variables() if v.name == "b1:0"])
Run Code Online (Sandbox Code Playgroud)
最后要注意的是:您不必为确保变量在A和C中具有相同的名称而做出英勇的努力.您可以将名称 - Variable
字典作为tf.train.Saver
构造函数的第一个参数传递,从而重新映射名称.检查点文件到Variable
代码中的对象.这有助于if A.py
和B.py
具有类似命名的变量,或者如果C.py
你想要从那些文件中组织模型代码tf.name_scope()
.
归档时间: |
|
查看次数: |
6522 次 |
最近记录: |