如何在 Caffe2 中应用 "Gather" 类似 numpy 的操作?
how to apply "Gather" operation like numpy in Caffe2?
我是 Caffe2 的新手,我想编写这样的操作:
- Numpy 方式
example code
- pytoch 方式
example code
我的问题是,如何组合Caffe2算子来制作与上面相同的算子?我尝试了一些作品,但仍然找不到合适的作品。如果有人知道作文,请帮忙,我将不胜感激。
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 的新手,我想编写这样的操作:
- Numpy 方式
example code
- pytoch 方式
example code
我的问题是,如何组合Caffe2算子来制作与上面相同的算子?我尝试了一些作品,但仍然找不到合适的作品。如果有人知道作文,请帮忙,我将不胜感激。
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)。