【问题标题】:When introducing the Optimizer variables under variable_scope get recreated twice, why?在 variable_scope 下引入 Optimizer 变量时会重新创建两次,为什么?
【发布时间】:2017-02-09 04:29:28
【问题描述】:

正如标题所暗示的,当查看 tensorboard 内的图表时 - 我在 variable_scope 内创建的变量被重新创建了两次。这是为什么?我做错了什么?

def weights_biases(weights_shape, biases_shape):
    weights = tf.get_variable("weights", weights_shape, initializer = tf.random_normal_initializer())
    biases = tf.get_variable("biases", biases_shape, initializer = tf.random_normal_initializer())

    return weights, biases

def hl_relu(input_tensor, weights_shape, biases_shape):
    weights, biases = weights_biases(weights_shape, biases_shape)
    regression = tf.matmul(input_tensor, weights) + biases
    return tf.nn.relu(regression)

def neural_network_model(x):
    # W = tf.Variable(
    #    tf.truncated_normal([vocab_size, embedding_size], stddev=1 / math.sqrt(vocab_size)),
    #    name="W")

    # embedded = tf.nn.embedding_lookup(W, x)    
    # embedding_aggregated = tf.reduce_sum(embedded, [1])

    with tf.variable_scope("hidden_layer_1"):
        relu1 = hl_relu(x, [max_words_len, n_nodes_hl1], [n_nodes_hl1])

    with tf.variable_scope("hidden_layer_2"):
        relu2 = hl_relu(relu1, [n_nodes_hl1,n_nodes_hl2], [n_nodes_hl2])

    with tf.variable_scope("hidden_layer_3"):
        relu3 = hl_relu(relu2, [n_nodes_hl2,n_nodes_hl3], [n_nodes_hl3])

    with tf.variable_scope("output_layer"):
        weights, biases = weights_biases([n_nodes_hl3, n_classes], [n_classes])
        output_regression = tf.matmul(relu3, weights) + biases

    return output_regression

def train_neural_network(test_x, test_y):
    with tf.device("/cpu:0"):
        custom_runner = CustomRunner()
        x_batch, y_batch = custom_runner.get_inputs()

        with tf.variable_scope("test"):
            testX = tf.constant(test_x, name="testX")
            testX = tf.cast(testX, tf.float32)
            testY = tf.constant(test_y, name="testY")
            testY = tf.cast(testY, tf.float32)

        with tf.variable_scope("nn") as scope:
            global_step = tf.Variable(0, trainable=False, name='global_step')    

            logits = neural_network_model(x_batch)
            scope.reuse_variables()
            test_logits = neural_network_model(testX)

            cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, y_batch), name="cost")
            tf.scalar_summary('cost', cost)
            optimizer = tf.train.AdagradOptimizer(0.01).minimize(cost, global_step = global_step)

产生如下异常:

您可以看到“nn”范围被创建了两次,其中我的隐藏层没有连接到任何输入,但通过不断提供它们的初始化随机权重来影响 Adagrad 优化器。我怀疑这也会减慢训练速度。

我的代码做错了什么?

【问题讨论】:

    标签: machine-learning neural-network tensorflow tensorboard


    【解决方案1】:

    我相信这就是导致它们被创建两次的原因。

    logits = neural_network_model(x_batch)
    scope.reuse_variables()
    test_logits = neural_network_model(testX)
    

    你能把它改成这样吗:

    logits = neural_network_model(x_batch)
    

    没有 test_logits,看看你是否仍然遇到同样的问题?

    【讨论】:

    • 不幸的是他们这样做了。这些行似乎确实脱离了上下文,对此我深表歉意,那是因为在方法的更下方(我没有复制)有一个准确性计算等。但无论如何,即使我评论你提到的这两行,这个问题仍然存在。我完全不知道为什么会发生这种情况......只有当我使用范围时。没有范围就不会发生。问题是,如果我想使用 QueueRunner 提要,我必须使用范围......这也是我有上述两行的原因。
    • 另请注意,adam 和 adadelta 确实为自己创建了一组额外的变量。如果您查看创建的模型文件,您会注意到使用这些方法时它们的大小是原来的两倍。他们需要这样做,因为这就是他们的方法的工作方式。
    • 我完全会买它,只是当我不使用范围时,我看不到上面截图中引用的那些额外变量。我只看到以 update_ 为前缀的额外部分。这些不是上面的。
    • 所以 tensorboard 根据范围以不同的方式组织图表(我不太清楚如何,通常尝试将范围放在其他范围内的框中)。当您不使用变量范围时,它可能只是在一边。此外,当您不使用命名时,tensorflow 仍会创建这些变量,但会使用以前的范围。
    • 没错。而且我使用范围界定,因为我没有直接从内存通过占位符提供我的数据,而是尝试通过从 tfrecord 示例原型读取数据的 OP 提供数据。整个事情太慢了,我的意思是慢了几个数量级,而且在成本和准确性方面似乎也几乎没有随着时间的推移而变得更好。这反过来又促使我仔细查看图表,我注意到利用这些范围是唯一允许我提供测试批次的东西,创建了一组额外的隐藏层变量,这些变量被初始化......跨度>
    【解决方案2】:

    您确定重新创建了变量吗?我怀疑您看到的只是优化器创建的 Adagrad 变量,这样可以节省计算所需的内容。可以试试最简单的 GradientDescentOptimizer 看看还能不能出现?

    【讨论】:

    • 你是对的,使用 GradientDescentOptimizer 我没有看到同样的事情发生。但是,使用 AdamOptimizer 和 AdagradOptimizer,我肯定看到的不仅仅是更新变量。您甚至可以在上面的示例图片中看到,我得到了一个同名的新范围,它有自己的权重和偏差,并且没有输入,只有输出最终会影响优化器。这是对输出到优化器的其他层的补充。因此,对于进入优化器的每一层,我基本上都有双倍的输出。 (请原谅大写,只是想突出显示)
    • 我不知道如何发布更多图片,但我很乐意这样做。
    • 整个事情开始了,因为我比较了使用 QueueRunner 并使用占位符提供数据,我的模型非常明显地爬行。然后我开始查看图表并发现了这个......我怀疑它与我的模型爬行有关并且还有一些可疑的结果。
    • 您是否尝试在第一次会话之前完成图表。运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2016-03-15
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多