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: 训练或者微调一个网络 ...
随机推荐
- 利用a链接发送电子邮件
实例代码: <a href="mailto:name1@rapidtables.com?cc=name2@rapidtables.com&subject=你好%20我是&quo ...
- angular4搭建博客(一)
本文长期更新,未经运行,严禁转载. 博客(制作中) http://101.200.58.228/ Github https://github.com/Teloi/TEIndex 框架选择 Angula ...
- android黑科技系列——手机端破解神器MT的内购VIP功能破解教程
一.前言 在破解app的时候,我们现在几乎都是在PC端进行操作,但是之前bin神的MT管理器,可以在手机端直接破解,不过也有很大的局限性,但是对于一些简单的app破解没问题的.这个工具其实原理也很简单 ...
- RAP开发入门-开发笔记-bug记录
NamespaceException: The alias '/rwt-resources' is already in use 该bug发生的第一种情况是: This means that more ...
- 僧多粥少?还原 OpenStack 的真实“钱景”
原文链接:http://www.oschina.net/news/57994/openstack-income-analysis 451 Research发布了OpenStack的收入分析预测,指出O ...
- Jquery中的bind()方法的一点问题
bind()方法绑定事件的时候,第二个参数是函数,如果代码都写在函数里面,没有任何问题.但是,直接调用外部封装的函数需要注意,出错的例子: <!doctype html> <html ...
- Bootstrap 有一个 class 属性叫做 well,它的作用是为设定的列创造出一种视觉上的深度感
Bootstrap 有一个 class 属性叫做 well,它的作用是为设定的列创造出一种视觉上的深度感
- jQuery删除元素
remove() - 删除被选元素(及其子元素) empty() - 从被选元素中删除子元素 $("#div1").remove();删除被选元素及其子元素. $("#d ...
- 移动端开发-Day1
什么是Node? 它是一个基于Chrome v8引擎的js运行环境,采用高效轻量级的事件驱动,非阻塞式的I/O模型. 非阻塞I/O? 例如,当程序运行到某一函数时,调用后立即返回,不需要等待函数执行完 ...
- 【UOJ139】【UER #4】被删除的黑白树
题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...