Caffe2 手册(Intro Tutorial)[2]
Caffe2的相关概念
接下来你可以学到更多Caffe2中主要的概念,这些概念对理解和开发Caffe2相当重要。
Blobs and Workspace,Tensors
Caffe2中,数据是用blobs储存的。Blob只是内存中的一个数据块。大多数Blobs包含一个张量(tensor),可以理解为多维矩阵,在Python中,他们被转换为numpy 矩阵。
Workspace 保存着所有的Blobs。下面的例子展示了如何向Workspace中传递Blobs和取出他们。Workspace在你开始使用他们时,才进行初始化。
# Create random tensor of three dimensions
x = np.random.rand(4, 3, 2)
print(x)
print(x.shape)
workspace.FeedBlob("my_x", x)
x2 = workspace.FetchBlob("my_x")
print(x2)
Nets and Operators
Caffe2中最基本的对象是net,net可以说是一系列Operators的集合,每个Operator根据输入的blob输出一个或者多个blob。
下面我们将会创建一个超级简单的模型。他拥有如下部件:
- 一个全连接层
- 一个
Sigmoid激活函数和一个Softmax函数 - 一个交叉损失
直接构建网络是很厌烦的,所以最好使用Python接口的模型助手来构建网络。我们只需简单的调用CNNModelHelper,他就会帮我们创建两个想联系的网络。 - 一个用于初始化参数(
ref.init_net) - 一个用于实际训练(
ref.init_net)
# Create the input data
data = np.random.rand(16, 100).astype(np.float32)
# Create labels for the data as integers [0, 9].
label = (np.random.rand(16) * 10).astype(np.int32)
workspace.FeedBlob("data", data)
workspace.FeedBlob("label", label)
# Create model using a model helper
m = cnn.CNNModelHelper(name="my first net")
fc_1 = m.FC("data", "fc1", dim_in=100, dim_out=10)
pred = m.Sigmoid(fc_1, "pred")
[softmax, loss] = m.SoftmaxWithLoss([pred, "label"], ["softmax", "loss"])
上面的代码中,我们首先在内存中创建了输入数据和标签,实际使用中,往往从database等载体中读入数据。可以看到输入数据和标签的第一维度是16,这是因为输入的最小batch最小是16。Caffe2中很多Operator都能直接通过CNNModelHelper来进行,并且能够一次处理一个batch。CNNModelHelper’s Operator List中有更详细的解析。
第二,我们通过一些操作创建了一个模型。比如FC,Sigmoid,SoftmaxWithLoss 。注意:这个时候,这些操作并没有真正执行,他们仅仅是对模型进行了定义。
模型助手创建了两个网络:m.param_init_net,这个网络将仅仅被执行一次。他将会初始化参数blob,例如全连接层的权重。真正的训练是通过执行m.net来是现实的。这是自动发生的。
网络的定义保存在一个protobuf结构体中。你可以很容易的通过调用net.proto来查看它。
print(str(m.net.Proto()))
输出如下:
name: "my first net"
op {
input: "data"
input: "fc1_w"
input: "fc1_b"
output: "fc1"
name: ""
type: "FC"
}
op {
input: "fc1"
output: "pred"
name: ""
type: "Sigmoid"
}
op {
input: "pred"
input: "label"
output: "softmax"
output: "loss"
name: ""
type: "SoftmaxWithLoss"
}
external_input: "data"
external_input: "fc1_w"
external_input: "fc1_b"
external_input: "label"
同时,你也可以查看参数初始化网络:
print(str(m.param_init_net.Proto()))
这就是Caffe2的API:使用Python接口方便快速的构建网络并训练你的模型,Python接口将这些网络通过序列化的protobuf传递给C++接口,然后C++接口全力的执行。
Executing
现在我们可以开始训练我们的模型。
首先,我们先跑一次参数初始化网络。
workspace.RunNetOnce(m.param_init_net)
这个操作将会把param_init_net的protobuf传递给C++代码进行执行。
然后我们真正的创建网络:
workspace.CreateNet(m.net)
一旦创建好网络,我们就可以高效的跑起来:
# Run 100 x 10 iterations 跑100*10次迭代
for j in range(0, 100):
data = np.random.rand(16, 100).astype(np.float32)
label = (np.random.rand(16) * 10).astype(np.int32)
workspace.FeedBlob("data", data)
workspace.FeedBlob("label", label)
workspace.RunNet(m.name, 10) # run for 10 times 跑十次
这里要注意的是我们怎样在RunNet()函数中使用网络的名字。并且在这里,由于网络已经在workspace中创建,所以我们不需要再传递网络的定义。执行完后,你可以查看存在输出blob中的结果。
print(workspace.FetchBlob("softmax"))
print(workspace.FetchBlob("loss"))
Backward pass
上面的网络中,仅仅包含了网络的前向传播,因此它是学习不到任何东西的。后向传播对每一个前向传播进行gradient operator。如果你想自己尝试这样的操作,那么你可以进行以下操作并检查结果。
在RunNetOnce()前,插入下面操作:
m.AddGradientOperators([loss])
然后测试protobuf的输出:
print(str(m.net.Proto()))
以上就是大体的使用教程
译者注:
训练过程可以总结为以下步骤:
# Create model using a model helper
m = cnn.CNNModelHelper(name="my first net")
fc_1 = m.FC("data", "fc1", dim_in=100, dim_out=10)
pred = m.Sigmoid(fc_1, "pred")
[softmax, loss] = m.SoftmaxWithLoss([pred, "label"], ["softmax", "loss"])
m.AddGradientOperators([loss]) #注意这一行代码
workspace.RunNetOnce(m.param_init_net)
workspace.CreateNet(m.net)
# Run 100 x 10 iterations
for j in range(0, 100):
data = np.random.rand(16, 100).astype(np.float32)
label = (np.random.rand(16) * 10).astype(np.int32)
workspace.FeedBlob("data", data)
workspace.FeedBlob("label", label)
workspace.RunNet(m.name, 10) # run for 10 times
结语:
转载请注明出处:http://www.jianshu.com/c/cf07b31bb5f2
Caffe2 手册(Intro Tutorial)[2]的更多相关文章
- Caffe2 Tutorials[0]
本系列教程包括9个小节,对应Caffe2官网的前9个教程,第10个教程讲的是在安卓下用SqueezeNet进行物体检测,此处不再翻译.另外由于栏主不关注RNN和LSTM,所以栏主不对剩下两个教程翻译. ...
- linux下scrapy环境搭建
最近使用scrapy做数据挖掘,使用scrapy定时抓取数据并存入MongoDB,本文记录环境搭建过程以作备忘 OS:ubuntu 14.04 python:2.7.6 scrapy:1.0.5 D ...
- Scrapy使用详细记录
这几天,又用到了scrapy框架写爬虫,感觉忘得差不多了,虽然保存了书签,但有些东西,还是多写写才好啊 首先,官方而经典的的开发手册那是需要的: https://doc.scrapy.org/en/l ...
- 学python,怎么能不学习scrapy呢!
摘要:本文讲述如何编写scrapy爬虫. 本文分享自华为云社区<学python,怎么能不学习scrapy呢,这篇博客带你学会它>,作者: 梦想橡皮擦 . 在正式编写爬虫案例前,先对 scr ...
- Scrapy开发指南
一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...
- [转]python 常用类库!
Python学习 On this page... (hide) 1. 基本安装 2. Python文档 2.1 推荐资源站点 2.2 其他参考资料 2.3 代码示例 3. 常用工具 3.1 Pytho ...
- Scrapy003-项目流程
Scrapy003-项目流程 @(Spider)[POSTS] 前两篇文章我们了解到Scrapy的原理和安装的相关知识,这节就需要知道创建项目流程的小知识. 根据官方文档:http://scrapy- ...
- Python爬虫Scrapy框架入门(0)
想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...
- (转) Deep Learning Research Review Week 2: Reinforcement Learning
Deep Learning Research Review Week 2: Reinforcement Learning 转载自: https://adeshpande3.github.io/ad ...
随机推荐
- Educational Codeforces Round 81 (Rated for Div. 2)E(线段树)
预处理把左集划分为大小为1~i-1时,把全部元素都移动到右集的代价,记作sum[i]. 然后枚举终态时左集的大小,更新把元素i 留在/移动到 左集的代价. 树状数组/线段树处理区间修改/区间查询 #d ...
- C#中字符串常用方法
string str = "123@163.com"; int index = str.IndexOf('@'); // 返回3 从左向右第一个@ int index = str ...
- python浅析对return的理解
函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return ,则后面的不执行 ...
- itest(爱测试) 4.3.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 简介:查看简介 test 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试工作,也有测试环境管理,还有很常用的测试度 ...
- tensorflow之tensorboard
参考https://www.cnblogs.com/felixwang2/p/9184344.html 边学习,边练习 # https://www.cnblogs.com/felixwang2/p/9 ...
- MySQL导出数据到文件报错
执行如下语句: mysql> select * from users into outfile "F:\Develop\MySQL57\Uploads\users.txt" ...
- Java常量/变量
1. 常量 /* 常量:在程序运行期间,固定不变的量. 常量的分类: 1. 字符串常量:凡是用双引号引起来的部分,叫做字符串常量.例如:"abc"."Hello" ...
- 【CSS属性#1】
" 目录 一.宽和高 二.字体属性 1. 文字字体 font-famlly 2. 字体大小 font-size 3. 字重(粗细) font-weight 4. 文本颜色 color 三.字 ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- 2.1.FastDFS-单机拆分版-单机版安装配置
Centos610系列配置 1.什么是FastDFS? FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负 ...