Caffe实现概述

目录

一、caffe配置文件介绍

二、标准层的定义

三、网络微调技巧

四、Linux脚本使用及LMDB文件生成

五、带你设计一个Caffe网络,用于分类任务

一、caffe配置文件介绍

二、标准层的定义

 

三、网络微调技巧

其中,multistep最为常用

四、Linux脚本使用及LMDB文件生成

五、带你设计一个Caffe网络,用于分类任务

下面:

使用pycaffe生成solver配置

使用pycaffe生成caffe测试网络和训练网络

数据集下载

# demoCaffe

数据集下载,cifar mnist:

百度云盘:

链接: https://pan.baidu.com/s/1bHFQUz7Q6BMBZv25AhsXKQ 密码: dva9

链接: https://pan.baidu.com/s/1rPRjf2hanlYYjBQQDmIjNQ 密码: 5nhv

1.
lmdb数据制作:

手动实现: https://blog.csdn.net/yx2017/article/details/72953537

https://www.jianshu.com/p/9d7ed35960cb

代码实现:https://www.cnblogs.com/leemo-o/p/4990021.html

https://www.jianshu.com/p/ef84715e0fdc

以下仅供对比阅读:

demo_lmdb.py:  生成lmdb格式数据

  1. import lmdb
  2. import numpy as np
  3. import cv2
  4. import caffe
  5. from caffe.proto import caffe_pb2
  6. def write():
  7. # basic setting
  8. 10.     lmdb_file = 'lmdb_data'
  9. 11.     batch_size = 256
  10. 12.
  11. 13.
  12. 14.     lmdb_env = lmdb.open(lmdb_file, map_size =
    int(1e12))
  13. 15.
  14. 16.     lmdb_txn = lmdb_env.begin(write = True)
  15. 17.
  16. 18.     for x in range(batch_size):
  17. 19.         data = np.ones((3, 64, 64), np.uint8)
  18. 20.         label = x
  19. 21.
  20. 22.         datum =
    caffe.io.array_to_datum(data,label)
  21. 23.         keystr = "{:0>8d}".format(x)
  22. 24.
  23. 25.         lmdb_txn.put(keystr,
    datum.SerializeToString())
  24. 26.
  25. 27.     lmdb_txn.commit()
  26. 28.

29. def read():

  1. 30.     lmdb_env = lmdb.open('lmdb_data')
  2. 31.     lmdb_txt = lmdb_env.begin()
  3. 32.
  4. 33.     datum = caffe_pb2.Datum()
  5. 34.
  6. 35.     for key, value in lmdb_txt.cursor():
  7. 36.
  8. 37.         datum.ParseFromString(value)
  9. 38.
  10. 39.         label = datum.label
  11. 40.
  12. 41.         data = caffe.io.datum_to_array(datum)
  13. 42.
  14. 43.         print(label)
  15. 44.         print(data)
  16. 45.
  17. 46.

47. if __name__ == '__main__':

  1. 48.     write()
  2. 49.     read()

demo_create_solver.py:  生成solver配置文件

  1. from caffe.proto import caffe_pb2
  2. s =
    caffe_pb2.SolverParameter()
  3. s.train_net = "train.prototxt"
  4. s.test_net.append("test.prototxt")
  5. s.test_interval = 100
  6. s.test_iter.append(10)
  7. 10.

11. s.max_iter = 1000

  1. 12.

13. s.base_lr = 0.1

  1. 14.

15. s.weight_decay = 5e-4

  1. 16.

17. s.lr_policy = "step"

  1. 18.

19. s.display = 10

  1. 20.

21. s.snapshot = 10

  1. 22.

23. s.snapshot_prefix = "model"

  1. 24.

25. s.type = "SGD"

  1. 26.

27. s.solver_mode =
caffe_pb2.SolverParameter.GPU

  1. 28.

29. with open("net/s.prototxt", "w") as f:

  1. 30.     f.write(str(s))
  2. 31.
  3. 32.
  4. 33.
  5. 34.

结果如下

  1. train_net: "/home/kuan/PycharmProjects/demo_cnn_net/net/train.prototxt"
  2. test_net: "/home/kuan/PycharmProjects/demo_cnn_net/net/test.prototxt"
  3. test_iter: 1000
  4. test_interval: 100
  5. base_lr: 0.10000000149
  6. display: 100
  7. max_iter: 100000
  8. lr_policy: "step"
  9. weight_decay: 0.000500000023749

10. snapshot: 100

11. snapshot_prefix: "/home/kuan/PycharmProjects/demo_cnn_net/cnn_model/mnist/lenet/"

12. solver_mode: GPU

13. type: "SGD"

demo_creat_net.py:    创建网络

  1. import caffe
  2. def create_net():
  3. net = caffe.NetSpec()
  4. net.data, net.label =
    caffe.layers.Data(source="data.lmdb",
  5. backend=caffe.params.Data.LMDB,
  6. batch_size=32,
  7. ntop=2,  #数据层数据个数,分别为data,label
  8. 10.                                             transform_param=dict(crop_size=40, mirror=True)
  9. 11.                                             )
  10. 12.
  11. 13.     net.conv1 =
    caffe.layers.Convolution(net.data, num_output=20, kernel_size=5,
  12. 14.                                          weight_filler={"type": "xavier"},
  13. 15.                                          bias_filler={"type":"xavier"})  #卷积核参数
  14. 16.
  15. 17.     net.relu1 = caffe.layers.ReLU(net.conv1,
    in_place=True)
  16. 18.
  17. 19.     net.pool1 = caffe.layers.Pooling(net.relu1,
    pool=caffe.params.Pooling.MAX,
  18. 20.                                      kernel_size=3, stride=2)
  19. 21.
  20. 22.     net.conv2 =
    caffe.layers.Convolution(net.pool1, num_output=32, kernel_size=3,
  21. 23.                                          pad=1,
  22. 24.                                          weight_filler={"type": "xavier"},
  23. 25.                                          bias_filler={"type": "xavier"})
  24. 26.
  25. 27.     net.relu2 = caffe.layers.ReLU(net.conv2,
    in_place=True)
  26. 28.
  27. 29.     net.pool2 = caffe.layers.Pooling(net.relu2,
    pool=caffe.params.Pooling.MAX,
  28. 30.                                      kernel_size=3, stride=2)
  29. 31.     #下面为全连接层
  30. 32.     net.fc3 =
    caffe.layers.InnerProduct(net.pool2, num_output=1024,
    weight_filler=dict(type='xavier'))
  31. 33.
  32. 34.     net.relu3 = caffe.layers.ReLU(net.fc3,
    in_place=True)
  33. 35.
  34. 36.     ##drop
  35. 37.     net.drop = caffe.layers.Dropout(net.relu3,
    dropout_param=dict(dropout_ratio=0.5))
  36. 38.
  37. 39.     net.fc4 =
    caffe.layers.InnerProduct(net.drop, num_output=10,
    weight_filler=dict(type='xavier'))
  38. 40.
  39. 41.     net.loss =
    caffe.layers.SoftmaxWithLoss(net.fc4, net.label)
  40. 42.
  41. 43.     with open("net/tt.prototxt", 'w') as f:
  42. 44.         f.write(str(net.to_proto()))
  43. 45.
  44. 46.

47. if __name__ == '__main__':

  1. 48.     create_net()

生成结果如下

  1. layer {
  2. name: "data"
  3. type: "Data"
  4. top: "data"
  5. top: "label"
  6. transform_param {
  7. mirror: true
  8. crop_size: 40
  9. }
  10. 10.   data_param {
  11. 11.     source: "/home/kuan/PycharmProjects/demo_cnn_net/lmdb_data"
  12. 12.     batch_size: 32
  13. 13.     backend: LMDB
  14. 14.   }

15. }

16. layer {

  1. 17.   name: "conv1"
  2. 18.   type: "Convolution"
  3. 19.   bottom: "data"
  4. 20.   top: "conv1"
  5. 21.   convolution_param {
  6. 22.     num_output: 20
  7. 23.     kernel_size: 5
  8. 24.     weight_filler {
  9. 25.       type: "xavier"
  10. 26.     }
  11. 27.     bias_filler {
  12. 28.       type: "xavier"
  13. 29.     }
  14. 30.   }

31. }

32. layer {

  1. 33.   name: "relu1"
  2. 34.   type: "ReLU"
  3. 35.   bottom: "conv1"
  4. 36.   top: "conv1"

37. }

38. layer {

  1. 39.   name: "pool1"
  2. 40.   type: "Pooling"
  3. 41.   bottom: "conv1"
  4. 42.   top: "pool1"
  5. 43.   pooling_param {
  6. 44.     pool: MAX
  7. 45.     kernel_size: 3
  8. 46.     stride: 2
  9. 47.   }

48. }

49. layer {

  1. 50.   name: "conv2"
  2. 51.   type: "Convolution"
  3. 52.   bottom: "pool1"
  4. 53.   top: "conv2"
  5. 54.   convolution_param {
  6. 55.     num_output: 32
  7. 56.     pad: 1
  8. 57.     kernel_size: 3
  9. 58.     weight_filler {
  10. 59.       type: "xavier"
  11. 60.     }
  12. 61.     bias_filler {
  13. 62.       type: "xavier"
  14. 63.     }
  15. 64.   }

65. }

66. layer {

  1. 67.   name: "relu2"
  2. 68.   type: "ReLU"
  3. 69.   bottom: "conv2"
  4. 70.   top: "conv2"

71. }

72. layer {

  1. 73.   name: "pool2"
  2. 74.   type: "Pooling"
  3. 75.   bottom: "conv2"
  4. 76.   top: "pool2"
  5. 77.   pooling_param {
  6. 78.     pool: MAX
  7. 79.     kernel_size: 3
  8. 80.     stride: 2
  9. 81.   }

82. }

83. layer {

  1. 84.   name: "fc3"
  2. 85.   type: "InnerProduct"
  3. 86.   bottom: "pool2"
  4. 87.   top: "fc3"
  5. 88.   inner_product_param {
  6. 89.     num_output: 1024
  7. 90.     weight_filler {
  8. 91.       type: "xavier"
  9. 92.     }
  10. 93.   }

94. }

95. layer {

  1. 96.   name: "relu3"
  2. 97.   type: "ReLU"
  3. 98.   bottom: "fc3"
  4. 99.   top: "fc3"
  5. }
  6. layer {
  7. name: "drop"
  8. type: "Dropout"
  9. bottom: "fc3"
  10. top: "drop"
  11. dropout_param {
  12. dropout_ratio: 0.5
  13. }
  14. }
  15. layer {
  16. name: "fc4"
  17. type: "InnerProduct"
  18. bottom: "drop"
  19. top: "fc4"
  20. inner_product_param {
  21. num_output: 10
  22. weight_filler {
  23. type: "xavier"
  24. }
  25. }
  26. }
  27. layer {
  28. name: "loss"
  29. type: "SoftmaxWithLoss"
  30. bottom: "fc4"
  31. bottom: "label"
  32. top: "loss"
  33. }

demo_train.py训练网络:

  1. import sys
  2. sys.path.append('/home/kuan/AM-softmax_caffe/python')
  3. import caffe
  4. solver =
    caffe.SGDSolver("/home/kuan/PycharmProjects/demo_cnn_net/cnn_net/alexnet/solver.prototxt")
  5. solver.solve()

demo_test.py:测试网络

  1. import sys
  2. sys.path.append('/home/kuan/AM-softmax_caffe/python')
  3. import caffe
  4. import numpy as np
  5. ##caffemodel
    deploy.prototxt
  6. deploy = "/home/kuan/PycharmProjects/demo_cnn_net/cnn_net/alexnet/deploy.prototxt"

10. model = "/home/kuan/PycharmProjects/demo_cnn_net/cnn_model/cifar/alexnet/alexnet_iter_110.caffemodel"

  1. 11.

12. net =
caffe.Net(deploy, model, caffe.TEST)

  1. 13.
  2. 14.

15. net.blobs["data"].data[...] =
np.ones((3,32,32),np.uint8)

  1. 16.

17. net.forward()

  1. 18.

19. prob = net.blobs["prob"].data[0]

  1. 20.

21. print(prob)

  1. 22.

Caffe实现概述的更多相关文章

  1. 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练

    原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...

  2. SSD(single shot multibox detector)算法及Caffe代码详解[转]

    转自:AI之路 这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合. 论文:SSD single shot multibox det ...

  3. 上手Caffe(二)

    @author:oneBite本文简述如何在windows环境下,运行caffe的“hello world”例程体会适用caffe的流程:转换输入数据格式>在solver.prototxt中配置 ...

  4. 2.caffe初解

    http://www.cnblogs.com/nwpuxuezha/p/4302024.html 原文链接:caffe.berkeleyvision.org/tutorial/layers.html ...

  5. Caffe::Snapshot的运行过程

    Snapshot的存储 概述 Snapshot的存储格式有两种,分别是BINARYPROTO格式和hdf5格式.BINARYPROTO是一种二进制文件,并且可以通过修改shapshot_format来 ...

  6. 我的Keras使用总结(1)——Keras概述与常见问题整理

    今天整理了自己所写的关于Keras的博客,有没发布的,有发布的,但是整体来说是有点乱的.上周有空,认真看了一周Keras的中文文档,稍有心得,整理于此.这里附上Keras官网地址: Keras英文文档 ...

  7. 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...

  8. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  9. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

随机推荐

  1. 使用netty实现socks5协议

    一.socks5协议简介 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递. SOCKS是"SOCKetS"的缩写[注 1]. 当防火墙后的客户端要访问外 ...

  2. 【手打】coredns单台使用

    目录: coredns介绍 coredns安装 corendns配置 coredns介绍 CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师 ...

  3. 逆向 ctype.h 函数库 isalnum、iscntrl、islower、isxdigit、tolower 函数

    0x01 isalnum 函数 函数原型:int isalnum(int c); 函数功能:检查所传的字符是否是字母和数字 动态链接库:ucrtbase.dll C\C++ 实现: #define _ ...

  4. Linux-鸟菜-5-文件权限

    Linux-鸟菜-5-文件权限 Linux作为多用户多任务的操作系统,文件权限以及目录配置相对于Windows的话应该更重要更细致一些.Linux一般将文件可存取的身份分为三个类别,分别是owner/ ...

  5. 2020腾讯Android岗初级到高级面试真题收录解析

    前言 马上就要到金九银十面试季了,需要找工作的小伙伴可以开始刷题复习了. 今天给大家分享的是博主腾讯面试的面经以及对腾讯2020上半年Android开发岗面经真题收录,希望可以帮助到大家,喜欢的朋友可 ...

  6. STL实现的底层数据结构简介

    STL实现的底层数据结构简介 C++ STL 的实现: 1.vector  底层数据结构为数组 ,支持快速随机访问 2.list    底层数据结构为双向链表,支持快速增删 3.deque   底层数 ...

  7. UVA OJ 623 500!

    500!  In these days you can more and more often happen to see programs which perform some useful cal ...

  8. 企业是否可以用CRM做邮件营销?

    最近总有一些从事外贸,跨境电商的朋友问小Z:"我的企业能用CRM做邮件营销吗?" 我回答:"能,Zoho CRM系统不但能用来发营销邮件,还发得聪明.发得到位." ...

  9. java基础——if和Swith的应用

    顺序结构 java的基本结构就是顺序结构,除非特别说明,否则就按照一句一句的执行 它是任何一个算法都离不开的基本算法结构 选择结构 if单选择 if双选择 if多选择 嵌套的if结构 switch多选 ...

  10. 一文搞懂:java中的VO、PO、BO、DAO、POJO

    针对java工程里的各种带O的对象,进行分析,了解各自的作用. PO:persistent object,持久对象.与数据库里表字段一一对应.PO是一些属性,以及set和get方法组成.一般情况下,一 ...