数据层预取队列空后丢失 0

Data Layer Prefetch Queue Empty followed by loss 0

我正在我自己的数据集上微调 caffenet。 我已经在 flickr 样式数据集上成功完成了它, 所以我修改了求解器和 train_val prototxt 文件以指向我的数据集,具有新的输出维度 (=100 类).

我的数据集大小是 1.88M 图像用于训练,0.48M 图像用于测试。

当我开始训练时,它停了一会儿显示

... blocking_queue.cpp:50] Data layer prefetch queue empty

然后进行如下:

... solver.cpp:414]     Test net output #0: accuracy = 0.0002
... solver.cpp:414]     Test net output #1: loss = 5.6139 (* 1 = 5.6139 loss)
... solver.cpp:242] Iteration 0, loss = 7.23329
... solver.cpp:258]     Train net output #0: loss = 7.23329 (* 1 = 7.23329 loss)
... solver.cpp:571] Iteration 0, lr = 0.001
... solver.cpp:242] Iteration 20, loss = 0
... solver.cpp:258]     Train net output #0: loss = 0 (* 1 = 0 loss)
... solver.cpp:571] Iteration 20, lr = 0.001
... solver.cpp:242] Iteration 40, loss = 0
... solver.cpp:258]     Train net output #0: loss = 0 (* 1 = 0 loss)
... solver.cpp:571] Iteration 40, lr = 0.001

等等。 显然,根本没有计算任何损失。奇怪的是,第 0 次迭代的初始损失似乎足够公平。

很明显,数据没有正确加载。我正在使用文本文件列出文件路径及其标签。

我正在使用 softmax 损失。

我试过将初始学习率降低到 1/10 但没有改变。

**编辑:我试过 1/1000 的初始学习率。最初它似乎工作。在大约 300 次迭代后,它的损失再次迅速下降,准确率达到 100%,这意味着可能又出问题了。 caffenet 和 VGG 都出现了这些症状。

知道可能出了什么问题吗?

问题是训练和测试数据的文本文件没有打乱顺序,而是排序了。因此,仅对相同 class 的图像进行测试,并且也从相同 class 的图像中学习参数,从而很快达到 100% 的准确率。