http://www.cnblogs.com/denny402/p/5684431.html
感谢博主徐其华随笔分类 - caffe系列教程,收获颇丰。在这里记录下自己学习训练和测试模型的过程,可以说相关知识是完全来自参考博文,只是记录一下自己实践中的问题和感悟。
一、数据准备
官网提供的mnist数据并不是图片,但我们以后做的实际项目多数可能是图片。因此有些人并不知道该怎么办。在此我将mnist数据进行了转化,变成了一张张的图片,我们练习就从图片开始。
linu下直接用wget下载 wget http://deeplearing.net/data/mnist/mnist.pkl.gz
mnist.pkl.gz其实是数据的训练集、验证集和测试集用pickle导出的文件被压缩为gzip格式,所以用python的gzip模块当成文件就可以读取。其中每个数据集是一个元组,第一个元素存储的是手写数字图片,表示每张图片是长度为28*28=784的一维浮点型numpy数组,这个数组就是单通道灰度图片按行展开得到,最大值为1(白),最小值为0(黑)。元组中的第二个元素是图片对应的标签,是一个一维的整型numpy数组,按照下标位置对应图片中的数字。然后运行 convert_mnist.py 将pickle格式的数据转换为图片。
import os | |
import pickle, gzip | |
from matplotlib import pyplot | |
# Load the dataset | |
print('Loading data from mnist.pkl.gz ...') | |
with gzip.open('mnist.pkl.gz', 'rb') as f: | |
train_set, valid_set, test_set = pickle.load(f) | |
imgs_dir = 'mnist' | |
os.system('mkdir -p {}'.format(imgs_dir)) | |
datasets = { 'train': train_set, 'val': valid_set, 'test': test_set} | |
for dataname, dataset in datasets.items(): | |
print('Converting {} dataset ...'.format(dataname)) | |
data_dir = os.sep.join([imgs_dir, dataname]) | |
os.system('mkdir -p {}'.format(data_dir)) | |
for i, (img, label) in enumerate(zip(*dataset)): | |
filename = '{ :0>6d}_{}.jpg'.format(i, label) | |
filepath = os.sep.join([data_dir, filename]) | |
img = img.reshape((28, 28)) | |
pyplot.imsave(filepath, img, cmap='gray') | |
if (i+1) % 10000 == 0: | |
print('{} images converted!'.format(i+1)) |
该脚本首先创建一个叫mnist的文件夹,然后在mnist下创建3个子文件夹train、val和test,分别用来保存对应3个数据集转换后产生的图片。每个文件的命名规则为第一个字段是序号,第二个字段是数字的值。
二、制作LMDB数据
LMDB差不多是CAFFE用来训练图片最常用的数据格式。caffe提供了专门为图像分类任务将图片转换为LMDB的官方工具,路径为caffe/build/tools/convert_imageset。要使用这个工具,第一步是生成一个图片文件路径的列表,每一行是文件路径和对应标签我,用space键或者制表符(tab)分开。运行gen_caffe_imglist.py,代码如下: