首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Caffe2中应用像numpy这样的“聚集”操作?

如何在Caffe2中应用像numpy这样的“聚集”操作?
EN

Stack Overflow用户
提问于 2018-12-17 08:50:19
回答 1查看 103关注 0票数 2

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

  • Numpy方式

示例代码

  • 皮托奇路

示例代码

我的问题是,如何组合Caffe2运算符,使相同的运算符像上面那样?我试过一些作文,但还是找不到合适的。如果有人知道这篇作文,请帮忙,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 11:06:19

在Caffe2中有一个集合操作符。这个操作符的主要问题是不能设置轴(它总是0)。所以,如果我们运行这个代码:

代码语言:javascript
复制
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)

我们会得到:

代码语言:javascript
复制
[[  0.   1.   2.   3.   4.]
 [  5.   6.   7.   8.   9.]
 [ 10.  11.  12.  13.  14.]]

一种解决方案可能是重塑一维数组,并以同样的方式转换y。首先,我们必须实现一个操作符来转换y。在本例中,我们将使用一个名为ravel_multi_index的numpy函数:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[[  0.]
 [  6.]
 [ 12.]]

您可能需要将其重塑为(1,-1)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53811642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档