如何在ipython或anaconda内恢复TensorFlow中的检查点

如何在ipython或anaconda内恢复TensorFlow中的检查点,ipython,tensorflow,anaconda,checkpoint,Ipython,Tensorflow,Anaconda,Checkpoint,我使用tensorflow 0.9。 我想保存模型,然后将其还原。 我只需添加tf.train.Saver()来保存和恢复我的训练变量 这是我的代码: 将tensorflow导入为tf 导入输入数据 导入操作系统 检查点目录='。/ckpt目录/' mnist=输入数据。读取数据集(“mnist\u数据”,one\u hot=真) x=tf.placeholder(tf.float32,shape=[None,784]) y=tf.占位符(tf.float32,[None,10]) sess=t

我使用tensorflow 0.9。
我想保存模型,然后将其还原。
我只需添加
tf.train.Saver()
来保存和恢复我的训练变量

这是我的代码:

将tensorflow导入为tf
导入输入数据
导入操作系统
检查点目录='。/ckpt目录/'
mnist=输入数据。读取数据集(“mnist\u数据”,one\u hot=真)
x=tf.placeholder(tf.float32,shape=[None,784])
y=tf.占位符(tf.float32,[None,10])
sess=tf.InteractiveSession()
def load_模型(sess、saver、checkpoint_dir):
ckpt=tf.train.get\u checkpoint\u状态(checkpoint\u dir)
如果ckpt和ckpt.model\u检查点路径:
打印(ckpt.model\u检查点\u路径)
saver.restore(sess、ckpt.model\u检查点\u路径)
其他:
如果操作系统路径不存在(检查点目录):
os.makedirs(检查点目录)
sess.run(初始化)
返回
def重量_变量(形状):
初始值=tf.截断的_法线(形状,标准差=0.1)
返回tf.变量(初始值)
def偏差_变量(形状):
初始=tf.常数(0.1,形状=形状)
返回tf.变量(初始值)
def conv2d(x,W):
返回tf.nn.conv2d(x,W,步长=[1,1,1,1],padding=“SAME”)
def max_pool_2x2(x):
返回tf.nn.max_pool(x,ksize=[1,2,2,1],步长=[1,2,2,1],
padding=“相同”)
W_conv1=权重_变量([5,5,1,32])
b_conv1=偏差_变量([32])
x_image=tf.重塑(x,[-1,28,28,1])
#
h_conv1=tf.nn.relu(conv2d(x_图像,W_conv1))
h_池1=最大池2(h_池1)
#
W_conv2=权重_变量([5,5,32,64])
b_conv2=偏差_变量([64])
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2))
h_池2=最大池2×2(h_池2)
W_fc1=权重_变量([77641024])
b_fc1=偏差_变量([1024])
h_pool2_flat=tf.重塑(h_pool2,[-17764])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
#
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.drop(h_fc1,keep_prob)
#
W_fc2=重量_变量([1024,10])
b_fc2=偏差_变量([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
#
交叉熵=tf.reduce\u均值(-tf.reduce\u和(y*tf.log(y\u conv),reduce\u指数=[1]))
列车步长=tf.列车AdamOptimizer(1e-4).最小化(交叉熵)
正确的预测=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
准确度=tf.reduce_平均值(tf.cast(正确的预测,tf.float32))
初始化所有变量()
saver=tf.train.saver()
load_模型(sess、saver、checkpoint_dir)
对于范围(1)中的i:
批次=列表列下一批(50)
如果i%10==0:
train_accurity=accurity.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
打印(“步骤%d,训练精度%g”%(i,训练精度))
train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})
打印(“测试精度%g”%accurity.eval(进给指令={
x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
tf.标量_总结(“准确度”,准确度)
saver.save(sess,checkpoint_dir+'model.ckpt')

恢复检查点时:

saver.restore(sess、ckpt.model\u checkpoint\u路径)
TensorFlow抛出此错误:

Traceback (most recent call last):
.
.
.
NotFoundError: Tensor name "global_step_7" not found in checkpoint files ./ckpt_dir/model.ckpt-0
[[Node: save_18/restore_slice_438 = RestoreSlicedt=DT_INT32, preferred_shard=-1, _device="/job:localhost/replica:0/task:0/cpu:0"]]
Caused by op 'save_18/restore_slice_438', defined at:
File "/home/m/anaconda3/lib/python3.5/site-packages/spyderlib/widgets/externalshell/start_ipython_kernel.py", line 205, in
ipythonkernel.start()
.
.
.
File "/home/m/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1224, in __init
raise TypeError("Control input must be an Operation, "

编辑: 我用水蟒。第一次在spyder或ipython中使用“run filename.py”运行此代码时,它会将模型保存在检查点中,但当我再次运行此代码时,它会抛出错误

但是当我关闭spyder或ipython时,再次打开它并运行代码,它会正确地恢复检查点


另外,当我在终端“python filename.py”中运行时,它始终运行,并且不会引发任何错误。

再次运行该文件时,需要在调用开始时重置默认图形


如果不重置默认图形,并运行两次该行:

x=tf.Variable(1,name='x')
打印x.name
您将第一次看到
x
的名称是
“x:0”
,第二次看到它的名称是
“x\u 1:0”
。这就是使tf.train.Saver混淆的原因:

  • 它首先使用名称
    “x:0”
  • 然后在下一次运行中,您尝试加载保存的
    x
    ,但现在变量的名称是
    “x_1:0”
    ,因此保存程序尝试加载名为
    “x_1:0”
    的保存值,但找不到,并返回错误

但是,您可以在开始时使用
tf.reset\u default\u graph()
重置默认图形。这将创建一个空图形并将其用作默认图形。
在这两个图中,
x
的名称可以相同:

#第一次运行
tf.reset_default_graph()
x=tf.Variable(1,name='x')
打印x.name#打印“x:0”
#下一轮
tf.reset_default_graph()
x=tf.Variable(1,name='x')
打印x.name#打印“x:0”
这两个变量现在可以具有相同的名称,因为它们不再位于同一个图形中


另一种方法是在开始时创建一个图形,并将其用作默认图形:

graph=tf.graph()
使用graph.as_default():
x=tf.Variable(1,name='x')

名称
global\u step\u 7
听起来像是你创建了7次相同的张量。如果您重新启动ipython并仅创建一次图形,它是否有效?感谢用户的帮助。但是当我在代码中添加它们时,它会抛出以下错误:ValueError:Tensor(“重塑:0”,shape=(?,48,48,1),dtype=float32)必须与Tensor(“权重:0”,shape=(5,5,1,100),dtype=float32\u ref)来自同一个图形。您必须在代码的最开始处放置
tf.reset\u default\u graph()
,在创建任何张量之前,我在
main
函数中使用
tf.reset\u default\u graph()
,并调用
model
函数来创建模型。当cal
conv2d
时,会显示此错误。在调用
tf.reset\u default\u graph()
之前,您必须已经创建了shape
[5,5,1100]
的过滤器。如果没有完整的代码,我看不到哪里。我在
model()
函数中有类似的内容:
weights={'W_conv1':weight_变量([5,5,IMAGE_CHANNELS,100]),