Caffe2 - Python Operator

类似于 Caffe 基于 Python 定制 CaffeLayers, Caffe2 也提供了使用 Python 来自定义 Caffe2 Operators.

Forward Python Operator

Caffe2 提供了 high-level 接口,用于 Python ops 创建 —— Net.Python() 接口.

from caffe2.python import core, workspace
import numpy as npdef f(inputs, outputs):outputs[0].feed(2 * inputs[0].data)workspace.ResetWorkspace()
net = core.Net("tutorial")
net.Python(f)(["x"], ["y"]) ##
workspace.FeedBlob("x", np.array([3.]))
workspace.RunNetOnce(net)
print(workspace.FetchBlob("y"))
# [6.]

Caffe2 的 net.Python() 函数是可调用的,类似与其它 operators.

net.Python(f)(["x"], ["y"]) 是一个新添加到网络的 Python operator,其输入是 x,输出是 y. 之后,即可保存 net.Python() 的输出;也可多次调用以添加多个 Python operators (可能分别是不同的输入和输出).

Python operators 的函数 f包括连个参数:输入 inputs 列表和输出 outputs 列表. 当执行 operator 时,Caffe2 blobs 被转换为列表元素. 对于 CPU tensor blobs,会被转换为 TensorCPU object,类似与 Numpy arrays.

Caffe2 CPU tensor、Python TensorCPU object 和 Numpy array 的关系:

  • C++ tensor objects 和 Numpy objects 间是自动转换的,由 PyBind library 来控制管理.

  • 当创建一个 TensorCPU wrapper 时,伴随创建一个新的 Numpy array object,其与对应的 Caffe2 CPU tensor共享相同的内存. 该 Numpy array 可以在 Python 通过 TensorCPU object 的 .data 操作来读取和查看.

  • 尽管 Numpy array 和 Caffe2 tensor 共享相同的内存,但是其它的 Caffe2 tensor 数据(如,shape) 是与 Numpy array 分开存储的. 而且,在 operator 函数执行时,Numpy 可能复制并重新分配其 array 到内存的不同位置(如,array 的 resize).

    因此,需谨记,在创建 Python operator 代码时,需要保证 Caffe2 和 Numpy 同步输出 tensors.

  • TensorCPU feed 数据方式是 Numpy tensor,将 Caffe2 tensor 进行 resize,并将 Numpy 的 tensor 数据复制到 Caffe2 tensor.

  • 另一种正确设置 Caffe2 的输出 tensor 方式是调用 reshape 函数,来对相应的 TensorCPU output 处理,然后将 Python 的数据复制到输出的 .data tensor, 如:

    def f_reshape(inputs, outputs):outputs[0].reshape(inputs[0].shape)outputs[0].data[...] = 2 * inputs[0].dataworkspace.ResetWorkspace()
    net = core.Net("tutorial")
    net.Python(f_reshape)(["x"], ["z"])
    workspace.FeedBlob("x", np.array([3.]))
    workspace.RunNetOnce(net)
    print(workspace.FetchBlob("z"))

    reshape 函数将 Caffe2 tensor 进行更新,然后调用 .data 属性返回与 Caffe2 tensor 共享内存的 Numpy array.

    f_reshape 即是将输出复制到共享内存的位置.

net.Python()函数也可以有其它参数. 当 pass_workspace=True使, workspace 会被传递到 operator 的 Python 函数,如:

def f_workspace(inputs, outputs, workspace):outputs[0].feed(2 * workspace.blobs["x"].fetch())workspace.ResetWorkspace()
net = core.Net("tutorial")
net.Python(f_workspace, pass_workspace=True)([], ["y"])
workspace.FeedBlob("x", np.array([3.]))
workspace.RunNetOnce(net)
print(workspace.FetchBlob("y"))
# [6.]

Backward - Gradient Python Operator

Caffe2 的 net.Python() 的另一个重要参数是 grad_f,其是对应的 gradient operator 的Python 函数.

def f(inputs, outputs):outputs[0].reshape(inputs[0].shape)outputs[0].data[...] = inputs[0].data * 2def grad_f(inputs, outputs):# Ordering of inputs is [fwd inputs, outputs, grad_outputs]grad_output = inputs[2]grad_input = outputs[0]grad_input.reshape(grad_output.shape)grad_input.data[...] = grad_output.data * 2workspace.ResetWorkspace()
net = core.Net("tutorial")
net.Python(f, grad_f)(["x"], ["y"])
workspace.FeedBlob("x", np.array([3.]))
net.AddGradientOperators(["y"])
workspace.RunNetOnce(net)
print(workspace.FetchBlob("x_grad"))
# [2.]

当指定 gradient 函数,并用 net.Python 进行调用时,会再注册一个序列化 gradient 函数,其可以被对应的 gradient Python operator(PythonGradient) 来使用.

gradient operator 有两个参数: 输入 input 列表和输出 output 列表.

输入 input 列表包含所有的 forward 函数输入,以及其 outputs,其 forward 函数输出 outputs 的 gradients.

输出 output 列表 包含 forward 函数输入 inputs 的 gradient.

net.Pythongrad_output_indices/grad_input_indices 指定了梯度 gradient/input blobs 的 gradient 函数的 reads/writes 索引.

GPU tensors:

PythonOp 的实现是 CPU 的,采用 Numpy arrays,在 CPU 内存中.

如果需要 PythonOp 是 GPU tensors,Caffe2 定义了 PythonOp 的 CUDA 版本,基于 GPUFallbackOp. 该 operator 对 CPU-operator 进行wrap,并添加 GPU-to-CPU(和反向) copy operations.

因此,在使用 CUDA PythonOp 时,所有的输入 input CUDA tensors 被自动的复制到 CPU 内存,然后所有的 CPU 输出 output 再被复制回 GPU. (GPU-CPU-GPU)

Caffe2 - (十三) 基于 Python 创建 Operator相关推荐

  1. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】

    本文实例讲述了Python创建对称矩阵的方法.分享给大家供大家参考,具体如下: 对称(实对称)矩阵也即: step 1:创建一个方阵 >>> import numpy as np & ...

  2. 基于Python的DELMIA二次开发(一):创建零件

    基于Python的delmia二次开发系列 文章目录 前言 一.基础概念 1.对象.集合.属性.方法 2.继承.聚合 二.Python连接Delmia 三.简单示例 前言 delmia和catia属同 ...

  3. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

  4. 基于python win32com的visio文件基础操作语句简介及案例展示(家族树自动创建)

    1 写在前面 最近需要给老师们做家族树,向visio模板中套excel数据,但是在手动套模板的过程中发现间距的控制是一个较为繁琐的事情,于是萌生了用python完成这一过程的想法. 在探索的过程中经验 ...

  5. autocad python二次开发_基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术

    AutoCAD应用程序开发系列 基于Python AutoCAD ActiveX 二次开发技术 主要库:pyautocad==0.2.0 内容#:基于Python AutoCAD ActiveX 二次 ...

  6. 基于python的学生成绩管理系统毕业设计源码071143

    Django学生成绩管理 摘   要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革.多样性.质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化.依照这一现实为基础,设计一个快捷 ...

  7. 基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用培训班

    一 Python入门基础 [理论讲解与案例演示实操练习] 1.Python环境搭建( 下载.安装与版本选择). 2.如何选择Python编辑器?(IDLE.Notepad++.PyCharm.Jupy ...

  8. 基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术

    AutoCAD应用程序开发系列 基于Python AutoCAD ActiveX 二次开发技术 主要库:pyautocad==0.2.0 内容#:基于Python AutoCAD ActiveX 二次 ...

  9. (附源码)python+mysql+基于python的学生成绩管理系统 毕业设计071143

    Django学生成绩管理 摘 要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革.多样性.质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化.依照这一现实为基础,设计一个快捷而又 ...

最新文章

  1. 基于canoe 新建一个lin工程_CANoe教程 | 高级编程 - C Library API
  2. Thinkphp动态切换主题
  3. 免费猪八戒网站软件任务小助手--小八戒更新版本1.5
  4. UIColor之【扩展:#FFFFFF -UIColor】
  5. tableau使用_使用Tableau探索墨尔本房地产市场
  6. 对KVC和KVO的理解
  7. 设计模式示例_桥梁设计模式示例
  8. 选择的按钮:将ToggleButtons用作单选按钮
  9. 服务器能进系统滴滴响,ibm x226服务器开机嘀嘀嘀响三遍就没反应了。是怎么回事?内存吗?...
  10. PHP入门及服务环境配置(Nginx+PHP)
  11. 美媒:中国假冒芯片太假 致驻伊美军频繁坠机
  12. Tableau教程——一
  13. yytext table html,快速掌握YYText
  14. 【软件体系结构】软件体系结构笔记
  15. 软件工程3 软件开发过程
  16. ab压力测试是使用以及介绍
  17. 迭代法的c语言程序,松弛迭代法C程序
  18. 小米手机关闭自带服务器,小米手机耗电大?关闭这两个设置,小米手机能更省电!...
  19. nokia n1 android 6,到手的NOKIA 诺基亚 N1平板 — 王者归来?呵呵
  20. 智慧树\知到——程序设计基础(C语言)入门篇第六章到第十章测试答案

热门文章

  1. 后端技术 - 收藏集 - 掘金
  2. Dalvik虚拟机探析
  3. 编译chrome for android,Chrome for Android 编译了两天终于在师傅指导下搞定
  4. 直流电机的快衰减和慢衰减模式分析
  5. 【专业数据】二.2020~2022年北京交通大学【信息与通信工程】专业复试线/分数线差/计划招生数/复试数/录取数/复试比例/录取率
  6. mysql 1067_mysql启动错误1067进程意外终止的解决方法
  7. 最大似然估计(机器学习)
  8. 模拟喷泉码(入门二):Seamless Rate Adaptation for Wireless Networking
  9. 牛客网SQL 进阶篇刷题
  10. 网络工程师每日练习(5)