Jupyter 上的 TensorFlow:无法恢复变量

Posted

技术标签:

【中文标题】Jupyter 上的 TensorFlow:无法恢复变量【英文标题】:TensorFlow on Jupyter: Can't restore variables 【发布时间】:2016-04-16 02:38:26 【问题描述】:

在 Jupyter 笔记本中使用 TensorFlow 时,我似乎无法恢复已保存的变量。我训练了一个 ANN,然后我运行 saver.save(sess, "params1.ckpt") 然后我再次训练它,保存新结果 saver.save(sess, "params2.ckpt") 但是当我运行 saver.restore(sess, "params1.ckpt") 时,我的模型不会加载保存在 params1.ckpt 上的值并将这些值保留在 @987654327 @。

如果我运行模型,将其保存在params.ckpt,然后关闭并暂停,然后尝试再次加载它,我收到以下错误:

---------------------------------------------------------------------------
StatusNotOK                               Traceback (most recent call last)
StatusNotOK: Not found: Tensor name "Variable/Adam" not found in checkpoint files params.ckpt
     [[Node: save/restore_slice_1 = RestoreSlice[dt=DT_FLOAT, preferred_shard=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_save/Const_0, save/restore_slice_1/tensor_name, save/restore_slice_1/shape_and_slice)]]

During handling of the above exception, another exception occurred:

SystemError                               Traceback (most recent call last)
<ipython-input-6-39ae6b7641bd> in <module>()
----> 1 saver.restore(sess, "params.ckpt")

/usr/local/lib/python3.5/site-packages/tensorflow/python/training/saver.py in restore(self, sess, save_path)
    889       save_path: Path where parameters were previously saved.
    890     """
--> 891     sess.run([self._restore_op_name], self._filename_tensor_name: save_path)
    892 
    893 

/usr/local/lib/python3.5/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict)
    366 
    367     # Run request and get response.
--> 368     results = self._do_run(target_list, unique_fetch_targets, feed_dict_string)
    369 
    370     # User may have fetched the same tensor multiple times, but we

/usr/local/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_run(self, target_list, fetch_list, feed_dict)
    426 
    427       return tf_session.TF_Run(self._session, feed_dict, fetch_list,
--> 428                                target_list)
    429 
    430     except tf_session.StatusNotOK as e:

SystemError: <built-in function delete_Status> returned a result with an error set

我的训练代码是:

def weight_variable(shape, name):
  initial = tf.truncated_normal(shape, stddev=1.0, name=name)
  return tf.Variable(initial)

def bias_variable(shape, name):
  initial = tf.constant(1.0, shape=shape)
  return tf.Variable(initial, name=name)

input_file = pd.read_csv('P2R0PC0.csv') 
features = #vector with 5 feature names
targets = #vector with 4 feature names
x_data = input_file.as_matrix(features)
t_data = input_file.as_matrix(targets)

x = tf.placeholder(tf.float32, [None, x_data.shape[1]])

hiddenDim = 5

b1 = bias_variable([hiddenDim], name = "b1")
W1 = weight_variable([x_data.shape[1], hiddenDim], name = "W1")

b2 = bias_variable([t_data.shape[1]], name = "b2")
W2 = weight_variable([hiddenDim, t_data.shape[1]], name = "W2")

hidden = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
y = tf.nn.sigmoid(tf.matmul(hidden, W2) + b2)
t = tf.placeholder(tf.float32, [None, t_data.shape[1]])

lambda1 = 1
beta1 = 1
lambda2 = 1
beta2 = 1
error = -tf.reduce_sum(t * tf.log(tf.clip_by_value(y,1e-10,1.0)) + (1 - t) * tf.log(tf.clip_by_value(1 - y,1e-10,1.0)))
complexity = lambda1 * tf.nn.l2_loss(W1) + beta1 * tf.nn.l2_loss(b1) + lambda2 * tf.nn.l2_loss(W2) + beta2 * tf.nn.l2_loss(b2)
loss = error + complexity

train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
sess = tf.Session()

init = tf.initialize_all_variables()
sess.run(init)

ran = 25001
delta = 250

plot_data = np.zeros(int(ran / delta + 1))
k = 0;
for i in range(ran):
    train_step.run(x: data, t: labels, sess)
    if i % delta == 0:
        plot_data[k] = loss.eval(x: data, t: labels, sess)
        #plot_training[k] = loss.eval(x: x_test, t: t_test, sess)
        print(str(plot_data[k]))
        k = k + 1

plt.plot(np.arange(start=2, stop=int(ran / delta + 1)), plot_data[2:])

saver = tf.train.Saver()
saver.save(sess, "params.ckpt")

error.eval(x:data, t: labels, session=sess)

我做错了吗?为什么我无法恢复我的变量?

【问题讨论】:

你是否在同一个进程中构建同一个图的多个副本?如果是这样,可能是不同检查点中的张量名称不同,导致尝试恢复时不匹配。 我遇到了完全相同的问题。看到这个帖子,但还没有成功:***.com/questions/33759623/… 构建多个副本是什么意思?我的意思是,每次我上床睡觉然后回到我的电脑时,我都必须从头开始再次运行整个代码,所以我必须重建图表,但名称应该可以工作吗?除了我刚刚意识到我在 weight_variable 函数中写的 name=name 的位置与我打算写的不同,所以我会看看这是否是问题...... 我的意思是你是否在同一个进程中多次执行训练代码(即从一些未显示的外部函数)? 啊,现在我看到您正在使用 Jupyter,这表明您使用的是 possible answer。 【参考方案1】:

您似乎正在使用 Jupyter 来构建模型。一个可能的问题是,在使用默认参数构造 tf.Saver 时,它将使用(自动生成的)变量名称作为检查点中的键。由于在 Jupyter 中很容易多次重新执行代码单元,因此您可能会在保存的会话中得到变量节点的多个副本。请参阅 my answer to this question 了解可能出错的原因。

有几种可能的解决方案。以下是最简单的:

在构建模型之前致电tf.reset_default_graph()(以及Saver)。这将确保变量获得您想要的名称,但它会使以前创建的图表无效。

使用tf.train.Saver() 的显式参数来指定变量的持久名称。对于您的示例,这应该不会太难(尽管对于较大的模型来说它变得笨拙):

saver = tf.train.Saver(var_list="b1": b1, "W1": W1, "b2": b2, "W2": W2)

创建一个新的tf.Graph() 并在每次创建模型时将其设为默认值。这在 Jupyter 中可能很棘手,因为它会强制您将所有模型构建代码放在一个单元格中,但它适用于脚本:

with tf.Graph().as_default():
  # Model building and training/evaluation code goes here.

【讨论】:

似乎没有任何名为“reset_default_graph()”的函数,出于您解释的原因,我宁愿不使用显式参数。 第三个选项对你有用吗?如果没有,你可以试试第二个选项,看看它是否能解决你的问题?看来您必须install from source 才能获得tf.reset_default_graph()

以上是关于Jupyter 上的 TensorFlow:无法恢复变量的主要内容,如果未能解决你的问题,请参考以下文章

解决不能再jupyter notebook中使用tensorflow

如何使用官方Tensorflow docker容器在主机目录中保存和编辑Jupyter笔记本?

无法从 jupyter 启动张量板

Conda 环境未显示在 Jupyter Notebook 中

jupyter notebook 无法导入keras

Jupyter 笔记本内核上的 CNTK 无法正常工作