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: 训练或者微调一个网络 ...
随机推荐
- P3805 【模版】manacher算法
题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...
- [原创]C++带空格字符串的输入问题
字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; cin ...
- Java代码运用及算法思路养成——用*号输出形状
简单的了解了一些循环算法后,尝试用循环算法,输出形状图形 例1矩形与平行四边形的比较(可以看做矩形的每一行在输出前都输出了矩形长度数量-1的空格数量并且依次递减) 例2三角形(三角形可看做半个矩形,考 ...
- Flask框架函数
title: flask学习笔记 subtitle: 1. flask框架函数 date: 2018-12-14 10:17:28 --- Flask学习 学习Miguel Grinberg的2017 ...
- 使用dom4j生成word的方法
http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...
- python面向对象三大特性之一封装
一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...
- LINUX 中 VSFTPD安裝
VSFTPD 简写:vsftpd是very secure FTP daemon 的缩写,是一个完全免费的,开源代码的ftp服务器软件 特点:vsftpd是一款在LINUX发行版中最受推崇的FTP服务器 ...
- PHP学习总结(3)——PHP入门篇之PHP的echo语句
Echo语句 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来). 如下代码: <?php echo "Hello world!";?> 注意ech ...
- PatentTips - Uncore thermal management
BACKGROUND The field of invention relates to the computer sciences, generally, and, more specificall ...
- 工具-docker01