2

我是 Caffe2 的新手,我想编写这样的操作:

  • 麻木的方式

示例代码

  • pytoch方式

示例代码

我的问题是,如何组合 Caffe2 运算符来制作与上面相同的运算符?我尝试了一些作品,但仍然找不到合适的作品。如果有人知道组成,请帮助,我将非常感激。

4

1 回答 1

2

Caffe2 中有一个 Gather 运算符。此运算符的主要问题是您无法设置轴(始终为 0)。所以,如果我们运行这段代码:

model = ModelHelper(name="test")

s = np.arange(20).reshape(4, 5)
y = np.asarray([0, 1, 2])

workspace.FeedBlob('s', s.astype(np.float32))
workspace.FeedBlob('y', y.astype(np.int32))

model.net.Gather(['s', 'y'], ['out'])

workspace.RunNetOnce(model.net)

out = workspace.FetchBlob('out')
print(out)

我们将得到:

[[  0.   1.   2.   3.   4.]
 [  5.   6.   7.   8.   9.]
 [ 10.  11.  12.  13.  14.]]

一种解决方案可能是将s重塑为一维数组并以相同的方式转换y。首先,我们必须实现一个运算符来转换y。在这种情况下,我们将使用一个名为 ravel_multi_index 的 numpy 函数:

class RavelMultiIndexOp(object):
    def forward(self, inputs, outputs):
        blob_out = outputs[0]

        index = np.ravel_multi_index(inputs[0].data, inputs[1].shape)

        blob_out.reshape(index.shape)
        blob_out.data[...] = index

现在,我们可以重新实现我们的原始代码:

model = ModelHelper(name="test")

s = np.arange(20).reshape(4, 5)
y = np.asarray([[0, 1, 2],[0, 1, 2]])

workspace.FeedBlob('s', s.astype(np.float32))
workspace.FeedBlob('y', y.astype(np.int32))

model.net.Python(RavelMultiIndexOp().forward)(
    ['y', 's'], ['y'], name='RavelMultiIndex'
)
model.net.Reshape('s', ['s_reshaped', 's_old'], shape=(-1, 1))

model.net.Gather(['s_reshaped', 'y'], ['out'])

workspace.RunNetOnce(model.net)

out = workspace.FetchBlob('out')
print(out)

输出:

[[  0.]
 [  6.]
 [ 12.]]

您可能希望将其重塑为 (1, -1)。

于 2019-05-06T11:06:19.733 回答