caffe.bin caffe的框架
最近打算看一看caffe实现的源码,因为发现好多工作都是基于改动网络来实现自己的的目的。比如变更目标函数以及网络结构,以实现图片风格转化或者达到更好的效果。
深度学习框架 https://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650325746&idx=1&sn=378e1adc20bb9f4e388e1bd648707026&chksm=f235a5f8c5422ceee84aa4dff2b5c025397e3a4217a7dcba252c2975dcba5cdac3e621bf16d8&mpshare=1&scene=1&srcid=1212R1BswFAT6Fk6wVXdI7Fb&pass_ticket=q%2B7V8do%2BkSgvBI1mFPt5tyOwcZQNfmKYM6zrf6DOq4U%3D#rd
caffe.bin
这个是我们在训练网络时用到的可执行文件,其对应的源码为,其中main()函数首先对输入参数进行解析,这里边用到了google的工具包gflags,参数会把linux下输入的 ./build/tools/caffe.bin train --solver=examples/mnist/lenet_solver.prototxt -gpu all
识别为两部分,./build/tools/caffe.bin和train,然后前面带”-“的自动识别为参数。之后在main()函数中调用GetBrewFunction()函数启动对应的函数(train,test,time),这些函数是通过RegisterBrewFunction()在编译中把指向其的指针保存到一个map结构中。
接着,在train()函数中,首先读取指定网络hyper parameters以及网络结构,这是由.proto格式的文件定义的,这是一种类似xml和json的数据交换格式,且google有对应的工具包来生成对应的处理函数以及类。 caffe::ReadSolverParamsFromTextFileOrDie(FLAGS_solver, &solver_param);
其中FLAGS_solver是.proto文件的地址,SolverParameter的定义在src/caffe/proto/caffe.proto中,在编译时,会产生一个caffe.pb.cc和caffe.pb.h文件,对应的就是其产生的类以及一些函数。在读取到这些参数后,开始设置GPU/CPU模式,然后调用 solver(caffe::SolverRegistry<float>::CreateSolver(solver_param));
函数初始化网络。
include/caffe/solver_factory.hpp
在上面调用的函数中,CreateSolver()函数是产生一个CreatorRegistry的对象,这是一个map结构,其key值是string,指定优化算法,value是一个指向Solver类对象的指针。这个函数在返回的时候,会调用Solver类的构造函数产生一个Solver类对象。然后上面的Solver类对象solver通过默认的拷贝构造函数产生这个solver对象。
src/caffe/solver.cpp
在Solver类的构造函数中,其会调用Init()函数,这个函数中会调用其两个成员函数InitTrainNet()和InitTestNets()。在Solver这个类中,有Net的类对象作为其成员变量,包括用于训练的网络net_和用于测试的网络test_nets_。在上面的两个函数内,这些对象会通过reset()函数复制由 Net(const NetParameter& param, const Net* root_net);
构造函数产生的Net类对象。
src/caffe/net.cpp
在Net类的构造函数中,会调用类成员函数 Init(const NetParameter& in_param);
其会首先对网络的每层做一次过滤FilterNet(),比如对于训练网络来说,accuracy网络层是不必要的,而起始的测试(训练)网络的输入层对训练(测试)网络来说是不必要的。接着网络调用在++src/caffe/util/insert_splits.cpp++中定义的InsertSplits()函数来根据情况产生一层网络。就是当网络层A的输出会作为网络层B,C的输入,那么通过InsertSplits()函数会产生一层split层,就是对共享输入的层,在这些层前面加入一层split(参考)。
之后网络开始根据层数的多少设置输入bottom和输出top的大小,它们是存放在vector容器中的blob数据格式,其定义在blob类中,此地按下不表。对于每一层,用一个for循环,设置层与层之间的连接,以及存放每层得到的残差的内存空间,哪些层需要后向传播,并统计内存消耗等。然后从后往前遍历一遍网络,统计哪些blobs会涉及到网络损失的计算。并且对于剩余的为处理分配的blobs,认定其为输出。最后可能某些层之间会共享w和b的权重以及方差,所以需要调用ShareWeights()函数开启一下,至此网络初始化完成。
caffe.bin caffe的框架的更多相关文章
- caffe.bin用法
$ ./build/tools/caffe.bin caffe.bin: command line brew usage: caffe <command><aegs> comm ...
- Caffe(卷积神经网络框架)介绍
Caffe(卷积神经网络框架)Caffe,全称Convolution Architecture For Feature Extraction caffe是一个清晰,可读性高,快速的深度学习框架.作者是 ...
- Caffe深度学习计算框架
Caffe | Deep Learning Framework是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 Yangqing Jia,目前在Google工作.Caffe是 ...
- caffe编译环境的错误:..build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/arena.h: 没有那个文件
在搭建caffe的环境时出现错误: .build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/aren ...
- caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录
You need to generate caffe.pb.h manually using protoc as follows. # In the directory you installed C ...
- caffe/proto/caffe.pb.h: No such file or director
caffe编译过程中遇到的为问题: fatal error: caffe/proto/caffe.pb.h: No such file or directory 解决方法: 用protoc从caffe ...
- 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)
01-learning-Lenet, 主要讲的是 如何用python写一个Lenet,以及用来对手写体数据进行分类(Mnist).从此教程可以知道如何用python写prototxt,知道如何单步训练 ...
- 【caffe】Caffe的Python接口-官方教程-00-classification-详细说明(含代码)
00-classification 主要讲的是如何利用caffenet(与Alex-net稍稍不同的模型)对一张图片进行分类(基于imagenet的1000个类别) 先说说教程到底在哪(反正我是找了半 ...
- caffe.exe (caffe.bin)用法回顾
caffe.bin :command line brew usage : caffe <command><args> commands: train: 训练或者微调一个网络 ...
随机推荐
- ajax获取跨域数据
1.效果图 2.源码 <%@ page contentType="text/html;charset=UTF-8" language="java" %&g ...
- Oracle数据库实例
数据库通常由两部分组成:数据库和数据库实例 数据库与实例的关系:数据库指的是:物理数据.数据库管理系统.即物理数据.内存.操作系统.用户访问Oracle都是访问一个实例,实例名指的是用于相应某个数据库 ...
- 【Arduino】基于arduino的激光坦克
历经了总共40来个小时,终于将这个激光坦克做好了. 这是本人的第一件像样的arduino作品. 用arduino为主控制器,配有32路舵机驱动板(在这有些大材小用了),以及一个wr703n的路由器当做 ...
- Hibernate中解决No Hibernate Session bound to thread问题
引用:忘了 首先是getCurrentSession()与openSession()的区别: 1.getCurrentSession()与openSession()的区别? * 采用getCurren ...
- (转) shiro权限框架详解04-shiro认证
http://blog.csdn.net/facekbook/article/details/54906635 shiro认证 本文介绍shiro的认证功能 认证流程 入门程序(用户登录和退出) 自定 ...
- Linux学习之路三:重要概念之Linux系统层次结构
上图来自Unix编程圣经<APUE>英文第二版.如图,处于最中心的是系统内核,负责机器硬件资源管理,进程管理等:shell,函数库(值得记住的是C标准函数库)和某些应用程序均直接构建于内核 ...
- HTML5新特性之文件和二进制数据的操作 Blob对象
HTML5新特性之文件和二进制数据的操作 1.Blob对象 2.FileList对象 3.File对象 4.FileReader 对象 5.URL对象
- List或者Map等对象创建语句放在循环外和循环内的区别
每一个对象创建的时候都会有一个ID,List对象在执行add方法的时候是将对象的引用放入List中. 如果把创建Map对象的语句放在外面,在将对象add到List中时,前后向List中add的对象都是 ...
- leetCode 929 独特的电子邮件地址
题目: 每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名. 除了小写字母 ...
- BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)
题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...