资讯专栏INFORMATION COLUMN

caffe的python插口之手写数字识别mnist案例

89542767 / 386人阅读

  文中主要是给大家介绍了caffe的python插口之手写数字识别mnist案例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪


  论文引言


  机器学习第一个案例一般都是是mnist,只需这个案例彻底搞懂了,其他的便是触类旁通的事了。因为字数缘故,文中不简单介绍环境变量里边每一个指标的具体函义,如果要搞明白的,请参考我之前的微博文章:


  数据访问层及主要参数


  视觉效果层及主要参数


  solver环境变量及主要参数


  一、数据准备


  官方网站给予的mnist数据信息并不是图片,但是我们之后做出来的具体新项目很有可能是图像。所以有的人并不知如何是好。在这里我们将mnist信息进行了转换,成了1张张的图片,大伙儿训练先从照片逐渐。mnist图片数据信息我放到了百度云。


  mnist图片数据信息立即下载


  数据信息划分成测试集(60000张共10类)和测试集(共10000张10类),每一个类型放到一个独立的文件夹里。并将所有的图片,都形成了txt目录明细(train.txt和test.txt)。大伙儿直接下载后,立即缓解压力到用户状态目录下就行了。因为我是在windows下压缩成的,所以是winrar文件。如果你们需在linux下压缩包解压,必须安装rar的linux版本,也是非常简易


  sudo apt-get install rar

  二、导入caffe库,并设定文件路径


  我是将mnist直接放在根目录下的,所以代码如下:


  #-*-coding:utf-8-*-
  import caffe
  from caffe import layers as L,params as P,proto,to_proto
  #设定文件的保存路径
  root='/home/xxx/'#根目录
  train_list=root+'mnist/train/train.txt'#训练图片列表
  test_list=root+'mnist/test/test.txt'#测试图片列表
  train_proto=root+'mnist/train.prototxt'#训练配置文件
  test_proto=root+'mnist/test.prototxt'#测试配置文件
  solver_proto=root+'mnist/solver.prototxt'#参数文件


  其中train.txt和test.txt文件已经有了,其它三个文件,我们需要自己编写。


  此处注意:一般caffe程序都是先将图片转换成lmdb文件,但这样做有点麻烦。因此我就不转换了,我直接用原始图片进行操作,所不同的就是直接用图片操作,均值很难计算,因此可以不减均值。


  二、生成配置文件


  配置文件实际上就是一些txt文档,只是后缀名是prototxt,我们可以直接到编辑器里编写,也可以用代码生成。此处,我用python来生成。


  #编写一个函数,生成配置文件prototxt
  def Lenet(img_list,batch_size,include_acc=False):
  #第一层,数据输入层,以ImageData格式输入
  data,label=L.ImageData(source=img_list,batch_size=batch_size,ntop=2,root_folder=root,
  transform_param=dict(scale=0.00390625))
  #第二层:卷积层
  conv1=L.Convolution(data,kernel_size=5,stride=1,num_output=20,pad=0,weight_filler=dict(type='xavier'))
  #池化层
  pool1=L.Pooling(conv1,pool=P.Pooling.MAX,kernel_size=2,stride=2)
  #卷积层
  conv2=L.Convolution(pool1,kernel_size=5,stride=1,num_output=50,pad=0,weight_filler=dict(type='xavier'))
  #池化层
  pool2=L.Pooling(conv2,pool=P.Pooling.MAX,kernel_size=2,stride=2)
  #全连接层
  fc3=L.InnerProduct(pool2,num_output=500,weight_filler=dict(type='xavier'))
  #激活函数层
  relu3=L.ReLU(fc3,in_place=True)
  #全连接层
  fc4=L.InnerProduct(relu3,num_output=10,weight_filler=dict(type='xavier'))
  #softmax层
  loss=L.SoftmaxWithLoss(fc4,label)
  if include_acc:#test阶段需要有accuracy层
  acc=L.Accuracy(fc4,label)
  return to_proto(loss,acc)
  else:
  return to_proto(loss)
  def write_net():
  #写入train.prototxt
  with open(train_proto,'w')as f:
  f.write(str(Lenet(train_list,batch_size=64)))
  #写入test.prototxt
  with open(test_proto,'w')as f:
  f.write(str(Lenet(test_list,batch_size=100,include_acc=True)))

  配置文件里面存放的,就是我们所说的network。我这里生成的network,可能和原始的Lenet不太一样,不过影响不大。


  三、生成参数文件solver


  同样,可以在编辑器里面直接书写,也可以用代码生成。


  #编写一个函数,生成参数文件
  def gen_solver(solver_file,train_net,test_net):
  s=proto.caffe_pb2.SolverParameter()
  s.train_net=train_net
  s.test_net.append(test_net)
  s.test_interval=938#60000/64,测试间隔参数:训练完一次所有的图片,进行一次测试
  s.test_iter.append(100)#10000/100测试迭代次数,需要迭代100次,才完成一次所有数据的测试
  s.max_iter=9380#10 epochs,938*10,最大训练次数
  s.base_lr=0.01#基础学习率
  s.momentum=0.9#动量
  s.weight_decay=5e-4#权值衰减项
  s.lr_policy='step'#学习率变化规则
  s.stepsize=3000#学习率变化频率
  s.gamma=0.1#学习率变化指数
  s.display=20#屏幕显示间隔
  s.snapshot=938#保存caffemodel的间隔
  s.snapshot_prefix=root+'mnist/lenet'#caffemodel前缀
  s.type='SGD'#优化算法
  s.solver_mode=proto.caffe_pb2.SolverParameter.GPU#加速
  #写入solver.prototxt
  with open(solver_file,'w')as f:
  f.write(str(s))
  四、开始训练模型
  训练过程中,也在不停的测试。
  #开始训练
  def training(solver_proto):
  caffe.set_device(0)
  caffe.set_mode_gpu()
  solver=caffe.SGDSolver(solver_proto)
  solver.solve()
  最后,调用以上的函数就可以了。
  if __name__=='__main__':
  write_net()
  gen_solver(solver_proto,train_proto,test_proto)
  training(solver_proto)


  五、完成的python文件


  mnist.py
  #-*-coding:utf-8-*-
  import caffe
  from caffe import layers as L,params as P,proto,to_proto
  #设定文件的保存路径
  root='/home/xxx/'#根目录
  train_list=root+'mnist/train/train.txt'#训练图片列表
  test_list=root+'mnist/test/test.txt'#测试图片列表
  train_proto=root+'mnist/train.prototxt'#训练配置文件
  test_proto=root+'mnist/test.prototxt'#测试配置文件
  solver_proto=root+'mnist/solver.prototxt'#参数文件
  #编写一个函数,生成配置文件prototxt
  def Lenet(img_list,batch_size,include_acc=False):
  #第一层,数据输入层,以ImageData格式输入
  data,label=L.ImageData(source=img_list,batch_size=batch_size,ntop=2,root_folder=root,
  transform_param=dict(scale=0.00390625))
  #第二层:卷积层
  conv1=L.Convolution(data,kernel_size=5,stride=1,num_output=20,pad=0,weight_filler=dict(type='xavier'))
  #池化层
  pool1=L.Pooling(conv1,pool=P.Pooling.MAX,kernel_size=2,stride=2)
  #卷积层
  conv2=L.Convolution(pool1,kernel_size=5,stride=1,num_output=50,pad=0,weight_filler=dict(type='xavier'))
  #池化层
  pool2=L.Pooling(conv2,pool=P.Pooling.MAX,kernel_size=2,stride=2)
  #全连接层
  fc3=L.InnerProduct(pool2,num_output=500,weight_filler=dict(type='xavier'))
  #激活函数层
  relu3=L.ReLU(fc3,in_place=True)
  #全连接层
  fc4=L.InnerProduct(relu3,num_output=10,weight_filler=dict(type='xavier'))
  #softmax层
  loss=L.SoftmaxWithLoss(fc4,label)
  if include_acc:#test阶段需要有accuracy层
  acc=L.Accuracy(fc4,label)
  return to_proto(loss,acc)
  else:
  return to_proto(loss)
  def write_net():
  #写入train.prototxt
  with open(train_proto,'w')as f:
  f.write(str(Lenet(train_list,batch_size=64)))
  #写入test.prototxt
  with open(test_proto,'w')as f:
  f.write(str(Lenet(test_list,batch_size=100,include_acc=True)))
  #编写一个函数,生成参数文件
  def gen_solver(solver_file,train_net,test_net):
  s=proto.caffe_pb2.SolverParameter()
  s.train_net=train_net
  s.test_net.append(test_net)
  s.test_interval=938#60000/64,测试间隔参数:训练完一次所有的图片,进行一次测试
  s.test_iter.append(500)#50000/100测试迭代次数,需要迭代500次,才完成一次所有数据的测试
  s.max_iter=9380#10 epochs,938*10,最大训练次数
  s.base_lr=0.01#基础学习率
  s.momentum=0.9#动量
  s.weight_decay=5e-4#权值衰减项
  s.lr_policy='step'#学习率变化规则
  s.stepsize=3000#学习率变化频率
  s.gamma=0.1#学习率变化指数
  s.display=20#屏幕显示间隔
  s.snapshot=938#保存caffemodel的间隔
  s.snapshot_prefix=root+'mnist/lenet'#caffemodel前缀
  s.type='SGD'#优化算法
  s.solver_mode=proto.caffe_pb2.SolverParameter.GPU#加速
  #写入solver.prototxt
  with open(solver_file,'w')as f:
  f.write(str(s))
  #开始训练
  def training(solver_proto):
  caffe.set_device(0)
  caffe.set_mode_gpu()
  solver=caffe.SGDSolver(solver_proto)
  solver.solve()
  #
  if __name__=='__main__':
  write_net()
  gen_solver(solver_proto,train_proto,test_proto)
  training(solver_proto)
  我将此文件放在根目录下的mnist文件夹下,因此可用以下代码执行
  sudo python mnist/mnist.py


  综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128775.html

相关文章

  • caffepython接口deploy形成caffemodel归类新图片

      本文主要是给大家介绍了caffe的python插口生成deploy文件学习培训及其用练习好一点的实体模型(caffemodel)来归类新的图片实例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪  caffe的python插口生成deploy文件  假如要将练习好一点的实体模型用于检测新的图片,那必然必须得一个deploy.prototxt文件,这一...

    89542767 评论0 收藏0
  • caffepython插口制作loss和accuracy曲线图

      此篇文章主要是给大家介绍了caffe的python插口制作loss和accuracy曲线图实例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪  前言  使用python插口来运行caffe程序流程,根本原因是python很容易数据可视化。所以才建议大家在cmd下边运行python程序流程。如果一定要在cmd下边运作,不如直接用c++算了。  强烈推...

    89542767 评论0 收藏0
  • python格式Caffe图片数据信息均值测算学习培训

      此篇文章关键给大家介绍了python格式Caffe图片数据信息均值测算学习培训实例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以一些帮助,祝愿大家多多的发展,尽早涨薪  前言  照片减掉均值后,然后再进行练习和检测,也会提高速度与精密度。因而,通常在各类实体模型中都有这种操作。  那么这样的均值是怎么来的呢,实际上是测算全部svm分类器的均值,计算出来后,储存为均值文档,在今后的检测中,就...

    89542767 评论0 收藏0
  • TensorFlow 2.0 / TF2.0 入门教程实战案例

    摘要:七强化学习玩转介绍了使用创建来玩游戏将连续的状态离散化。包括输入输出独热编码与损失函数,以及正确率的验证。 用最白话的语言,讲解机器学习、神经网络与深度学习示例基于 TensorFlow 1.4 和 TensorFlow 2.0 实现 中文文档 TensorFlow 2 / 2.0 官方文档中文版 知乎专栏 欢迎关注我的知乎专栏 https://zhuanlan.zhihu.com/...

    whataa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<