caffe是C++语言写的,可能很多人不太熟悉,因此想用更简单的脚本语言来实现。caffe提供matlab接口和python接口,这两种语言就非常简单,而且非常容易进行可视化,使得学习更加快速,理解更加深入。

半年前,我在学习CAFFE的时候,为了加深理解,因此写下了随笔,有了一系列的caffe学习文章。半年过去,很多人问到关于python接口和可视化的一些问题,现在有点空闲时间,就再次写下一些随笔,大家一起来学习。有些重复的内容,我就不再多讲,如果大家有兴趣可移步:

如何配置CAFFE的python接口?

如何将图片转换成LMDB文件?

如何计算训练数据的均值文件?

以上这些操作都是训练之前的预处理操作,不管是用什么接口,都要用到。

首先,我们需要掌握的,就是如何写配置文件,通过下面的代码来学习:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Spyder Editor
  4.  
  5. """
  6.  
  7. from caffe import layers as L,params as P,to_proto
  8. path='/home/xxx/data/' #保存数据和配置文件的路径
  9. train_lmdb=path+'train_db' #训练数据LMDB文件的位置
  10. val_lmdb=path+'val_db' #验证数据LMDB文件的位置
  11. mean_file=path+'mean.binaryproto' #均值文件的位置
  12. train_proto=path+'train.prototxt' #生成的训练配置文件保存的位置
  13. val_proto=path+'val.prototxt' #生成的验证配置文件保存的位置
  14. #编写一个函数,用于生成网络
  15. def create_net(lmdb,batch_size,include_acc=False):
  16. #创建第一层:数据层。向上传递两类数据:图片数据和对应的标签
  17. data, label = L.Data(source=lmdb, backend=P.Data.LMDB, batch_size=batch_size, ntop=2,
  18. transform_param=dict(crop_size=40,mean_file=mean_file,mirror=True))
  19. #创建第二屋:卷积层
  20. conv1=L.Convolution(data, kernel_size=5, stride=1,num_output=16, pad=2,weight_filler=dict(type='xavier'))
  21. #创建激活函数层
  22. relu1=L.ReLU(conv1, in_place=True)
  23. #创建池化层
  24. pool1=L.Pooling(relu1, pool=P.Pooling.MAX, kernel_size=3, stride=2)
  25. conv2=L.Convolution(pool1, kernel_size=3, stride=1,num_output=32, pad=1,weight_filler=dict(type='xavier'))
  26. relu2=L.ReLU(conv2, in_place=True)
  27. pool2=L.Pooling(relu2, pool=P.Pooling.MAX, kernel_size=3, stride=2)
  28. #创建一个全连接层
  29. fc3=L.InnerProduct(pool2, num_output=1024,weight_filler=dict(type='xavier'))
  30. relu3=L.ReLU(fc3, in_place=True)
  31. #创建一个dropout层
  32. drop3 = L.Dropout(relu3, in_place=True)
  33. fc4 = L.InnerProduct(drop3, num_output=10,weight_filler=dict(type='xavier'))
    #创建一个softmax层
  34. loss = L.SoftmaxWithLoss(fc4, label)
  35.  
  36. if include_acc: #在训练阶段,不需要accuracy层,但是在验证阶段,是需要的
  37. acc = L.Accuracy(fc4, label)
  38. return to_proto(loss, acc)
  39. else:
  40. return to_proto(loss)
  41.  
  42. def write_net():
  43. #将以上的设置写入到prototxt文件
  44. with open(train_proto, 'w') as f:
  45. f.write(str(create_net(train_lmdb,batch_size=64)))
  46.  
  47. #写入配置文件
  48. with open(val_proto, 'w') as f:
  49. f.write(str(create_net(val_lmdb,batch_size=32, include_acc=True)))
  50.  
  51. if __name__ == '__main__':
  52. write_net()

通过上面这个文件的执行,我们就会得到两个配置文件:train.prototxt和val.prototxt,分别用于训练阶段和验证阶段。

这种方式生成配置文件,必须有个前提,就是要先把原始图片转换成LMDB文件才行。如果我们已经把原始图片做成了一个列表清单(txt文件,一行一张图片),则可以不用LMDB格式作为输入数据,可以用ImageData作为数据源输入,代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. from caffe import layers as L,params as P,to_proto
  4. path='/home/xxx/data/'
  5. train_list=path+'train.txt'
  6. val_list=path+'val.txt'
  7. train_proto=path+'train.prototxt'
  8. val_proto=path+'val.prototxt'
  9.  
  10. def create_net(img_list,batch_size,include_acc=False):
  11. data,label=L.ImageData(source=img_list,batch_size=batch_size,new_width=48,new_height=48,ntop=2,
  12. transform_param=dict(crop_size=40,mirror=True))
  13.  
  14. conv1=L.Convolution(data, kernel_size=5, stride=1,num_output=16, pad=2,weight_filler=dict(type='xavier'))
  15. relu1=L.ReLU(conv1, in_place=True)
  16. pool1=L.Pooling(relu1, pool=P.Pooling.MAX, kernel_size=3, stride=2)
  17. conv2=L.Convolution(pool1, kernel_size=53, stride=1,num_output=32, pad=1,weight_filler=dict(type='xavier'))
  18. relu2=L.ReLU(conv2, in_place=True)
  19. pool2=L.Pooling(relu2, pool=P.Pooling.MAX, kernel_size=3, stride=2)
  20. conv3=L.Convolution(pool2, kernel_size=53, stride=1,num_output=32, pad=1,weight_filler=dict(type='xavier'))
  21. relu3=L.ReLU(conv3, in_place=True)
  22. pool3=L.Pooling(relu3, pool=P.Pooling.MAX, kernel_size=3, stride=2)
  23. fc4=L.InnerProduct(pool3, num_output=1024,weight_filler=dict(type='xavier'))
  24. relu4=L.ReLU(fc4, in_place=True)
  25. drop4 = L.Dropout(relu4, in_place=True)
  26. fc5 = L.InnerProduct(drop4, num_output=7,weight_filler=dict(type='xavier'))
  27. loss = L.SoftmaxWithLoss(fc5, label)
  28.  
  29. if include_acc:
  30. acc = L.Accuracy(fc5, label)
  31. return to_proto(loss, acc)
  32. else:
  33. return to_proto(loss)
  34.  
  35. def write_net():
  36. #
  37. with open(train_proto, 'w') as f:
  38. f.write(str(create_net(train_list,batch_size=64)))
  39.  
  40. #
  41. with open(val_proto, 'w') as f:
  42. f.write(str(create_net(val_list,batch_size=32, include_acc=True)))
  43.  
  44. if __name__ == '__main__':
  45. write_net()

即第一层由原来的Data类型,变成了ImageData类型,不需要LMDB文件和均值文件,但需要一个txt文件。

caffe的python接口学习(1):生成配置文件的更多相关文章

  1. caffe的python接口学习(1)生成配置文件

    ---恢复内容开始--- 看了denny的博客,写下自己觉得简短有用的部分 想用caffe训练数据首先要学会编写配置文件: (即便是用别人训练好的模型也要进行微调的,所以此关不可跨越) 代码就不粘贴了 ...

  2. caffe的python接口学习(4):mnist实例---手写数字识别

    深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了.由于篇幅原因,本文不具体介绍配置文件里面每个参数的具体函义,如果想弄明白的,请参看我以前的博文: 数据层及参数 ...

  3. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  4. caffe的python接口学习(4)mnist实例手写数字识别

    以下主要是摘抄denny博文的内容,更多内容大家去看原作者吧 一 数据准备 准备训练集和测试集图片的列表清单; 二 导入caffe库,设定文件路径 # -*- coding: utf-8 -*- im ...

  5. caffe的python接口学习(2):生成solver文件

    caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面,如下: base_lr: 0.001 display: 782 gamma: 0.1 ...

  6. caffe的python接口学习(2)生成solver文件

    caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面 有一些参数需要计算的,也不是乱设置. 假设我们有50000个训练样本,batch_si ...

  7. caffe的python接口学习(5):生成deploy文件

    如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,只是头尾不相同而也.deploy文件没有第一层数据输入层, ...

  8. caffe的python接口学习(5)生成deploy文件

    如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,只是头尾不相同而也.deploy文件没有第一层数据输入层, ...

  9. caffe的python接口学习(6)用训练好的模型caffemodel分类新图片

    经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测. 我们从mnist数据集的t ...

随机推荐

  1. EMLS项目推进思考

    解决难度从小到大来看: 一.技术与运营层面1. 到企业级层面需要的技术与运营的支撑________前端推送__________________|________后台支撑系统_________|____ ...

  2. Linux下Nagios的安装与配置[转]

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  3. W3School-CSS 文本实例

    CSS 文本实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边距 (paddi ...

  4. (转,有改动)测试网页响应时间的shell脚本[需要curl支持]

    用法及返回结果如下: [root@myserver01 tmp]# sh test_web.sh -n500 http://www.baidu.com Request url: http://www. ...

  5. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  6. Android ViewPager再探:增加滑动指示条

    上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...

  7. FineReport报表系统实例方案之医院院长查询分析系统

    医院院长查询系统 目前,大中型医院的信息处理正从传统手工方式飞速向电脑信息化建设方案转变,一个大中型医院担负着繁重的医疗和科研任务,以及繁杂的事务性工作,院长必须时刻与各科室保持密切的连续,以便随时了 ...

  8. 《硝烟中的Scrum和XP》:作者主导Scrum过程的实战经验,四星推荐

    本书作者是开发团队Leader,本书记录了他带领团队实施Scurm过程中的经验教训.全书短小精悍,言简意赅. 以下是书中一些观点信息的摘抄: 1:Nokia总结出的迭代开发的基本要求:1.1:迭代要有 ...

  9. hdu2222 Keywords Search ac自动机

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 题目: Keywords Search Time Limit: 2000/1000 MS ...

  10. reflect2015破解

    具体看 http://download.congci.com/download/net-reflector-7-6-1-824-wanquan-pojie#downloads *博主注:因为很多破解程 ...