本文主要是官方文档中Basics of Caffe2-Workspaces,Operators,and Nets的学习笔记。
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和记录网络运行时间的方法。