如何从保存的元图中恢复我的损失?
How to restore my loss from a saved meta graph?
我已经构建了一个运行良好的简单张量流模型。
在训练时,我保存 meta_graph 以及不同步骤的一些参数。
之后(在新脚本中)我想恢复保存的 meta_graph 并恢复变量和操作。
一切正常,但只有
with tf.name_scope('MSE'):
error = tf.losses.mean_squared_error(Y, yhat, scope="error")
不会恢复。使用以下行
mse_error = graph.get_tensor_by_name("MSE/error:0")
"The name 'MSE/error:0' refers to a Tensor which does not exist. The
operation, 'MSE/error', does not exist in the graph."
出现这个错误信息。
因为我对其他变量和 ops 执行完全相同的过程而没有任何错误地恢复,所以我不知道如何处理。唯一的区别是 tf.losses.mean_squared_error 函数中只有 scope 属性而没有 name 属性。
那么如何用示波器恢复损失操作呢?
这里是我如何保存和加载模型的代码。
节省:
# define network ...
saver = tf.train.Saver(max_to_keep=10)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(NUM_EPOCHS):
# do training ..., save model all 1000 optimization steps
if (i + 1) % 1000 == 0:
saver.save(sess, "L:/model/mlp_model", global_step=(i+1))
恢复:
# start a session
sess=tf.Session()
# load meta graph
saver = tf.train.import_meta_graph('L:\model\mlp_model-1000.meta')
# restore weights
saver.restore(sess, tf.train.latest_checkpoint('L:\model\'))
# access network nodes
graph = tf.get_default_graph()
X = graph.get_tensor_by_name("Input/X:0")
Y = graph.get_tensor_by_name("Input/Y:0")
# restore output-generating operation used for prediction
yhat_op = graph.get_tensor_by_name("OutputLayer/yhat:0")
mse_error = graph.get_tensor_by_name("MSE/error:0") # this one doesn't work
为了让您的训练退一步,documentation 建议您先将其添加到集合中,然后再将其保存为一种能够在恢复图形后指向它的方式。
节省:
saver = tf.train.Saver(max_to_keep=10)
# put op in collection
tf.add_to_collection('train_op', train_op)
...
恢复:
saver = tf.train.import_meta_graph('L:\model\mlp_model-1000.meta')
saver.restore(sess, tf.train.latest_checkpoint('L:\model\'))
# recover op through collection
train_op = tf.get_collection('train_op')[0]
为什么您尝试按名称恢复张量失败?
您确实可以通过名称获取张量——问题是您需要正确的名称。请注意,tf.losses.mean_squared_error
的 error
参数是一个 scope 名称,而不是返回操作的名称。这可能会造成混淆,因为其他操作(例如 tf.nn.l2_loss
)接受 name
参数。
最后,你的error
操作的名称是MSE/error/value:0
,你可以通过名称来获取它。
也就是说,直到将来更新tensorflow时它再次中断。 tf.losses.mean_squared_error
不保证其输出的名称,因此很可能由于某种原因而更改。
我认为这就是激发使用集合的原因:对您无法控制的运算符的名称缺乏保证。
或者,如果出于某种原因你真的想使用名称,你可以像这样重命名你的运算符:
with tf.name_scope('MSE'):
error = tf.losses.mean_squared_error(Y, yhat, scope='error')
# let me stick my own name on it
error = tf.identity(error, 'my_error')
那你就可以放心graph.get_tensor_by_name('MSE/my_error:0')
tf.losses.mean_squared_error 是一个不是张量的操作,你应该加载它
get_operation_by_name:
mse_error = graph.get_operation_by_name("MSE/error")
应该可以,请注意不需要“:0”
我已经构建了一个运行良好的简单张量流模型。 在训练时,我保存 meta_graph 以及不同步骤的一些参数。
之后(在新脚本中)我想恢复保存的 meta_graph 并恢复变量和操作。
一切正常,但只有
with tf.name_scope('MSE'):
error = tf.losses.mean_squared_error(Y, yhat, scope="error")
不会恢复。使用以下行
mse_error = graph.get_tensor_by_name("MSE/error:0")
"The name 'MSE/error:0' refers to a Tensor which does not exist. The operation, 'MSE/error', does not exist in the graph."
出现这个错误信息。
因为我对其他变量和 ops 执行完全相同的过程而没有任何错误地恢复,所以我不知道如何处理。唯一的区别是 tf.losses.mean_squared_error 函数中只有 scope 属性而没有 name 属性。
那么如何用示波器恢复损失操作呢?
这里是我如何保存和加载模型的代码。
节省:
# define network ...
saver = tf.train.Saver(max_to_keep=10)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(NUM_EPOCHS):
# do training ..., save model all 1000 optimization steps
if (i + 1) % 1000 == 0:
saver.save(sess, "L:/model/mlp_model", global_step=(i+1))
恢复:
# start a session
sess=tf.Session()
# load meta graph
saver = tf.train.import_meta_graph('L:\model\mlp_model-1000.meta')
# restore weights
saver.restore(sess, tf.train.latest_checkpoint('L:\model\'))
# access network nodes
graph = tf.get_default_graph()
X = graph.get_tensor_by_name("Input/X:0")
Y = graph.get_tensor_by_name("Input/Y:0")
# restore output-generating operation used for prediction
yhat_op = graph.get_tensor_by_name("OutputLayer/yhat:0")
mse_error = graph.get_tensor_by_name("MSE/error:0") # this one doesn't work
为了让您的训练退一步,documentation 建议您先将其添加到集合中,然后再将其保存为一种能够在恢复图形后指向它的方式。
节省:
saver = tf.train.Saver(max_to_keep=10)
# put op in collection
tf.add_to_collection('train_op', train_op)
...
恢复:
saver = tf.train.import_meta_graph('L:\model\mlp_model-1000.meta')
saver.restore(sess, tf.train.latest_checkpoint('L:\model\'))
# recover op through collection
train_op = tf.get_collection('train_op')[0]
为什么您尝试按名称恢复张量失败?
您确实可以通过名称获取张量——问题是您需要正确的名称。请注意,tf.losses.mean_squared_error
的 error
参数是一个 scope 名称,而不是返回操作的名称。这可能会造成混淆,因为其他操作(例如 tf.nn.l2_loss
)接受 name
参数。
最后,你的error
操作的名称是MSE/error/value:0
,你可以通过名称来获取它。
也就是说,直到将来更新tensorflow时它再次中断。 tf.losses.mean_squared_error
不保证其输出的名称,因此很可能由于某种原因而更改。
我认为这就是激发使用集合的原因:对您无法控制的运算符的名称缺乏保证。
或者,如果出于某种原因你真的想使用名称,你可以像这样重命名你的运算符:
with tf.name_scope('MSE'):
error = tf.losses.mean_squared_error(Y, yhat, scope='error')
# let me stick my own name on it
error = tf.identity(error, 'my_error')
那你就可以放心graph.get_tensor_by_name('MSE/my_error:0')
tf.losses.mean_squared_error 是一个不是张量的操作,你应该加载它 get_operation_by_name:
mse_error = graph.get_operation_by_name("MSE/error")
应该可以,请注意不需要“:0”