test.py
# coding=utf-8
import numpyas np
import matplotlib.pyplotas plt
from PILimport Image
import os
import sys
import caffe
#网络结构描述文件
deploy_file ="D:/Caffee/caffe-master/examples/mnist/lenet.prototxt"
#模型文件
model_file ="D:/Caffee/caffe-master/examples/mnist/models/lenet_iter_10000.caffemodel"
#测试图片
test_data ="D:/Caffee/caffe-master/examples/mnist/MNIST_data/0-9/8.bmp"
#特征图路径
feature_map_path ="D:/Caffee/caffe-master/examples/mnist/draw_data/"
#编写一个函数,用于显示各层的参数,padsize用于设置图片间隔空隙,padval用于调整亮度
def show_data(data, name, padsize=1, padval=0):
#归一化
data -= data.min()
data /= data.max()
#根据data中图片数量data.shape[0],计算最后输出时每行每列图片数n
n = int(np.ceil(np.sqrt(data.shape[0])))
# 对于conv1,data.shape->(20,24,24)
# (前面填补0个,后面填补n ** 2 - data.shape[0]),(前面填补0个,后面填补padsize个),(前面填补0个,后面填补padsize个)
padding = ((0, n **2 - data.shape[0]), (0, padsize), (0, padsize))
data = np.pad(data, padding, mode='constant', constant_values=padval)#常数值填充,填充0
# 对于conv1,padding后data.shape->(25,25,25)
# 对于conv1,将(25,25,25)reshape->(5,5,25,25)再transpose->(5,25,5,25)
data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3))
# 再将(n, W, n, H)变换成(n*w, n*H)
data = data.reshape((n * data.shape[1], n * data.shape[3]))
image_path = os.path.join(feature_map_path,name)#特征图路径
plt.set_cmap('gray')#设置为灰度图
plt.imsave(image_path,data)#保存生成的图片
plt.axis('off')#不显示坐标
print name
#显示图片
img=Image.open(image_path)
plt.imshow(img)
plt.show()
#----------------------------数据预处理---------------------------------
#初始化caffe
net = caffe.Net(deploy_file, #网络结构描述文件
model_file, #训练好的模型
caffe.TEST)#使用测试模式
#输出网络每一层的参数
print [(k, v[0].data.shape)for k, vin net.params.items()]
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
# python读取的图片文件格式为H×W×K(高度,宽度,通道数),需转化为K×H×W(通道数,高度,宽度)
transformer.set_transpose('data', (2, 0, 1))
# python中将图片存储为[0-1]
# 如果模型输入用的是0~255的原始格式,则需要做以下转换
# transformer.set_raw_scale('data', 255)
# caffe中图片是BGR格式,而原始格式是RGB,所以要转化
#transformer.set_channel_swap('data', (2, 1, 0))
#----------------------------数据运算---------------------------------
#读取图片
#参数color: True(default)是彩色图,False是灰度图
img = caffe.io.load_image(test_data,color=False)
# 数据输入、预处理
net.blobs['data'].data[...] = transformer.preprocess('data', img)
# 将输入图片格式转化为合适格式(与deploy文件相同)
net.blobs['data'].reshape(1, 1, 28, 28)
# 前向迭代,即分类。保存输出
out = net.forward()
# 输出结果为各个可能分类的概率分布
print"Prob:"
print out
print out['prob']
#最可能分类
predict = out['prob'].argmax()
print"Result:" + str(predict)
#----------------------------输出特征图---------------------------------
#第一个卷积层输出的特征图
feature = net.blobs['conv1'].data
show_data(feature.reshape(20,24,24),'conv1.jpg')
#第一个池化层输出的特征图
feature = net.blobs['pool1'].data
show_data(feature.reshape(20,12,12),'pool1.jpg')
#第二个卷积层输出的特征图
feature = net.blobs['conv2'].data
show_data(feature.reshape(50,8,8),'conv2.jpg')
#第二个池化层输出的特征图
feature = net.blobs['pool2'].data
show_data(feature.reshape(50,4,4),'pool2.jpg')
曲线可视化:各种修改叫脚本
训练loss和accuracy可视化:
1.把caffe-windows\tools\extra目录下的plot_training_log.py.example,拷贝一份改名为
plot_training_log.py。
2.获得log文件
3.python执行plot_training_log.py
第一个参数:0-7
训练或者测试的accuracy,loss等数据
第二个参数:图片存放位置
第三个参数:log文件
画图出现错误可以参考下面文章:
http://blog.csdn.net/sunshine_in_moon/article/details/5354157