在Caffe的训练过程中打印验证集的预测结果

起因:Caffe里的GoogLeNet Inception V1只能输出对应于三个loss的accuracy,我想计算precision,recall和F1-measure。但是调用caffe的Python接口,结合训练集的mean文件、caffemodel文件和deploy.protxt文件对验证集预测,但是分类的结果错误很多,与网络训练输出的accuracy不符。我推断是训练样本是灰度图的问题,由于时间紧迫暂时没找到合适的解决办法。因此想到了在网络训练过程中打印验证集的预测结果作为权宜之计。

1.把create_imagenet.sh里生成val lmdb的shuffle项设置为false,也就是不打乱val集的数据。val可以自己先前制作数据集时预先打乱。

在Caffe的训练过程中打印验证集的预测结果

2.把train_val.protxt里val的batch_size设置为自己的验证集大小,比如我的验证集是67张图片

在Caffe的训练过程中打印验证集的预测结果

3.在网络的最后添加一个Softmax层和ArgMax层。图中最后一层是loss3/top-1是因为之前为了切合我们自己的分类任务删除了"loss3/top-5".ArgMax层的作用可以参考Caffe官网文档,Caffe: caffe::ArgMaxLayer< Dtype > Class Template Reference  http://caffe.berkeleyvision.org/doxygen/classcaffe_1_1ArgMaxLayer.html。简单来说就是用以在一个分类层后生成预测结果。

在Caffe的训练过程中打印验证集的预测结果

4.最后的训练日志在测试时应该如下图

在Caffe的训练过程中打印验证集的预测结果

在Caffe的训练过程中打印验证集的预测结果

这样就得到val的预测结果。由于没有打乱数据,对应val集的标签可以很容易计算出每一类的precision,recall和F1-measure

当然这只是权宜之计。以后会研究为什么python接口对val集的图片预测不正确,因为之前和同学讨论官网的python分类脚本预测RGB图像是正确的,那么应该是需要针对灰度图像做出一定的修改。