caffe中python接口的使用

时间:2022-09-08 22:15:54

下面是基于我自己的接口,我是用来分类一维数据的,可能不具通用性:

(前提,你已经编译了caffe的python的接口)

添加 caffe塻块的搜索路径,当我们import caffe时,可以找到。

对于这一步,一般我们都会把 cafffe 模块的搜索路经永久地加到先加$PYTHONPATH中去,如可以把 export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH 写到 .bashrc中。而下面的做法,只是临时的做法哦;

improt sys
#sys.path为一个列表,用什么方法加入都好啊,我用insert直接插到首位
sys.path.insert(0, ‘caffe_python的路径,我的为~/down/caffe/python/')

设置使用的设备:

在用显卡并行运算算的时候,如果多显卡的时候,输入它们的序号表示使用哪一块卡,如果单显卡的话(比如我的笔记本电脑,应该都为0,表示第一块)。

caffe.set_device(0)
caffe.set_mode_gpu()
 
caffe.set_mode_cpu()    #使用caffe的GPU模式

设定网络的solver:

选中我们的solver_prototxt文件,里面就是设定了网络的训练次数啦,各参数的值啦等啦。

solver = None
#选用SGD算法来进行运算;
solver = caffe.SGDSolver('你的网络的lenet_solver.prototxt 文件‘)
# 执行完上面的语句以后,网络的相应的权值与偏置会根据我们的定义进行赋值的;

caffe中的数据保存及调用:

在caffe中,我们的网络可以分为训练网络与测试网络哦,训练网络用solver.net.blobs、solver.net.params;对面测试网络,用solver.test_nets[i].blobs、solver.test_nets[i].params(其中 i 表示 第几个测试网络,从0开始。例如,我们就一个测试网络的话,我们就写为:solver.test_nets[0].blobs。)

下面,我们以训练网络为例子,看看caffe中的数据的存储与调用方法。 caffe的 数据都是放在 blobs块中的,我觉得这个好牛逼啊,太统一了。

solver.net.blobs 里面放的为每一层layer输出的data、对输出结点求的导数 diff,另外还有几个如count等参数,不过我们基本用不到的,不要关注一下data数据就可以了。

#solver.net.blobs为一个字典的数据类型,里面的key值为各个layer 的名字,value为caffe的blob块;
 
solver.net.blobs
#输出:
rderedDict([('data', <caffe._caffe.Blob at 0x7f7bde968398>),
('label', <caffe._caffe.Blob at 0x7f7bde968488>),
('conv1', <caffe._caffe.Blob at 0x7f7bde968578>),
('pool1', <caffe._caffe.Blob at 0x7f7bde968e60>),
('conv2', <caffe._caffe.Blob at 0x7f7bde9686e0>),
('pool2', <caffe._caffe.Blob at 0x7f7bde968cf8>),
('ip1', <caffe._caffe.Blob at 0x7f7bde968c80>),
('ip2', <caffe._caffe.Blob at 0x7f7bde968c08>),
('loss', <caffe._caffe.Blob at 0x7f7bde968b90>)]) #我们可以访问Blob块里的内容了,通过看Blob块的源码你会发现里面有data, diff,count等内容的。
#我们以conv1层为例子,我们访问 conv1的输出的数据,可以通过下面的语句:
solver.net.blobs['data'].data      
solver.net.blobs['data'].diff  
#如果想看它们的数据结构,可以通过下面的语句得到:
solver.net.blobs['data'].data.shape
solver.net.blobs['data'].diff.shape
#另外,还可以通过reshape()transpose()等操作对它们变形,应该是对数组的操作之类的吧。
 

solver.net.params为一个字典的数据类型,里面放的是与连接的权值及偏置相关的数据,如:data(表示权值的大小),diff(对于权值的导数),还有 count 之类的,我们只关注一个 data 就可以了吧。

solver.net.params[网络的名字][0]

#solver.net.params为一个字典的数据类型,key值为layer 的名字,value为caffe的blob块的容器哦;
solver.net.forward()
#输出为:
solver.net.params
orderedDict([ ('conv1', <caffe._caffe.BlobVec at 0x7f7bffd68578>),
('conv2', <caffe._caffe.BlobVec at 0x7f7bde9ff6e0>),
('ip1', <caffe._caffe.BlobVec at 0x7f7bde968f80>),
('ip2', <caffe._caffe.BlobVec at 0x7f7bde968408>)])
#下面,我们可以访问Blob块里的内容了。#们以conv1层为例子,具体如下:
 
#sover.net.params['conv1'][0]里面放是与连接权值相关的数据;可以通过下面方式访问:
solver.net.params['conv1'][0].data  
solver.net.params['conv1'][0].diff
#solver.net.params['conv1'][1]里面放的是与偏置相关的的值、导数等;可以通过下面方式访问:
solver.net.params['conv1'][1].data 
solver.net.params['conv1'][1].diff
 
#同样,我们可以还可以通过它们进行 shape()、reshape()、transpose()等操作

前向传播与反向传播

进行一次前向传播:使用 solver.net.forward或 solver.test_nets[i].forward 语句: 它干了点什么呢?它把数据从输入层到最后的输出层传播了一个遍,把相应的每一层网络的输出值赋于blobs,网络输入的的数据个数为你的net的定义文件里的patch_size的大小。

#训练数据作为输入,进行一次前向传播:
solver.net.forward()
 
#假如有300个数据,我们的patch_size的大小为100,那么:
solver.net.forward()    #数据为1-100;
solver.net.forward()    #数据为101-200
solver.net.forward()    #数据为201-300
solver.net.forward()    #数据为1-100
#另外,我们可以设置forward开始的地方,如下面所示:
solver.net.forward(start ='conv1')          #表示从conv1开始,这样的话,data层这不用传用新的数据了。

进行反向传播:使用:solver.net.forward,基本是都是我们的训练网络会进行反向传播的。反向传播做了点什么事呢?把会求出相应的导数啦,即blobs块里面的diff变量。

记住:它不会去更新权值与偏置的;

# 进行一次反向传播
solver.net.forward()

进行完整的一次计算(minibatch):solver.step(1):(包括数据的前向传播,误差反向传播,以及网络权值的update)

#当我们完整地进行一次权值更新地时候,我们可以调用下面的语句
#把意思就是:训练网络进行一次正向与反向传播,并进行更新权值与偏置;
sover.step(n)表示进行n次训练。 # 表示进行n次训练。
sover.step(n)

注意:当我们用python接口运行caffe时,我们就可以控制它的Loop过程了,然后跟踪很多变量,干点自己想干的事啦等。 除此之外,与直接用caffe的C++代码且没有什么差别,并且在sover prototxt定义的相关操作都会进行的,如logging, snapshot, test等。

2017年3月10日添加,有点乱,没有整理:

 
 

solver.solve(), 会进行完整的梯度训练,直至在solver中规定的max_iter.

用 caffe_root/python/draw_net.py 画出 网络的结构图:

第一点:需要安装:graphviz, 可以直接通过 sudo apt-get install graphviz,安装就可以了。

第二点:安装pydot 模块,可以通过 pip pydot安装,注意:pydot 不支持python3, 所以,我们也可以安装 pydotplus来代替, pip install pydotplus;

现在,就可以运行 draw_net.py 画图了,例子如下:

./draw_net.py my_net.prototxt my_picture.png

caffe中,在训练过程中,关于进行snapshot的相关问题:

除了我们可以在solver.prototxt 文件里定义相关的snapshot外,我们呢,也可以在训练过程中,进行手动 保存;在进行snapshot时,会保存下面两个文件:

.caffemodel :

The caffemodel, which is output at a specified interval while training, is a binary contains the current state of the weights for each layer of the network.

.solverstate:

The solverstate, which is generated alongside, is a binary contains the information required to continue training the model from where it last stopped.

方法一: solver.snapshot(), 可以在训练过程中,手动进行snapshot.,它会保存 .caffenodel与 .solverstate两个文件;常用于进行恢复训练过程;(保存的路径为solver.prototxt 文件里面定义的路径)

方法二:net.save(), 它只会保存一下 .caffemodel文件,常用于进行测试时。 使用方法:如, net. save(‘my_path/my_weights.caffemodel’);

关于在pycaffe中载入solver.ptototxt 文件的问题:

两个方法:

第一,当使用 caffe.SGDSolver(‘solver文件’)时,无论你的solver文件中定义的solver_type是什么,都会用SGD方法;

第二,solver = caffe.get_solver(‘里面是solver.prototxt文件’);

怎么导入网络以及它的相关权值进行测试呢,可以这么做:

第一,直接进行导入权值进行测试时,我们可能用到:
net = caffe.Net(网络的定义文件, caffemodel的权值保存文件,选择:caffe.TEST)  ,因为一个.prototxt文件中可以即定义train,也定义test,对应的caffe.TRAIN与caffe.TEST.
如一个例子:
net = caffe.Net('models/bvlc_reference_caffenet/deploy.prototxt',
'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel',
caffe.TEST)

第二,在预训练的基础上再训练网络时,我们不仅仅导入了预训练的权值,还导入 solver.prototxt

如果我们要在预训练的基础上再用新定义的solver.prototxt文件训练我们的网络,我们可以这么做:(区别就是我们不会随机初始化权值,而是直接导入pretrained的权值)

my_solver = caffe.get_solver(net_solver.prototxt)

my_solver.net.copy_from(pretraind.caffemodel)

2017年8月14日补:

solver.iter : 这是一个变量,它会标识了迭代次数;

caffe中python接口的使用

caffe中python接口的使用的更多相关文章

  1. 机器学习caffe环境搭建——redhat7&period;1和caffe的python接口编译

    相信看这篇文章的都知道caffe是干嘛的了,无非就是深度学习.神经网络.计算机视觉.人工智能这些,这个我就不多介绍了,下面说说我的安装过程即遇到的问题,当然还有解决方法. 说下我的环境:1>虚拟 ...

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

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

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

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

  4. Windows&plus;Caffe&plus;VS2013&plus;python接口配置过程

    前段时间在笔记本上配置了Caffe框架,中间过程曲曲折折,但由于懒没有将详细过程总结下来,这两天又在一台配置较高的台式机上配置了Caffe,配置时便非常后悔当初没有写到博客中去,现已配置好Caffe, ...

  5. ubuntu16&period;04 安装caffe以及python接口

    http://blog.csdn.net/qq_25073253/article/details/72571714http://blog.csdn.net/greed7480/article/deta ...

  6. 【caffe】Caffe的Python接口-官方教程-00-classification-详细说明(含代码)

    00-classification 主要讲的是如何利用caffenet(与Alex-net稍稍不同的模型)对一张图片进行分类(基于imagenet的1000个类别) 先说说教程到底在哪(反正我是找了半 ...

  7. caffe 中 python 数据层

    caffe中大多数层用C++写成. 但是对于自己数据的输入要写对应的输入层,比如你要去图像中的一部分,不能用LMDB,或者你的label 需要特殊的标记. 这时候就需要用python 写一个输入层. ...

  8. Caffe&colon; Caffe的Python接口

    官方参考:http://caffe.berkeleyvision.org/installation.html 官方介绍是这样的: Python The main requirements are nu ...

  9. caffe的python接口学习(8):caffemodel中的参数及特征的抽取

    如果用公式  y=f(wx+b) 来表示整个运算过程的话,那么w和b就是我们需要训练的东西,w称为权值,在cnn中也可以叫做卷积核(filter),b是偏置项.f是激活函数,有sigmoid.relu ...

随机推荐

  1. Greenplum查询计划分析

    这里对查询计划的学习主要是对TPC-H中Query2的分析. 1.Query的查询语句 select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_a ...

  2. ASP&period;NET 单点登陆

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  3. poj1966 求顶点连通度

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4563   Accepted: 2118 ...

  4. svn服务器无法访问时检查几个文件:

    出现该问题基本都是三个配置文件的问题,下面把这个文件列出来. svnserve.conf:[general]anon-access = readauth-access = writepassword- ...

  5. 反向Ajax,实现服务器向客户端推送消息

    反向Ajax的基本概念是客户端不必从服务器获取信息,服务器会把相关信息直接推送到客户端.这样做的目的是解决Ajax传统Web模型所带来的一个限制:实时信息很难从技术上解决.原因是,客户端必须联系服务器 ...

  6. 一个由INode节点爆满引起的业务故障

    一个由INode节点爆满引起的业务故障 http://2358205.blog.51cto.com/2348205/1747951 好久没有写博文了,今天周六,分享一下刚刚处理完的一个小故障 现象描述 ...

  7. 添加远程链接MySQL的权限

    mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’; 权限1,权限2,…权限n代表select,ins ...

  8. Go语言AST尝试

    Go语言有很多工具, goimports用于package的自动导入或者删除, golint用于检查源码中不符合Go coding style的地方, 比如全名,注释等. 还有其它工具如gorenam ...

  9. 编译Boost 详细步骤 适用 VC6 VS2003 VS2005 VS2008 VS2010

    vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库 ...

  10. bugfree,CDbConnection 无法开启数据库连线&colon; SQLSTATE&lbrack;HY000&rsqb; &lbrack;2003&rsqb; Can&&num;39&semi;t connect to MySQL server on &&num;39&semi;192&period;168&period;0&period;99&&num;39&semi; &lpar;4&rpar;

    安装bugfree后,访问报错:CDbConnection 无法开启数据库连线: SQLSTATE[HY000] [2003] Can't connect to MySQL server on '19 ...