TensorFlow:恢复的变量似乎是随机的

TensorFlow:恢复的变量似乎是随机的,tensorflow,Tensorflow,我在恢复一些变量时遇到问题。在更高级别上保存整个模型时,我已经恢复了变量,但这次我决定只恢复几个变量。 在第一次会话之前,我初始化权重: weights = { '1': tf.Variable(tf.random_normal([n_input, n_hidden_1], mean=0, stddev=tf.sqrt(2*1.67/(n_input+n_hidden_1))), name='w1') } weights_saver = tf.train.Saver(var_list=weigh

我在恢复一些变量时遇到问题。在更高级别上保存整个模型时,我已经恢复了变量,但这次我决定只恢复几个变量。 在第一次会话之前,我初始化权重:

weights = {
'1': tf.Variable(tf.random_normal([n_input, n_hidden_1], mean=0, stddev=tf.sqrt(2*1.67/(n_input+n_hidden_1))), name='w1')
}
weights_saver = tf.train.Saver(var_list=weights)
然后,在一个会话中,当我训练NN时:

with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:
[...]
weights_saver.save(sess, './savedModels/Weights/weights')
然后:

with tf.Session() as sess:
    new_saver = tf.train.import_meta_graph(pathsToVariables + 'Weights/weights.meta')
    new_saver.restore(sess, pathsToVariables + 'Weights/weights')

    weights = 
    {
    '1': tf.Variable(sess.graph.get_tensor_by_name("w1:0"), name='w1', trainable=False)
    }

    sess.run(tf.global_variables_initializer())
    print(sess.run(weights['1']))
但在这一点上,恢复的权重似乎是随机的。事实上,如果我再次使用sess.runtf.global\u variables\u初始值设定项,权重将不同。好像,我恢复了权重初始化的正常功能,但没有恢复训练权重

我做错了什么

我的问题清楚了吗

 weights = 
    {
    '1': tf.Variable(sess.run(sess.graph.get_tensor_by_name("w1:0")), name='w1', trainable=False)
    }
我找到了答案。我需要运行张量来获得值。现在看来很明显

编辑2:

这种方法不是从其他值初始化张量的好方法,因为当我们恢复并创建张量时,它将创建两个同名的张量。或者,如果名称不同,它将从过去的模型中恢复变量,并在以后尝试对其进行优化。最好在前一个会话中恢复变量,存储值,然后关闭会话,打开新会话以创建其他所有内容

 with tf.session() as sess: 
    weight1 = sess.run(sess.graph.get_tensor_by_name("w1:0"))

 tf.reset_default_graph() #this will eliminate the variables we restored

 with tf.session() as sess:
    weights = 
       {
       '1': tf.Variable(weight1 , name='w1-bis', trainable=False)
       }
...

我们现在可以确定恢复的变量不是图表的一部分。

您从保存的会话恢复了会话,对吗?为什么要再次运行全局变量初始化器?如果您有一些要随机初始化的变量和一些要还原的变量,则只需运行它们的初始值设定项。我将尝试此操作,但如果我不运行初始值设定项,我收到一个错误,说找不到变量权重。如果我只使用tf初始化某些变量。初始化_变量:FailedPremissionError:尝试使用未初始化的值w1_1[[Node:w1_1/_8=\u Send[T=DT_FLOAT,client_terminated=false,recv_device=/job:localhost/replica:0/task:CPU:0,send_device=/job:localhost/replica:0/task:0/device:GPU:0,send_device_化身=1,tensor_name=edge_4_w1,_device=/job:localhost/replica:0/task:0/device:GPU:0]w1]]。你是在分布式设置上运行这个吗?为什么你在w1_1下有多个权重w1的副本?你能发布到github repo的链接吗?用整个代码调试会更容易。没有分布式系统。只有GPU。可能会有帮助吗?问题是我想要有不可训练的变量。我不只是想恢复模型,or the variables.AFAIK该方法同时适用于可培训变量和不可培训变量。我想将以前的可培训变量更改为不可培训变量。*抱歉,我没有正确解释。