如何创建新的Operator(2)

    本文主要是官方文档中Basics of Caffe2-Workspaces,Operators,and Nets的学习笔记。

如何创建新的Operator(2)_第1张图片

1. 利用core.CreateOperator函数来创建新的Operator。

op=core.CreateOperator(

"GaussianFill",#首先确定operator的类型

[],# 输入,可缺省,说明该operator用于生成一组参数

["Z"],输出

shape=[100,100],# 生成数据的尺寸,此处为100*100

mean=1.0,# 均值

std=1.0,# 标准差

    单独运行operator的方式是workspace.RunOperatorOnce(op),只有在运行之后才会有数据,刚开始只是定义。

2. 创建一个类似下面计算的网络,利用core.Net创建。注意与上一篇笔记中ModelHelper方法的区别,上一篇中是自动创建了初始化和前向网络,我们现在做的其实是将二者融合,一边初始化网络,一边进行前向网络的构建,当然对于大型网络还是ModelHelper更为方便,但这也说明了caffe2的灵活性。

X = np.random.randn(2, 3)

W = np.random.randn(5, 3)

b = np.ones(5)

Y = X * W^T + b

(1)创建一个空的网络

net = core.Net("my first net")

  (2) 创建一个blob,也就是X(正常是通过读取样本的数据,上一篇中是通过numpy生成的:

X=net.GaussianFill([],["X"],mean=0.0,std=1.0,shape=[2,3],run_once=0)

X生成的方式也很值得关注,首先他与core.CreateOperator生成的operator格式是完全相同的,我们可以通过net.Proto()查看。其次是他生成的方式与原本不同:通过net调用已有的op,与core.CreateOperator首先指明op的名字,形式上有些不同。最后用core.CreateOperator生成operator需要手动将其加入到net中(net.Proto().op.append(op)),而这种方式会自动完成将op加入net的操作。

最后用那返回的X是什么呢?官网文档说是X是BlobReference类型,主要记录了两个内容:

   记录名字,通过str(X)可以获取他的名字

   他是从哪个net中生成的。

(3)创建W,b的方式和X一样,创建FC层是需要注意:

Y =X.FC([W,b],["Y"])

这种方式和创建X,W,b本质上是一致的,他等于下面这种方式:

Y = net.FC([X,W,b],["Y"])

(4) 运行网络的方式和上一篇一致,这里讲到了清空workspace和记录网络运行时间的方法。

你可能感兴趣的:(如何创建新的Operator(2))