CNN 学习系列之 perdict 以及可视化

时间:2022-06-02 00:20:07

在完成training 之后,我们要看下train 的model 的效果如何。所以我们可以把perdict 的结果画出来,这些效果会比较容易看。

但是由于caffe原来的c++ 接口都是通过命令行来看的,它的结果不是很直观,所以我们有下列几种方法来改进:
1. 可以修改train_val.prototxt 文件中的layer。 通过添加一个accuracy layer:

layer {
name: "loss3/top-1"
type: "Accuracy"
bottom: "fc8_classifier"
bottom: "label"
top: "loss3/top-1"
include {
phase: TRAIN
}
}

这样我们可以通过在命令行print accuracy 的方法来看我们每次迭代之后的模型在训练集上的正确率。
之后我们可以用同样的方法来对测试集进行操作,这样就可以得到我们的模型在测试集上面的正确率了。
这种方法虽然比较简单,但是如果我们想要保存我们的预测结果的话,就没办法做到了。
2. 所以我们可以使用caffe 的python接口,写一个脚本来解决这个问题。直接上代码会比较直观:

#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
caffe_root = '/Users/apple/Desktop/caffe'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
# caffe 的python接口默认是在caffe的python文件夹下的,所以这里要先进入到它的python文件夹中。
from scipy.ndimage import imread
caffe.set_mode_gpu()

#这里是deploy.prototxt 文件的路径
model_def = '/path/to/deploy.prototxt'
#这里是训练好的caffemodel 的文件路径
model_weights = '/path/to/*.caffemodel'
net = caffe.Net(model_def,
model_weights,
caffe.TEST)

mu = np.load('/Users/apple/Desktop/my_mean.npy')
mu = mu.mean(1).mean(1)

transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,1))
transformer.set_mean('data', mu)
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))

file = open('/path/to/input_of_your_testdata', 'r')
file1 = open('/path/to/output/', 'w')
all_lines = file.readlines()
image_file = []
Id = 0
for line in all_lines:
d = line.split('\n')
image_file = "/Users/apple/Desktop/hw3/testImages/"+d[0]
image = caffe.io.load_image(image_file)
transformed_image = transformer.preprocess('data', image)

#以上是获得测试集图片的路径名并读入数据

net.blobs['data'].data[...] = transformed_image
output = net.forward()
output_prob = output['prob'][0]
# print 'predicted class is:', output_prob.argmax()
Ss = d[0] + "," + str(output_prob.argmax()) + "\n"
print Ss
file1.write(Ss)
# 以上是对数据进行预测并且输出

这样通过pycaffe 我们可以比较主动的控制预测的结果并且把它修改成我们需要的格式或者进行其他额外的处理。