Caffe2中的 Operators 类似函数。 从C ++方面,它们都是从公共接口派生的,并且按类型进行注册,这样我们可以在运行时调用不同的运算符。 运算符的接口在caffe2 / proto / caffe2.proto中定义。 基本上,它需要一堆输入,并产生一堆输出。
记住,当我们在Caffe2 Python中说“创建一个运算符”时,没有任何运行。 它所做的就是创建协议缓冲区(protocol buffer),指定操作员应该是什么。 稍后,它将被发送到C ++后端执行。 如果您不熟悉protobuf,那么它是一个类似json的序列化工具,用于结构化数据。 在这里(不过这里一般上不去)查找有关协议缓冲区的更多信息。
来看一个实际的例子。
# Create an operator. op = core.CreateOperator("Relu", # The type of operator that we want to run["X"], # A list of input blobs by their names["Y"], # A list of output blobs by their names ) # and we are done!
正如我们提到的,创建一个op实际上是一个protobuf对象,看一下它的内容。
print ("Type of the created op is:{}".format(type(op)))
print("Content:\n")
print(str(op))
Type of the created op is: <class 'caffe2.proto.caffe2_pb2.OperatorDef'>
Content:input: "X"
output: "Y"
name: ""
type: "Relu"
OK,让我们运行operator。首先把X Feed 到工作区中。最简单的一种运行operator方式是 workspace.RunOperatorOnce(operator)
workspace.FeedBlob("X",np.random.randn(2,3).astype(np.float32))
workspace.RunOperatorOnce(op)
执行完之后,让我们看看operator是否做了正确的事情,这就是我们神经网络的激活函数(Relu)。linear characteristics to the neural network classifier, and is defined as:
print("Current blobs in the workspace: {}\n".format(workspace.Blobs()))
print("X:\n{}\n".format(workspace.FetchBlob("X")))
print("Y:\n{}\n".format(workspace.FetchBlob("Y")))
print("Expected:\n{}\n".format(np.maximum(workspace.FetchBlob("X"), 0)))
Current blobs in the workspace: [u'X', u'Y']X:
[[-0.46947178 0.56304729 -0.58747113][-0.2798053 -1.43556678 -0.12581916]]Y:
[[ 0. 0.56304729 0. ][ 0. 0. 0. ]]Expected:
[[ 0. 0.56304729 0. ][ 0. 0. 0. ]]
如果期望输出与Y相等,则有效。
如果需要,运算符也可以选择参数。 它们被指定为键值对。 我们来看一个简单的例子,就是创建张量并用高斯随机变量填充它。
op = core.CreateOperator("GaussianFill",[], # GaussianFill does not need any parameters.["Z"],shape=[100, 100], # shape argument as a list of ints.mean=1.0, # mean as a single floatstd=1.0, # std as a single float
)
print("Content of op:\n")
print(str(op))
Content of op:output: "Z"
name: ""
type: "GaussianFill"
arg {name: "std"f: 1.0 }
arg {name: "shape"ints: 100ints: 100 }
arg {name: "mean"f: 1.0 }
Let’s run it and see if things are as intended.
workspace.RunOperatorOnce(op)
temp = workspace.FetchBlob("Z")
pyplot.hist(temp.flatten(), bins=50)
pyplot.title("Distribution of Z")
If you see a bell shaped curve then it worked!