caffe学习笔记1
博客
http://blog.csdn.net/seven_first/article/details/47378697
https://zhuanlan.zhihu.com/p/25127756?refer=xiaoleimlnote
https://github.com/BUPTLdy/Caffe_Code_Analysis/tree/master/
学习计划
Caffe运行主要流程
caffe.cpp
// A simple registry for caffe commands.
typedef int (*BrewFunction)();
typedef std::map<caffe::string, BrewFunction> BrewMap;
BrewMap g_brew_map;
#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
public: /* NOLINT */ \
__Registerer_##func() { \
g_brew_map[#func] = &func; \
} \
}; \
__Registerer_##func g_registerer_##func; \
}
- typedef int (*BrewFunction)()
函数指针:可用于处理一些参数和返回值一致,但是功能不一样一组函数。
本示例:定义了一组函数指针,函数参数为(),但是返回值为int这样一组函数指针族。 - typedef std::map<caffe::string, BrewFunction> BrewMap
定义BrewMap为一个map,key为string,value为函数指针(参数为(),返回为int)。 - #define RegisterBrewFunction(func)
该宏命令完成一次注册的初始化操作; 其中在宏中#和##符号表示的意思如下: #:用来把参数转换成字符串;
##:用来连接前后两个参数。
以caffe中RegisterBrewFunction(train)为例,上面代码可转换为:
#define RegisterBrewFunction(train) \
namespace { \
class __Registerer_train { \
public: /* NOLINT */ \
__Registerer_train() { \
g_brew_map["train"] = &train; \
} \
}; \
__Registerer_train g_registerer_train; \
} //完成了全局变量的初始化操作
接来下看caffe.cpp里的main函数代码
int main(int argc, char** argv) {
// Print output to stderr (while still logging).
FLAGS_alsologtostderr = 1;
// Set version
gflags::SetVersionString(AS_STRING(CAFFE_VERSION));
// Usage message.
gflags::SetUsageMessage("command line brew\n"
"usage: caffe <command> <args>\n\n"
"commands:\n"
" train train or finetune a model\n"
" test score a model\n"
" device_query show GPU diagnostic information\n"
" time benchmark model execution time");
// Run tool or show usage.
caffe::GlobalInit(&argc, &argv);
if (argc == 2) {
#ifdef WITH_PYTHON_LAYER
try {
#endif
return GetBrewFunction(caffe::string(argv[1]))();
#ifdef WITH_PYTHON_LAYER
} catch (bp::error_already_set) {
PyErr_Print();
return 1;
}
#endif
} else {
gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/caffe");
}
}
caffe控制台训练示例:caffe train --solver==*.prototxt
输入完全正确的情况下,函数首先进入:
- return GetBrewFunction(caffe::string(argv[1]))();
static BrewFunction GetBrewFunction(const caffe::string& name) {
if (g_brew_map.count(name)) {
return g_brew_map[name];
} else {
LOG(ERROR) << "Available caffe actions:";
for (BrewMap::iterator it = g_brew_map.begin();
it != g_brew_map.end(); ++it) {
LOG(ERROR) << "\t" << it->first;
}
LOG(FATAL) << "Unknown action: " << name;
return NULL; // not reachable, just to suppress old compiler warnings.
}
}
总结:
- C++函数指针的应用;函数指针可用于解决 函数参数和返回值一致,但功能不一样的一群函数族
- 进入主函数前,通过全局变量注册函数的方法;
举例:
#include <iostream>
#include <map>
typedef int (*mathfunc)(int,int);
typedef std::map<std::string, mathfunc> BrepMap;
BrepMap g_brew_map;
#define RegisterMathFunc(func) \
namespace { \
class __Register_##func{ \
public: \
__Register_##func() { g_brew_map[#func] = &func;}};\
__Register_##func g_register_##func;}
int add(int a, int b){
return a+b;
}
RegisterMathFunc(add)
int sub(int a, int b){
return a-b;
}
RegisterMathFunc(sub)
int mul(int a, int b){
return a*b;
}
RegisterMathFunc(mul)
int main()
{
std::cout<< "number of register functions: " << g_brew_map.size() << std::endl;
std::string math_method = "add";
std::cout << "23 + 12 = " << g_brew_map[math_method](23,12) << std::endl;
return 1;
}
/*
*******result*******
number of register functions: 3
23 + 12 = 35
*/
caffe学习笔记1的更多相关文章
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...
- Caffe学习笔记(三):Caffe数据是如何输入和输出的?
Caffe学习笔记(三):Caffe数据是如何输入和输出的? Caffe中的数据流以Blobs进行传输,在<Caffe学习笔记(一):Caffe架构及其模型解析>中已经对Blobs进行了简 ...
- Caffe学习笔记(二):Caffe前传与反传、损失函数、调优
Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...
- Caffe学习笔记(一):Caffe架构及其模型解析
Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...
- Caffe学习笔记4图像特征进行可视化
Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...
- Caffe学习笔记3
Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...
- Caffe 学习笔记1
Caffe 学习笔记1 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和 ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- CAFFE学习笔记(五)用caffe跑自己的jpg数据
1 收集自己的数据 1-1 我的训练集与测试集的来源:表情包 由于网上一幅一幅图片下载非常麻烦,所以我干脆下载了两个eif表情包.同一个表情包里的图像都有很强的相似性,因此可以当成一类图像来使用.下载 ...
- CAFFE学习笔记(四)将自己的jpg数据转成lmdb格式
1 引言 1-1 以example_mnist为例,如何加载属于自己的测试集? 首先抛出一个问题:在example_mnist这个例子中,测试集是人家给好了的.那么如果我们想自己试着手写几个数字然后验 ...
随机推荐
- java第二章总结与感想
本章主要介绍Java程序设计环境,下面一节一节的记录: 2.1 安装java工具箱(JDK): 2.1.1, 下载JDK: 这一节主要介绍了以下知识点: (1)jdk的下载地址: (2)一些java术 ...
- 将jar包安装到本地repository中
mvn install:install-file -Dfile=G:/lcn_springboot2.0/tx-plugins-db-4.1.2.jar -DgroupId=com.codingapi ...
- 学习笔记CB008:词义消歧、有监督、无监督、语义角色标注、信息检索、TF-IDF、隐含语义索引模型
词义消歧,句子.篇章语义理解基础,必须解决.语言都有大量多种含义词汇.词义消歧,可通过机器学习方法解决.词义消歧有监督机器学习分类算法,判断词义所属分类.词义消歧无监督机器学习聚类算法,把词义聚成多类 ...
- React Native 开发环境搭建
1.安装 Python 2,不知道是否已支持 Python 3 2.安装 node,npm... 修改 npm 镜像,不建议使用 cnpm,cnpm 安装模块的路径与 npm 有差别 npm conf ...
- Java(原码、反码、补码和计算机存储格式)
原码:将一个整数,转换成二进制,就是其原码.如单字节的5的原码为:0000 0101:-5的原码为1000 0101. 反码:正数的反码就是其原码:负数的反码是将原码中,除符号位以外,每一位取反.如单 ...
- Foundations of Game Engine Development Volume 1 Mathematics (Eric Lengyel 著)
http://www.foundationsofgameenginedev.com/ Chapter1 Vectors and Matrices (已看) Chapter2 Transforms (已 ...
- Windows + Flask + Apache + wsgi踏坑总结
据前人踏坑经历,拷贝如下: 1. Apache,mod_wsgi和Python都必须用相同版本的C/C++编译器生成,要么都是32位的,要么都是64位的,不能混用. 2. Apache和mod_wsg ...
- 在已安装64位oracle的服务器安装32位客户端
应用场景:服务器操作系统是win2012 64位,原先安装了64位oracle12,后来系统增加导入excel的功能,网站必须启用32位兼容模式,这时候发现原有的页面打不开,提示: 试图加载格式不正确 ...
- Solr4.7.0连接Oracle
1.把Oracle的Jar包 例如:ojdbc14.jar 或其他版本 放到D:\apache-tomcat-7.0.57\webapps\solr\WEB-INF\lib下 2.然后在tomca ...
- python3学习笔记十(循环语句)
参考http://www.runoob.com/python3/python3-loop.html 循环语句 while循环 # !/usr/bin/env python3 n = 100 sum = ...