【问题标题】:Tensorflow - Accuracy begins at 1.0 and decreases with lossTensorflow - 准确度从 1.0 开始,随着损失而降低
【发布时间】:2018-04-21 18:20:16
【问题描述】:

我正在用 10K 灰度图像训练 CNN。该网络有 6 个卷积层、1 个全连接层和 1 个输出层。

当我开始训练时,损失会非常高,但会稳步下降,但我的准确度从 1.0 开始,并且也会下降。并从 72% 下降到 30% 并再次回升。此外,当我在看不见的图像上运行acc.eval({x: test_images, y: test_lables}) 时,准确率约为 16%。

另外,我有 6 个类,它们都是 one-hot 编码的。

我认为我可能错误地比较了预测输出,但在我的代码中看不到错误...

这是我的代码

pred = convolutional_network(x)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = y, logits = pred))
train_op = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)

prediction = tf.nn.softmax(pred)
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
acc = tf.reduce_mean(tf.cast(correct, 'float'))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) # Initialize all the variables
    saver = tf.train.Saver()

    time_full_start = time.clock()
    print("RUNNING SESSION...")
    for epoch in range(num_epochs):
        train_batch_x = []
        train_batch_y = []
        epoch_loss = 0
        i = 0
        while i < len(images):
            start = i
            end = i+ batch_size
            train_batch_x = images[start:end]
            train_batch_y = labels[start:end]
            op , ac, loss_value = sess.run([train_op, acc, loss], feed_dict={x: train_batch_x, y: train_batch_y})
            epoch_loss += loss_value
            i += batch_size
        print('Epoch : ', epoch+1, ' of ', num_epochs, ' - Loss for epoch: ', epoch_loss, ' Accuracy: ', ac)

    time_full_end = time.clock()
    print('Full time elapse:', time_full_end - time_full_start)


    print('Accuracy:', acc.eval({x: test_images, y: test_labels}))

    save_path = saver.save(sess, MODEL_PATH)
    print("Model saved in file: " , save_path)

这是输出

Epoch :  1  of  100  - Loss for epoch:  8.94737603121e+13  Accuracy:  1.0

Epoch :  2  of  100  - Loss for epoch:  212052447727.0  Accuracy:  1.0

Epoch :  3  of  100  - Loss for epoch:  75150603462.2  Accuracy:  1.0

Epoch :  4  of  100  - Loss for epoch:  68164116617.4  Accuracy:  1.0

Epoch :  5  of  100  - Loss for epoch:  18505190718.8  Accuracy:  0.99

Epoch :  6  of  100  - Loss for epoch:  11373286689.0  Accuracy:  0.96

Epoch :  7  of  100  - Loss for epoch:  3129798657.75  Accuracy:  0.07

Epoch :  8  of  100  - Loss for epoch:  374790121.375  Accuracy:  0.58

Epoch :  9  of  100  - Loss for epoch:  105383792.938  Accuracy:  0.72

Epoch :  10  of  100  - Loss for epoch:  49705202.4844  Accuracy:  0.66

Epoch :  11  of  100  - Loss for epoch:  30214170.7909  Accuracy:  0.36

Epoch :  12  of  100  - Loss for epoch:  18653020.5084  Accuracy:  0.82

Epoch :  13  of  100  - Loss for epoch:  14793638.35  Accuracy:  0.39

Epoch :  14  of  100  - Loss for epoch:  10196079.7003  Accuracy:  0.73

Epoch :  15  of  100  - Loss for epoch:  6727522.37319  Accuracy:  0.47

Epoch :  16  of  100  - Loss for epoch:  4593769.05838  Accuracy:  0.68

Epoch :  17  of  100  - Loss for epoch:  3669332.09406  Accuracy:  0.44

Epoch :  18  of  100  - Loss for epoch:  2850924.81662  Accuracy:  0.59

Epoch :  19  of  100  - Loss for epoch:  1780678.12892  Accuracy:  0.51

Epoch :  20  of  100  - Loss for epoch:  1855037.40652  Accuracy:  0.61

Epoch :  21  of  100  - Loss for epoch:  1012934.52827  Accuracy:  0.53

Epoch :  22  of  100  - Loss for epoch:  649319.432669  Accuracy:  0.55

Epoch :  23  of  100  - Loss for epoch:  841660.786938  Accuracy:  0.57

Epoch :  24  of  100  - Loss for epoch:  490148.861691  Accuracy:  0.55

Epoch :  25  of  100  - Loss for epoch:  397315.021568  Accuracy:  0.5

 ......................

Epoch :  99  of  100  - Loss for epoch:  4412.61703086  Accuracy:  0.57

Epoch :  100  of  100  - Loss for epoch:  4530.96991658  Accuracy:  0.62

Full time elapse: 794.5787720000001

**Test Accuracy: 0.158095**

我已经尝试了多种学习率和网络规模,但似乎可以让它发挥作用。任何帮助将不胜感激

【问题讨论】:

  • 你应该随机化订单数据输入你的神经网络。另外,数据有错误吗?特异性你确定每个类都有 1 个二进制值

标签: python tensorflow machine-learning neural-network conv-neural-network


【解决方案1】:

请注意,我的回答也是通过查看和调试完整代码(在问题中不可见)得到的。我仍然相信下面的问题足够普遍,如果有人面临类似问题,值得审查 - 你可能只是在这里得到解决方案!


异常高的损失值可能意味着您没有正确地将输入图像从 int8 转换为小的 float32 值(事实上,他做到了)并且您没有使用批量标准化和/或正则化(事实上,两者都丢失了。)此外,在这段代码中:
prediction = tf.nn.softmax(pred)
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))

完全不需要计算softmax值,因为softmax是一个严格单调的函数,它只是对预测进行缩放,pred中的最大值将是prediction中的最大值,你得到同样的结果

correct = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

鉴于您的网络运行的值非常高,tf.nn.softmax() 可能会在求幂和除以总和时无意中将所有值都归零,然后tf.argmax() 只会选择 0 类,直到数字下降一点。再加上你不累积的ac

op , ac, loss_value = sess.run([train_op, acc, loss], feed_dict={x: train_batch_x, y: train_batch_y})

所以你打印的epoch accuracy 不是那个,它只是上一批的准确性。如果您的图像是按类别排序的并且您没有随机化批次,那么您可能会在每个时期结束时获得零级图像。这可以解释为什么您在前几个时期获得 100% 的准确率,直到超高数字下降一点并且 softmax 不再将所有内容归零。 (事实证明确实如此。)

即使修复了上述问题,网络也没有学到任何东西。事实证明,当他添加随机化时,图像和标签的随机化方式不同,自然会产生恒定的 1 / 6 准确度。

解决了所有问题后,网络在 100 个 epoch 后能够学习到 98% 的准确率。

时期:100/100 损失:6.20184610883 总损失:25.4021390676 acc:97.976191%

【讨论】:

  • 嗨,彼得,谢谢你回复我。我已经随机化了图像和标签,它们确实减少了高得离谱的损失值,并在开始训练时阻止了 100% 的准确度,并修复了代码,所以它正在打印每个时期(不是最后一批)的整体准确度,感谢您指出这一点……截至目前,我只能将损失降低到 ~150.00,我能把 jupyter 笔记本寄给你吗?
  • 是的,请这样做。还有你使用的数据。
  • 谢谢@PeterSzoldan 就我而言,我不得不将输入类型从 int8 更改为 float32。直到那时,模型才开始表现得正常。因此,数据类型真的很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2017-08-21
  • 1970-01-01
  • 2021-09-28
  • 2018-09-12
  • 2019-04-14
相关资源
最近更新 更多