在variable_scope下引入优化器变量时,重新创建两次,为什么?

时间:2016-09-30 14:42:46

标签: machine-learning neural-network tensorflow tensorboard

正如标题所示,当查看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)

产生以下异常:

DNN Graph

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

我的代码中出错了什么?

2 个答案:

答案 0 :(得分:0)

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

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

你能改变一下吗?

logits = neural_network_model(x_batch)

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

答案 1 :(得分:0)

您确定重新创建变量吗?我怀疑你看到的只是优化器创建的Adagrad变量,因此可以节省计算所需的内容。你能试试最简单的GradientDescentOptimizer,看看它是否仍然存在?