【问题标题】:Tensorflow:Training doesn't improve accuracyTensorflow:训练并不能提高准确性
【发布时间】:2018-06-13 20:13:15
【问题描述】:

我刚开始学习tensorflow,在MNIST上写了一个锻炼模型。所以我正在关注一本书,但是还有问题,请你帮我解决这个问题吗?

以下是我的代码,里面有问题描述,非常感谢!

x = tf.placeholder(tf.float32,[None,INPUT_NODE],name='input')
y_ = tf.placeholder(tf.float32,[None,OUTPUT_NODE],name='output')
weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER1_NODE],stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))
weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE,OUTPUT_NODE],stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

下一个 y = ()...定义前向传播而不使用移动平均模型。

y = inference(x,None,weights1,biases1,weights2,biases2)
global_step = tf.Variable(0,trainable=False)
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
variables_averages_op = variable_averages.apply(tf.trainable_variables())

下一个 average_y =()...使用移动平均模型定义前向传播。

average_y = inference(x,variable_averages,weights1,biases1,weights2,biases2)

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.arg_max(y_,1))
cross_entropy_mean = tf.reduce_mean(cross_entropy)
regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
regularization = regularizer(variable_averages.average(weights1)) +\
                 regularizer(variable_averages.average(weights2))
loss = cross_entropy_mean + regularization
learning_rate = tf.train.exponential_decay(
    LEARNING_RATE_BASE,                        
    global_step,                                
    mnist.train.num_examples / BATCH_SIZE,      
    LEARNING_RATE_DECAY                        
)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
train_op = tf.group(train_step,variables_averages_op)

问题是当我使用 average_y 计算准确率时,似乎训练根本无助于提高:

0 个训练步骤后,验证中的 acc 为 0.0742

经过 1000 个训练步骤后,验证中的 acc 为 0.0924

经过 2000 个训练步骤后,验证中的 acc 为 0.0924

当我使用 y 而不是 average_y 时,一切都很好。这真的让我很困惑:

0 个训练步骤后,验证中的 acc 为 0.0686

经过 1000 个训练步骤后,验证中的 acc 为 0.9716

经过 2000 个训练步骤后,验证中的 acc 为 0.9768

#correct_prediction = tf.equal(tf.arg_max(y,1),tf.arg_max(y_,1))
correct_prediction = tf.equal(tf.arg_max(average_y,1),tf.arg_max(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
with tf.Session() as sess:
    tf.initialize_all_variables().run()
    validate_feed = {
        x:mnist.validation.images,
        y_:mnist.validation.labels
    }
    test_feed={
        x:mnist.test.images,
        y_:mnist.test.labels
    }
    for i in range(TRAINING_STEPS):
        if i%1000 == 0:
            validate_acc = sess.run(accuracy,feed_dict=validate_feed)
            print("After %d training steps, acc in validatation is %g"%(i,validate_acc))
        xs,ys = mnist.train.next_batch(BATCH_SIZE)
        sess.run([train_op,global_step],feed_dict={x:xs,y_:ys})
    test_acc = sess.run(accuracy,feed_dict=test_feed)
    print("After %d training steps, acc in test is %g" % (TRAINING_STEPS, test_acc))

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    从您的代码 sn-p 中,您正在训练关于 y 逻辑而不是 average_y 的分类损失,因此实际上没有训练具有指数移动平均值的推理图

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.arg_max(y_,1))
    

    【讨论】:

    • 是的,我已经考虑过这种可能性。但是打印它表明指数移动平均线确实发生了变化。
    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 2018-06-25
    • 2017-10-09
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2018-12-20
    • 2020-08-15
    相关资源
    最近更新 更多