Tensorflow 振荡测试和训练精度?

数据挖掘 机器学习 深度学习 神经网络 张量流 卷积神经网络
2021-09-23 05:30:16

我已经实现了一个带有图像作为输入和 101 个类作为输出的 CNN。在将输入作为网络输入之前,我已经对输入应用了均值减法和归一化。

我还尝试了多个优化器(ADAM 和 SGD),还改变了学习率(0.1,0.01,0,001)和批量大小(19,32,64,128,200)。但在所有这些案例中,我都观察到了类似的模式。

我不认为网络正在学习更多,更重要的是在几个值之间波动的准确性。

我最初认为这是因为批量大小,但我错了。我已经使用 caffe 构建并训练了具有相同输入的完全相同的网络。并达到了 55% 的准确率(检查网络模型的工作情况)。

我的猜测是实现在某个地方出错,但不确定在哪里。

我的代码

输出

这个特定的输出是 lr=0.001 batch_size=200 和 ADAM 优化器

Iter 2000, Minibatch Loss= 12560.197266, Training Accuracy= 0.01000
Testing Accuracy: 0.025
Iter 4000, Minibatch Loss= 4587.021484, Training Accuracy= 0.00500
Testing Accuracy: 0.005
Iter 6000, Minibatch Loss= 2196.316406, Training Accuracy= 0.02000
Testing Accuracy: 0.02
Iter 8000, Minibatch Loss= 918.784119, Training Accuracy= 0.01500
Testing Accuracy: 0.0
Iter 10000, Minibatch Loss= 315.327911, Training Accuracy= 0.01000
Testing Accuracy: 0.0
Iter 12000, Minibatch Loss= 102.744026, Training Accuracy= 0.01000
Testing Accuracy: 0.01
Iter 14000, Minibatch Loss= 59.417763, Training Accuracy= 0.00500
Testing Accuracy: 0.005
Iter 16000, Minibatch Loss= 33.026432, Training Accuracy= 0.00500
Testing Accuracy: 0.02
Iter 18000, Minibatch Loss= 30.361868, Training Accuracy= 0.02000
Testing Accuracy: 0.005
Iter 20000, Minibatch Loss= 33.944790, Training Accuracy= 0.01000
Testing Accuracy: 0.02
Iter 22000, Minibatch Loss= 15.029477, Training Accuracy= 0.02000
Testing Accuracy: 0.02
Iter 24000, Minibatch Loss= 13.751340, Training Accuracy= 0.02500
Testing Accuracy: 0.02
Iter 26000, Minibatch Loss= 9.085027, Training Accuracy= 0.01500
Testing Accuracy: 0.015
Iter 28000, Minibatch Loss= 14.407433, Training Accuracy= 0.02000
Testing Accuracy: 0.02
Iter 30000, Minibatch Loss= 11.090684, Training Accuracy= 0.02500
Testing Accuracy: 0.02
Iter 32000, Minibatch Loss= 9.385777, Training Accuracy= 0.02000
Testing Accuracy: 0.03
Iter 34000, Minibatch Loss= 12.902111, Training Accuracy= 0.01500
Testing Accuracy: 0.02
Iter 36000, Minibatch Loss= 5.580408, Training Accuracy= 0.02000
Testing Accuracy: 0.005
Iter 38000, Minibatch Loss= 11.641799, Training Accuracy= 0.02000
Testing Accuracy: 0.03
Iter 40000, Minibatch Loss= 6.941562, Training Accuracy= 0.01500
Testing Accuracy: 0.02
Iter 42000, Minibatch Loss= 6.781301, Training Accuracy= 0.01000
Testing Accuracy: 0.0
Iter 44000, Minibatch Loss= 6.840708, Training Accuracy= 0.01000
Testing Accuracy: 0.01
Iter 46000, Minibatch Loss= 5.501908, Training Accuracy= 0.01000
Testing Accuracy: 0.03
Iter 48000, Minibatch Loss= 4.667253, Training Accuracy= 0.03000
Testing Accuracy: 0.015
Iter 50000, Minibatch Loss= 4.613351, Training Accuracy= 0.01000
Testing Accuracy: 0.01
Iter 52000, Minibatch Loss= 7.234328, Training Accuracy= 0.02000
Testing Accuracy: 0.01
Iter 54000, Minibatch Loss= 8.120478, Training Accuracy= 0.02500
Testing Accuracy: 0.01
Iter 56000, Minibatch Loss= 6.804164, Training Accuracy= 0.01000
Testing Accuracy: 0.01
Iter 58000, Minibatch Loss= 5.060484, Training Accuracy= 0.03000
Testing Accuracy: 0.02
Iter 60000, Minibatch Loss= 4.937673, Training Accuracy= 0.02000
Testing Accuracy: 0.015
Iter 62000, Minibatch Loss= 8.758166, Training Accuracy= 0.01000
Testing Accuracy: 0.02
Iter 64000, Minibatch Loss= 4.616434, Training Accuracy= 0.01500
Testing Accuracy: 0.025
2个回答

从您的结果中,我看到网络运行良好:损失函数正在减少,这意味着计算结果接近预期结果。但事实上准确度不是,所以你计算它的方式应该有一些错误。

损失函数在某个点(约 20000 次迭代之后)开始振荡的事实是意料之中的,这就是为什么通常在一些时期后降低学习率或使用其他一些退火技术的原因。

似乎在一些时期之后,您的训练会出现波动。我猜原因是学习率很高。尝试将Adam优化器的衰减参数设置为大于一的数字并恢复训练。