caffe手写数字识别-训练模型

为什么写第二篇呢以为第一篇有坑用lmdb格式的数据训练,可能生成的lmdb数据有问题,验证准确率很低,所以这次直接用原始数据训练,准确率%99左右,只训练了10epoch,这个结果不算太好,我之前用Keras+TensorFlow准确率在%99.6左右
下面是一些训练过程中生成文件的截图:
caffe手写数字识别-训练模型_第1张图片
train文件夹下的子文件夹,test文件夹类似
caffe手写数字识别-训练模型_第2张图片
 
生成图片文件列表txt

# 生成图片列表的txt文件,image_path:图像文件夹的位置
# save_path:保存图像列表txt文件的位置
# type:mnist/train/ or mnist/test/
import os
def create_flist(image_path, save_path, Type):
    with open(save_path, 'a') as f:
        label_list = os.listdir(image_path)
        for label in label_list:
            filenames = os.listdir(image_path+"/"+label)
            for fname in filenames:
                f.write(Type +label+'/'+fname+' '+label+'\n')

此时生成的图片文件路径txt过于整齐不利于模型学习
trianlist.txt类似
caffe手写数字识别-训练模型_第3张图片

create_flist('mnist/train', 'mnist/trainlist.txt','mnist/train/')
create_flist('mnist/test', 'mnist/testlist.txt','mnist/test/')

生成随机的图像路径列表

import random
def create_randomList(listfile, savepath):
    with open(listfile, 'r') as f:
        all_text = f.readlines()
    with open(savepath, 'w') as f:
        for i in xrange(len(all_text)):
            index = random.randint(0,len(all_text)-1)
            f.write(all_text[index])
create_randomList('mnist/trainlist.txt','mnist/train.txt')
create_randomList('mnist/testlist.txt','mnist/test.txt')

caffe手写数字识别-训练模型_第4张图片
生成训练/测试配置文件

from caffe import layers as L,params as P, to_proto
# 训练测试数据路径文件位置
train_txt = 'mnist/train.txt'
test_txt = 'mnist/test.txt'
# 训练测试的配置文件保存位置位置
train_proto = 'mnist/train.prototxt'
test_proto = 'mnist/test.prototxt'
# img_list:lmdb文件的位置,
# batch_size:每次批训练图片的数量,
# include_acc:Fasle不计算准确率
def create_net(img_list,batch_size, include_acc=False):
    # 输入层:同时传递,图片数据和标签,transform_param:对图像进行增强处理
    data, label = L.ImageData(source=img_list,batch_size=batch_size,ntop=2,
                         transform_param=dict(scale=1./255))
    # 卷积层
    # data:图片的像素,kernelsize=卷积核的大小即:5x5,
    # siride:卷积核滑动的步长
    # num_output:输出特征图的数量(卷积核的数量)
    # pad : 对输入像素矩阵各边增加像素的数量
    # weight_filler:卷积核的初始化方式:xavier
    conv1 = L.Convolution(data, kernel_size=5, num_output=32, pad=2,
                         weight_filler=dict(type='xavier'))
    # 激活层
    # in_place:meaning the bottom and the top blob could be the same to preserve memory consumption.
    relu1 = L.ReLU(conv1, in_place=True)
    # 池化层
    pool1 = L.Pooling(relu1, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    conv2 = L.Convolution(pool1, kernel_size=5, num_output=64, pad=1,
                         weight_filler=dict(type='xavier'))
    relu2 = L.ReLU(conv2, in_place=True)
    pool2 = L.Pooling(relu2, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    # 全连接层
    fc1 = L.InnerProduct(pool2, num_output=500, weight_filler=dict(type='xavier'))
    relu3 = L.ReLU(fc1, in_place=True)
    # dropout防止过拟合
    drop1 = L.Dropout(relu3, in_place=True)
    fc2 = L.InnerProduct(drop1, num_output=10, weight_filler=dict(type='xavier'))
    # softmax
    loss = L.SoftmaxWithLoss(fc2, label)
    # 根据需要是否要计算accuracy
    if include_acc:
        acc = L.Accuracy(fc2, label)
        return to_proto(loss, acc)
    else:
        return to_proto(loss)
def create_prototxt(save_proto,img_list,batch_size, acc=False):
    with open(save_proto, 'w') as f:
        f.write(str(create_net(img_list, batch_size, acc)))
create_prototxt(train_proto, 'mnist/train.txt', 100)
create_prototxt(test_proto,'mnist/test.txt',100, acc=True)

生成solver文件

from caffe.proto import caffe_pb2
s = caffe_pb2.SolverParameter()
solver_save_path = 'mnist/solver.prototxt'
# train_net :训练配置文件
# test_net :测试配置文件
# test_iter :迭代多少次测试完一次所有的样本
# test_interval :测试间隔[训练多少个batch_size后测试一次]
# base_lr :初始学习效率
# display :屏幕显示间隔
# max_iter :最大迭代次数
# lr_policy :学习效率变化
# setpsize :每隔多少次迭代,调整一次lr,
# gamma : 学习效率的变化指数
# momentum: 影响lr的动量
# weight_decay: 权值衰减率
# snapshot : 保存模型的间隔
# snapshot_prefix: 保存模型的前缀
# solver_mode : 是否选择GPU
# type : 优化算法
s.train_net = 'mnist/train.prototxt'
s.test_net.append('mnist/test.prototxt')
s.test_iter.append(100)
s.test_interval = 600
s.base_lr = 0.01
s.display = 20
s.max_iter = 6000
s.lr_policy = 'step'
s.stepsize =  2000
s.gamma = 0.1
s.momentum = 0.9
s.weight_decay = 5e-4
s.snapshot = 2000
s.snapshot_prefix = 'snapshot'
s.solver_mode = caffe_pb2.SolverParameter.GPU
s.type = 'SGD'
with open(solver_save_path, 'w') as f:
    f.write(str(s))

Training Model


import caffe
caffe.set_device(0)
caffe.set_mode_gpu()
solver = caffe.SGDSolver('mnist/solver.prototxt')
solver.solve()

caffe手写数字识别-训练模型_第5张图片

你可能感兴趣的:(caffe)