【问题标题】:how to apply "Gather" operation like numpy in Caffe2?如何在 Caffe2 中应用像 numpy 这样的“收集”操作?
【发布时间】:2019-05-17 14:36:22
【问题描述】:

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

  • 麻木的方式

example code

  • pytoch 方式

example code

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

【问题讨论】:

    标签: operator-keyword indices caffe2


    【解决方案1】:

    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)。

    【讨论】:

    • 感谢您的代码,我想这正是我所需要的。对于caffe2的“Gather”算子,我之前试过,不是我想要的。对于您的代码,我认为“model.net.Python()”的使用非常聪明,我将对其进行更多测试。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2012-09-06
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多