Python 正确加载模型以恢复训练(元图、ckpts)
我在加载模型以恢复培训时遇到问题。 我在cifar数据集上使用一个简单的两层NN(完全连接)进行练习 NN设置: 保存的模型如下所示: 保存的模型文件 在此目录中:Python 正确加载模型以恢复训练(元图、ckpts),python,tensorflow,deep-learning,Python,Tensorflow,Deep Learning,我在加载模型以恢复培训时遇到问题。 我在cifar数据集上使用一个简单的两层NN(完全连接)进行练习 NN设置: 保存的模型如下所示: 保存的模型文件 在此目录中: C:\Users\Moondra\Desktop\CIFAR-PROJECT\parameters\u no\u changes 我有以下文件以及model.ckpt-499.index等: model.ckpt-999.meta model.ckpt-999.index model.ckpt-999.data-00000-of-0
C:\Users\Moondra\Desktop\CIFAR-PROJECT\parameters\u no\u changes
我有以下文件以及model.ckpt-499.index
等:
model.ckpt-999.meta
model.ckpt-999.index
model.ckpt-999.data-00000-of-00001
我加载模型的尝试
错误和混乱
1) 我是否应该使用此命令latest\u checkpoint
还原:
`
我看到一些教程只指向保存
.data、.index文件
2) 这就引出了第二个问题:我应该使用什么作为saver.restore
的第二个参数。
目前我只是指向保存这些文件的文件夹/dir
3) 我不是故意初始化任何变量,因为我被告知,这将覆盖存储的权重和偏差值。这似乎导致了以下错误:
FailedPremissionError(回溯见上文):尝试使用未初始化的值Layer1/权重
[[Node:Layer1/weights/read=Identity[T=DT_FLOAT,[u class=[“loc:@Layer1/weights”],[u device=“/job:localhost/replica:0/task:0/cpu:0”](Layer1/weights)]
4) 但是,如果我通过以下代码初始化所有变量:
sess.run(tf.global\u variables\u initializer())
我的模型似乎从零开始训练(而不是恢复训练)
这是否意味着我应该通过
显式获取张量
?如果是,我如何处理20层以上的层
5) 当我运行这个命令时
for i in tf.get_default_graph().get_operations():
print(i.values)
我看到很多全局步骤张量/运算
'global_step/initial_value' type=Const>>
'global_step' type=VariableV2>>
<'global_step/Assign' type=Assign>>
global_step/read' type=Identity>>
6) 最后,我看到了很多梯度操作,当我看所有
图中的节点,但我没有看到任何与列车步骤相关的节点
我创建的python变量指向Gradient Dsecent优化器)。这是否意味着我不需要通过get_tensor
将其加载到此图中
谢谢。我通常会执行以下操作:
初始化
恢复
这可转化为此类代码:
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess, tf.train.latest_checkpoint('./'))
...
它将避免未初始化的错误,恢复将用检查点的值覆盖。我通常执行以下操作序列:
初始化
恢复
这可转化为此类代码:
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess, tf.train.latest_checkpoint('./'))
...
它将避免未初始化的错误,并且还原将用检查点的值覆盖。1/在保存检查点的文件夹中,应该有一个名为“checkpoint”的文件,其中包含最新检查点的名称。
我通常阅读此文件以查找最新的检查点
2/我使用检查点目录/全局步骤。
这样,tf将在checkpoint_目录中创建4个文件:
全局步骤数据-00000-of-00001
全局步进索引
全局步骤元
检查点
3/4/我很确定在加载之前不需要预先初始化图形,至少我没有这样做。
有一些区别:不是导入元图,而是在每次加载时重新生成整个图,但我确信在初始化之前加载不是问题。
5/注意不要错误地进行张量运算,这样就很好了。张量名称应为op_name:0,这意味着此张量是操作op_name的输出[0]
6/7/好吧,让我告诉你我如何恢复我的检查点。这可能不是正确的方法,但它确实使我从按名称获取张量的负担中解脱出来。用名字来表示张量有时可能是一个真正的pita。
通常情况下,我的加载过程将经历:重建图形、加载检查点、根据需要创建一些新的张量、初始化不在检查点中的张量。
build_net()
saver=tf.train.saver()
saver.restore(会话、检查点目录/全局步骤)
添加\u损失\u和\u优化器()
初始化\u所有\u未初始化\u张量
如果需要最新的检查点,检查点目录/全局步骤来自检查点文件,或者您可以使用不同的全局步骤来获取要加载的特定检查点。1/在保存检查点的文件夹中,应该有一个名为“checkpoint”的文件,其中包含最新检查点的名称。
我通常阅读此文件以查找最新的检查点
2/我使用检查点目录/全局步骤。
这样,tf将在checkpoint_目录中创建4个文件:
全局步骤数据-00000-of-00001
全局步进索引
全局步骤元
检查点
3/4/我很确定在加载之前不需要预先初始化图形,至少我没有这样做。
有一些区别:不是导入元图,而是在每次加载时重新生成整个图,但我确信在初始化之前加载不是问题。
5/注意不要错误地进行张量运算,这样就很好了。张量名称应为op_name:0,这意味着此张量是操作op_name的输出[0]
6/7/好吧,让我告诉你我如何恢复我的检查点。这可能不是正确的方法,但它确实使我从按名称获取张量的负担中解脱出来。用名字来表示张量有时可能是一个真正的pita。
通常情况下,我的加载过程将经历:重建图形、加载检查点、根据需要创建一些新的张量、初始化不在检查点中的张量。
build_net()
saver=tf.train.saver()
saver.restore(会话、检查点目录/全局步骤)
添加\u损失\u和\u优化器()
初始化\u所有\u未初始化\u张量
如果您想要最新的检查点,则checkpoint_dir/global_步骤来自检查点文件,或者您可以使用不同的global_步骤来获取所需的特定检查点
for i in tf.get_default_graph().get_operations():
print(i.values)
'global_step/initial_value' type=Const>>
'global_step' type=VariableV2>>
<'global_step/Assign' type=Assign>>
global_step/read' type=Identity>>
<bound method Operation.values of <tf.Operation 'Loss/Const' type=Const>>
<bound method Operation.values of <tf.Operation 'Loss/Mean' type=Mean>>
<bound method Operation.values of <tf.Operation 'Loss/AddN' type=AddN>>
<bound method Operation.values of <tf.Operation 'Loss/add' type=Add>>
<bound method Operation.values of <tf.Operation 'Loss/loss/tags' type=Const>>
<bound method Operation.values of <tf.Operation 'Loss/loss' type=ScalarSummary>>
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess, tf.train.latest_checkpoint('./'))
...