Caffe2 概念


Caffe2已经发布几个月了,但目前的使用率并不高,相关文档并不完善,与Caffe(1)相比入门较难。本文主要讲解Caffe2的一些概念,由于本人也是新手,仅做参考,欢迎交流。

Tutorials: Intro Tutorial

Blobs and Workspace, Tensors


和Caffe1一样,Caffe2也有Blobs,并也代表着内存中的数据块。大多数的blobs中都含有tensor,就像Tensorflow一样,可以简单视为一种多维数组,具体在python中被视为numpy arrays。

除了tensor还有workspace这一全新概念。下面举个例子,演示一下如何把blobs 添加到 workspace,并取出。Workspace会在你开始使用时初始化。

from caffe2.python import workspace, model_helper
import numpy as np
# 创建三维随机张量
x = np.random.rand(4, 3, 2)
print(x)
print(x.shape)# 将创建的tensor输入到Workspace中,命名为"my_x"
workspace.FeedBlob("my_x", x)# 从Workspace中取出数据
x2 = workspace.FetchBlob("my_x")
print(x2)

对比一下xx2,发现是一样的。

网络与操作符


Caffe2的基本对象是网络(net)。Net 是一种操作符(operators)的图,并每个操作符取输入blobs数据并输出一或多个blobs。
下面的程序块会创建一个简单的模型,包含这些组成:

  • 一个全连接层

    • Sigmoid activation with a Softmax
    • a CrossEntropy loss

直接组合网络是否乏味,因而最好使用一些有助于创建网络的模型助手。python中使用ModelHelper来帮助我们建立”my first net”网络。ModelHelper将创建两个相互关联的网络:

  1. 一个初始化参数 (ref. init_net)
  2. 一个运行实际的训练(ref. exec_net)
# 创建随机输入数据
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中。

# 使用模型助手建立模型
m = model_helper.ModelHelper(name="my first net")

现在使用model_helper创建了我们之前提到的两个网络(init_netexec_net)。 在下面的模型中使用FC操作符添加一个全连接层,但首先我们需要做一些准备工作:创建FC操作符所期望的一些随机数作为权重。 接下来,我们可以添加操作,并使用我们创建的权重和偏差blobs。

weight = m.param_init_net.XavierFill([], 'fc_w', shape=[10, 100])
bias = m.param_init_net.ConstantFill([], 'fc_b', shape=[10, ])

在Caffe2中,FC操作符的输入为:数据、权重、偏置。权重和偏置分别使用XavierFillConstantFill初始化,输入为空数组、名称、形状。

fc_1 = m.net.FC(["data", "fc_w", "fc_b"], "fc1")
pred = m.net.Sigmoid(fc_1, "pred")
[softmax, loss] = m.net.SoftmaxWithLoss([pred, "label"], ["softmax", "loss"])

首先创建了内存中的数据和标签的blob(但没有加载数据)。数据和标签第一个维度为16,是一个mini-batch。 许多Caffe2的操作符可以通过ModelHelper直接访问,并且可以处理一个mini-batch的输入。
其次,我们通过定义一组操作符来创建一个模型:FC,Sigmoid和SoftmaxWithLoss。 注意:在这一点上,运算符没有被执行,你只是创建模型的定义。
Model helper将创建两个网络:m.param_init_net只运行一次。它会初始化所有blob参数,如FC的权重。实际的训练是通过m.net的。 这对你来说是透明的,并且会自动运行。

网络定义储存在protobuf中,可以通过net.Proto()查看:

print(str(m.net.Proto()))

输出为:

name: "my first net"
op {input: "data"input: "fc_w"input: "fc_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: "fc_w"
external_input: "fc_b"
external_input: "label"

你也可以查看参数初始网络:

print(str(m.param_init_net.Proto()))

输出为:

name: "my first net_init"
op {output: "fc_w"name: ""type: "XavierFill"arg {name: "shape"ints: 10ints: 100}
}
op {output: "fc_b"name: ""type: "ConstantFill"arg {name: "shape"ints: 10}
}

可以看到有两个操作符可以为FC操作符的权重和偏置点创建随机初始化。
这是Caffe2 API的主要思想:使用Python方便地编写网络来训练模型,将网络传递给C ++代码作为序列化的原始缓冲区,然后让C ++代码运行网络,可以达到最好的性能。

执行


现在,当我们定义了模型训练运算符时,我们可以开始运行它来训练我们的模型。
首先,我们只运行一次param初始化:

workspace.RunNetOnce(m.param_init_net)

注意,像往常一样,这将实际上将param_init_net的protobuf下载到C ++运行。
然后我们创建实际的训练网络:

workspace.CreateNet(m.net)

我们创建一次,然后我们可以有效地运行它多次:

# 运行 100 x 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)   # 运行10次

注意我们如何引用RunNet()中的网络名称。 由于网络是在workspace内创建的,所以我们不需要再次通过网络定义。
执行后,可以检查存储在输出blob中的结果(包含张量,即numpy数组):

反向传播


这个网只包含正向传播,所以没有学习任何东西。反向传播是通过在正向传播中为每个运算符创建梯度运算符而创建的。

在调用RunNetOnce()之前插入以下内容:

m.AddGradientOperators([loss])

检查protobuf的输出:

print(str(m.net.Proto()))

本文只是简单翻译一下官方教程,涉及内容不多,以后会尝试更多的功能。

Caffe2 入门教程相关推荐

  1. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  2. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  3. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  4. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  5. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  6. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  7. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  8. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

  9. python 三分钟入门_Cython 三分钟入门教程

    作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...

最新文章

  1. AI又进阶!除了鉴别PS图片,还能一键卸妆
  2. python基础:冒泡和选择排序算法实现
  3. Java异常处理终结篇——如何进行Java异常处理设计
  4. (10) 需求征集 -- 权限管理
  5. python利用faker,输出企业名称、用户名称、手机号、地址信息等测试数据实例
  6. Javascript模拟c#中arraylist操作(学习分享)
  7. 【资料】翘首期盼247天!《阿里巴巴Java开发手册》扫描插件详情介绍
  8. 如何使用R2DBC连接数据库?
  9. RedHat8.0配置本地yum源
  10. Hunger Snake 2
  11. 如何购买阿里云服务器和域名,Xshell连接服务器,域名备案。
  12. ps快速切图,文件命名图片自动导出
  13. 相亲APP开发功能及解决方案
  14. 微软Project项目管理软件简介
  15. 某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1、5、1、3、5、2、4、1、2,出现缓存直接命中的次数是(),最后缓存中即将准备淘汰的数据项是()
  16. OpenGL shader笔记
  17. 第一天python学习打卡
  18. 输入年月 输出日历表
  19. 在数据库中一个汉字到底占几个字节
  20. 猜字游戏网捐米救饥民 每日喂饱5万人

热门文章

  1. Bugku 闪电十六鞭
  2. Js中String对象方法replace()用法详解
  3. 【每日新闻】一台76年苹果一代电脑被拍卖300多万
  4. ubuntu下多用户ssh私有登录
  5. 用vuex mapState时新写法会出现的错误和注意事项(渲染不出来页面的原因)
  6. 想念大家,怀念济南。。。
  7. linux解压zip同时重命名文件
  8. Linux系统和C语言简介
  9. JavaScript扩展运算符...
  10. 【计算机毕业文章】中小连锁零食企业进销存管理系统的设计与实现