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. 一个DDOS病毒的分析(二)

    一.基本信息 样本名称:hra33.dll或者lpk.dll 样本大小: 66560 字节 文件类型:Win32的dll文件 病毒名称:Dropped:Generic.ServStart.A3D47B ...

  2. POJ1679判断最小生成树的唯一性

    题意:      判断最小树是否唯一. 思路:      我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生 ...

  3. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  4. [CTF]栅栏密码

    [CTF]栅栏密码 ---------------------  作者:adversity`  来源:CSDN  原文:https://blog.csdn.net/qq_40836553/articl ...

  5. Day008 数组的使用

    数组的使用 For-Each循环 数组作方法入参 数组作返回值 用普通for循环遍历 int[] arrays={1,2,3,4,5}; //打印全部的数组元素 for (int i = 0; i & ...

  6. Linux防火墙放行端口

    添加放行端口 firewall-cmd --zone=public --add-port=端口号/tcp --permanent 重启防火墙 systemctl restart firewalld.s ...

  7. Gridea博客无法载入CSS样式的解决办法

    今日在使用Gridea客户端更新博客的过程中,推送到远端仓库后内容显示正常,但是无法载入主题样式,就是没有载入CSS样式,折腾了一下午在搞懂问题出在哪里了,下面说一下自己的解决思路. 问题描述 首先, ...

  8. mysql知识点归纳-执行计划篇

    愿历尽千帆,归来仍是少年 缘由: 优化sql,顾此记录一下,以便温习之用. 前置: sql执行过程:客户端 -> 连接器 -> 分析器 (或查询缓存 - > end) -> 优 ...

  9. 从零搭建springboot服务01-初始搭建、内嵌swagger

    愿历尽千帆,归来仍是少年 1.基础springBoot框架 编辑工具:IDEA.jdk1.8.tomcat8.maven3.3.9 编码格式:UTF-8 参考文献:https://www.cnblog ...

  10. 25.Qt Quick QML-500行代码实现"合成大西瓜游戏"

    "合成大西瓜"这个游戏在年前很火热,还上过微博热搜,最近便玩了一阵还挺有意思的,所以研究了一下小球碰撞原理,自己亲自手写碰撞算法来实现一个合成大西瓜游戏.并支持任意大小布局,你想玩 ...