【问题标题】:How to initialize variables from variable_scope?如何从 variable_scope 初始化变量?
【发布时间】:2017-03-29 19:09:36
【问题描述】:

正如标题所述,如何在 Tensorflow 中初始化 variable_scope 中的变量?我不知道这是必要的,因为我认为它是一个常数。但是,当我在 Android 上运行会话时尝试预测输出时,出现错误:

Error during inference: Failed precondition: Attempting to use uninitialized value weights0

[[Node: weights0/read = Identity[T=DT_FLOAT, _class=["loc:@weights0"], _device="/job:localhost/replica:0/task:0/cpu:0"](weights0)]]

我尝试使用 tf.Variable(即'h1': tf.Variable(vs.get_variable("weights0", [n_input, n_hidden_1], initializer=tf.contrib.layers.xavier_initializer())))设置变量,但在尝试生成 protobuf 文件时,我收到错误 `tensor name 'Variable' not found in checkpoint files。

片段

def reg_perceptron(t, weights, biases):
    t = tf.nn.relu(tf.add(tf.matmul(t, weights['h1']), biases['b1']), name = "layer_1")
    t = tf.nn.sigmoid(tf.add(tf.matmul(t, weights['h2']), biases['b2']), name = "layer_2")
    t = tf.add(tf.matmul(t, weights['hOut'], name="LOut_MatMul"), biases['bOut'], name="LOut_Add")

    return tf.reshape(t, [-1], name="Y_GroundTruth")

g = tf.Graph()
with g.as_default():
   ...
   rg_weights = {
    'h1': vs.get_variable("weights0", [n_input, n_hidden_1], initializer=tf.contrib.layers.xavier_initializer()),
    'h2': vs.get_variable("weights1", [n_hidden_1, n_hidden_2], initializer=tf.contrib.layers.xavier_initializer()),
    'hOut': vs.get_variable("weightsOut", [n_hidden_2, 1], initializer=tf.contrib.layers.xavier_initializer())
    }


    rg_biases = {
    'b1': vs.get_variable("bias0", [n_hidden_1], initializer=init_ops.constant_initializer(bias_start)),
    'b2': vs.get_variable("bias1", [n_hidden_2], initializer=init_ops.constant_initializer(bias_start)),
    'bOut': vs.get_variable("biasOut", [1], initializer=init_ops.constant_initializer(bias_start))
    }

    pred = reg_perceptron(_x, rg_weights, rg_biases)
    ...
...

g_2 = tf.Graph()
with g_2.as_default():
    ...
    rg_weights_2 = {
    'h1': vs.get_variable("weights0", [n_input, n_hidden_1], initializer=tf.contrib.layers.xavier_initializer()),
    'h2': vs.get_variable("weights1", [n_hidden_1, n_hidden_2], initializer=tf.contrib.layers.xavier_initializer()),
    'hOut': vs.get_variable("weightsOut", [n_hidden_2, 1], initializer=tf.contrib.layers.xavier_initializer())
    }

    rg_biases_2 = {
    'b1': vs.get_variable("bias0", [n_hidden_1], initializer=init_ops.constant_initializer(bias_start)),
    'b2': vs.get_variable("bias1", [n_hidden_2], initializer=init_ops.constant_initializer(bias_start)),
    'bOut': vs.get_variable("biasOut", [1], initializer=init_ops.constant_initializer(bias_start))
    }

    pred_2 = reg_perceptron(_x_2, rg_weights_2, rg_biases_2)
    ...

编辑

我会以错误的方式创建 protobuf 文件吗? 我用于 .PB 生成的代码可以在 here 找到返回

(这里蓝线表示目标值,绿线表示预测值。)

而我应该得到

相反(来自http://pastebin.com/RUFa9NkN)尽管两个代码使用相同的输入和模型。

【问题讨论】:

  • sess.run(tf.initialize_all_variables()) 如果这对sess.run(tf.initialize_local_variables()) 也没有帮助。
  • 不幸的是,这不起作用。我仍然遇到同样的错误。

标签: python tensorflow protocol-buffers


【解决方案1】:

如果您想使用 variable_scope,请尝试以下操作:

def initialize_variable(vs_name, ...): # other necessary arguments
    # a function for initialize variables    
    with tf.variable_scope(vs_name, reuse=None) as vs:
        h1 = tf.get_variable("weights0", [n_input, n_hidden_1], initializer=tf.contrib.layers.xavier_initializer())
        h2 = tf.get_variable("weights1", [n_hidden_1, n_hidden_2], initializer=tf.contrib.layers.xavier_initializer())
        hout = tf.get_variable("weightsOut", [n_hidden_2, 1], initializer=tf.contrib.layers.xavier_initializer())
        b1 = tf.get_variable("bias0", [n_hidden_1], initializer=init_ops.constant_initializer(bias_start))
        b2 = tf.get_variable("bias1", [n_hidden_2], initializer=init_ops.constant_initializer(bias_start))
        bout = tf.get_variable("biasOut", [1], initializer=init_ops.constant_initializer(bias_start))
        vs.reuse_variables()

然后在图中,先用上面的函数初始化变量,然后提取变量。

g = tf.Graph()
with g.as_default():
  initialize_variable(vs_name, ...) #fill in other necessary arguments
  with tf.variable_scope(vs_name, reuse=True):
      rg_weights = {'h1' : tf.get_variable("weights0"),
                    'h2' : tf.get_variable("weights1"),
                    'hout' : tf.get_variable("weightsOut")}
      rg_biases = {'b1' : tf.get_variable("bias0"),
                   'b2' : tf.get_variable("bias1"),
                   'bOut': tf.get_variable("biasOut")}
  pred = reg_perceptron(_x, rg_weights, rg_biases)

如果您不想涉及 variable_scope,请尝试以下操作...虽然以下需要输入初始张量并且不接受初始化程序。

g = tf.Graph()
with g.as_default():
   ...
   rg_weights = {'h1': tf.Variable(tf.truncated_normal([n_input, n_hidden1], mean, stddev), name='weights0')
                 'h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],mean, stddev), name="weights1"),
                 'hOut': tf.Variable(tf.truncated_normal([n_hidden_2, 1],mean, stddev), name="weightsOut")}
   ...

这里有一些 documentation and example 关于 TensorFlow 中的变量共享

【讨论】:

  • 感谢您的回复。我明天会试试,因为我目前无法连接到 Jupyter。
  • 只是一个简单的问题(我还没有重新获得对 Jupyter 的访问权限)但是是否可以生成 protobuf 文件而无需重新制作检查点文件?
  • 我对这个话题不是很熟悉。但据我所知,检查点文件仅保存图形变量,而不保存图形结构。如果您保存了旧的检查点文件并且可以重建图形结构,我相信您可以从那里生成 protobuf 文件,而无需重新制作检查点文件。这里有两个可能有用的线程:thread 1thread 2
  • 啊,我曾假设我还需要在用于初始化变量的图中插入该代码。我已经检查了这些线程并将它们用作创建 .pb 文件的基础。但是,随着这些更改,我只使用vs_name/weights0/read 而不是weights0/read 得到相同的错误(我不需要intialize_variables 的任何其他参数)。修改后的protobuf创建代码可见here(45-54行和131-138行)
  • 哪一行抛出了错误?我注意到您有两个图表,第一个图表中的实现与您的旧实现相同(第 74-84 行)。完整的跟踪错误消息是什么?
猜你喜欢
  • 2022-01-13
  • 2019-05-17
  • 1970-01-01
  • 2019-12-07
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多