Caffe实现概述
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格式数据
- import lmdb
- import numpy as np
- import cv2
- import caffe
- from caffe.proto import caffe_pb2
- def write():
- # basic setting
- 10. lmdb_file = 'lmdb_data'
- 11. batch_size = 256
- 12.
- 13.
- 14. lmdb_env = lmdb.open(lmdb_file, map_size =
int(1e12)) - 15.
- 16. lmdb_txn = lmdb_env.begin(write = True)
- 17.
- 18. for x in range(batch_size):
- 19. data = np.ones((3, 64, 64), np.uint8)
- 20. label = x
- 21.
- 22. datum =
caffe.io.array_to_datum(data,label) - 23. keystr = "{:0>8d}".format(x)
- 24.
- 25. lmdb_txn.put(keystr,
datum.SerializeToString()) - 26.
- 27. lmdb_txn.commit()
- 28.
29. def read():
- 30. lmdb_env = lmdb.open('lmdb_data')
- 31. lmdb_txt = lmdb_env.begin()
- 32.
- 33. datum = caffe_pb2.Datum()
- 34.
- 35. for key, value in lmdb_txt.cursor():
- 36.
- 37. datum.ParseFromString(value)
- 38.
- 39. label = datum.label
- 40.
- 41. data = caffe.io.datum_to_array(datum)
- 42.
- 43. print(label)
- 44. print(data)
- 45.
- 46.
47. if __name__ == '__main__':
- 48. write()
- 49. read()
demo_create_solver.py: 生成solver配置文件
- from caffe.proto import caffe_pb2
- s =
caffe_pb2.SolverParameter() - s.train_net = "train.prototxt"
- s.test_net.append("test.prototxt")
- s.test_interval = 100
- s.test_iter.append(10)
- 10.
11. s.max_iter = 1000
- 12.
13. s.base_lr = 0.1
- 14.
15. s.weight_decay = 5e-4
- 16.
17. s.lr_policy = "step"
- 18.
19. s.display = 10
- 20.
21. s.snapshot = 10
- 22.
23. s.snapshot_prefix = "model"
- 24.
25. s.type = "SGD"
- 26.
27. s.solver_mode =
caffe_pb2.SolverParameter.GPU
- 28.
29. with open("net/s.prototxt", "w") as f:
- 30. f.write(str(s))
- 31.
- 32.
- 33.
- 34.
结果如下:
- train_net: "/home/kuan/PycharmProjects/demo_cnn_net/net/train.prototxt"
- test_net: "/home/kuan/PycharmProjects/demo_cnn_net/net/test.prototxt"
- test_iter: 1000
- test_interval: 100
- base_lr: 0.10000000149
- display: 100
- max_iter: 100000
- lr_policy: "step"
- 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: 创建网络
- import caffe
- def create_net():
- net = caffe.NetSpec()
- net.data, net.label =
caffe.layers.Data(source="data.lmdb", - backend=caffe.params.Data.LMDB,
- batch_size=32,
- ntop=2, #数据层数据个数,分别为data,label
- 10. transform_param=dict(crop_size=40, mirror=True)
- 11. )
- 12.
- 13. net.conv1 =
caffe.layers.Convolution(net.data, num_output=20, kernel_size=5, - 14. weight_filler={"type": "xavier"},
- 15. bias_filler={"type":"xavier"}) #卷积核参数
- 16.
- 17. net.relu1 = caffe.layers.ReLU(net.conv1,
in_place=True) - 18.
- 19. net.pool1 = caffe.layers.Pooling(net.relu1,
pool=caffe.params.Pooling.MAX, - 20. kernel_size=3, stride=2)
- 21.
- 22. net.conv2 =
caffe.layers.Convolution(net.pool1, num_output=32, kernel_size=3, - 23. pad=1,
- 24. weight_filler={"type": "xavier"},
- 25. bias_filler={"type": "xavier"})
- 26.
- 27. net.relu2 = caffe.layers.ReLU(net.conv2,
in_place=True) - 28.
- 29. net.pool2 = caffe.layers.Pooling(net.relu2,
pool=caffe.params.Pooling.MAX, - 30. kernel_size=3, stride=2)
- 31. #下面为全连接层
- 32. net.fc3 =
caffe.layers.InnerProduct(net.pool2, num_output=1024,
weight_filler=dict(type='xavier')) - 33.
- 34. net.relu3 = caffe.layers.ReLU(net.fc3,
in_place=True) - 35.
- 36. ##drop
- 37. net.drop = caffe.layers.Dropout(net.relu3,
dropout_param=dict(dropout_ratio=0.5)) - 38.
- 39. net.fc4 =
caffe.layers.InnerProduct(net.drop, num_output=10,
weight_filler=dict(type='xavier')) - 40.
- 41. net.loss =
caffe.layers.SoftmaxWithLoss(net.fc4, net.label) - 42.
- 43. with open("net/tt.prototxt", 'w') as f:
- 44. f.write(str(net.to_proto()))
- 45.
- 46.
47. if __name__ == '__main__':
- 48. create_net()
生成结果如下:
- layer {
- name: "data"
- type: "Data"
- top: "data"
- top: "label"
- transform_param {
- mirror: true
- crop_size: 40
- }
- 10. data_param {
- 11. source: "/home/kuan/PycharmProjects/demo_cnn_net/lmdb_data"
- 12. batch_size: 32
- 13. backend: LMDB
- 14. }
15. }
16. layer {
- 17. name: "conv1"
- 18. type: "Convolution"
- 19. bottom: "data"
- 20. top: "conv1"
- 21. convolution_param {
- 22. num_output: 20
- 23. kernel_size: 5
- 24. weight_filler {
- 25. type: "xavier"
- 26. }
- 27. bias_filler {
- 28. type: "xavier"
- 29. }
- 30. }
31. }
32. layer {
- 33. name: "relu1"
- 34. type: "ReLU"
- 35. bottom: "conv1"
- 36. top: "conv1"
37. }
38. layer {
- 39. name: "pool1"
- 40. type: "Pooling"
- 41. bottom: "conv1"
- 42. top: "pool1"
- 43. pooling_param {
- 44. pool: MAX
- 45. kernel_size: 3
- 46. stride: 2
- 47. }
48. }
49. layer {
- 50. name: "conv2"
- 51. type: "Convolution"
- 52. bottom: "pool1"
- 53. top: "conv2"
- 54. convolution_param {
- 55. num_output: 32
- 56. pad: 1
- 57. kernel_size: 3
- 58. weight_filler {
- 59. type: "xavier"
- 60. }
- 61. bias_filler {
- 62. type: "xavier"
- 63. }
- 64. }
65. }
66. layer {
- 67. name: "relu2"
- 68. type: "ReLU"
- 69. bottom: "conv2"
- 70. top: "conv2"
71. }
72. layer {
- 73. name: "pool2"
- 74. type: "Pooling"
- 75. bottom: "conv2"
- 76. top: "pool2"
- 77. pooling_param {
- 78. pool: MAX
- 79. kernel_size: 3
- 80. stride: 2
- 81. }
82. }
83. layer {
- 84. name: "fc3"
- 85. type: "InnerProduct"
- 86. bottom: "pool2"
- 87. top: "fc3"
- 88. inner_product_param {
- 89. num_output: 1024
- 90. weight_filler {
- 91. type: "xavier"
- 92. }
- 93. }
94. }
95. layer {
- 96. name: "relu3"
- 97. type: "ReLU"
- 98. bottom: "fc3"
- 99. top: "fc3"
- }
- layer {
- name: "drop"
- type: "Dropout"
- bottom: "fc3"
- top: "drop"
- dropout_param {
- dropout_ratio: 0.5
- }
- }
- layer {
- name: "fc4"
- type: "InnerProduct"
- bottom: "drop"
- top: "fc4"
- inner_product_param {
- num_output: 10
- weight_filler {
- type: "xavier"
- }
- }
- }
- layer {
- name: "loss"
- type: "SoftmaxWithLoss"
- bottom: "fc4"
- bottom: "label"
- top: "loss"
- }
demo_train.py训练网络:
- import sys
- sys.path.append('/home/kuan/AM-softmax_caffe/python')
- import caffe
- solver =
caffe.SGDSolver("/home/kuan/PycharmProjects/demo_cnn_net/cnn_net/alexnet/solver.prototxt") - solver.solve()
demo_test.py:测试网络
- import sys
- sys.path.append('/home/kuan/AM-softmax_caffe/python')
- import caffe
- import numpy as np
- ##caffemodel
deploy.prototxt - 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"
- 11.
12. net =
caffe.Net(deploy, model, caffe.TEST)
- 13.
- 14.
15. net.blobs["data"].data[...] =
np.ones((3,32,32),np.uint8)
- 16.
17. net.forward()
- 18.
19. prob = net.blobs["prob"].data[0]
- 20.
21. print(prob)
- 22.
Caffe实现概述的更多相关文章
- 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练
原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...
- SSD(single shot multibox detector)算法及Caffe代码详解[转]
转自:AI之路 这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合. 论文:SSD single shot multibox det ...
- 上手Caffe(二)
@author:oneBite本文简述如何在windows环境下,运行caffe的“hello world”例程体会适用caffe的流程:转换输入数据格式>在solver.prototxt中配置 ...
- 2.caffe初解
http://www.cnblogs.com/nwpuxuezha/p/4302024.html 原文链接:caffe.berkeleyvision.org/tutorial/layers.html ...
- Caffe::Snapshot的运行过程
Snapshot的存储 概述 Snapshot的存储格式有两种,分别是BINARYPROTO格式和hdf5格式.BINARYPROTO是一种二进制文件,并且可以通过修改shapshot_format来 ...
- 我的Keras使用总结(1)——Keras概述与常见问题整理
今天整理了自己所写的关于Keras的博客,有没发布的,有发布的,但是整体来说是有点乱的.上周有空,认真看了一周Keras的中文文档,稍有心得,整理于此.这里附上Keras官网地址: Keras英文文档 ...
- 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet
常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...
- 【AR实验室】ARToolKit之概述篇
0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
随机推荐
- chrom里面的performance 颜色
在network里面,在network里面,在network里面(重要事件说三遍) : 1. HTML 文件为蓝色. 2. 脚本为黄色. 3. 样式表为紫色. 4. 媒体文件为绿色. 5. 其他资源为 ...
- RF-字符串拼接
贪婪截取(abcABC123edf123,左边截取abc,右边截取123,得到ABC123edf) 截取字符串 [Arguments] ${string} ${left} ${right} ${str ...
- hdu2067 简单dp或者记忆化搜索
题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu5251最小矩形覆盖
题意(中问题直接粘吧)矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input ...
- 【微信小程序】--bindtap参数传递,配合wx.previewImage实现多张缩略图预览
本文为原创随笔,纯属个人理解.如有错误,欢迎指出. 如需转载请注明出处 在微信小程序中预览图片分为 a.预览本地相册中的图片. b.预览某个wxml中的多张图片. 分析:实质其实是一样的.都是给wx. ...
- OO_Unit2_多线程电梯
CSDN博客链接 一.第一次作业 1.需求分析 单部多线程傻瓜调度(FAFS)电梯 2.实现方案 输入接口解析 类似于Scanner,我们使用ElevatorInput进行阻塞式读取(第一次作业较简单 ...
- [笔记] 《我的第一本c++书》
函数 优秀函数的五个要点 函数的返回值:直接返回和间接返回(指针) 在函数的入口处对参数有效性进行检验:if语句,断言(assert) 如果函数有返回值,不可返回一个指向函数体内局部对象的指针或引用 ...
- kvm总结复习
一.虚拟化概念 1.虚拟化技术:在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以 ...
- Kubernetes 部署微服务电商平台(16)
一.概念 微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事.这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整 ...
- k8s用 ConfigMap 管理配置(13)
一.ConfigMap介绍 Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ConfigMap 的创建和使用方 ...