Hello,
thank your for providing the MXNET/Gluon framework to the community.
I’d like to know how to return a subset of a HybridBlock based on a constant indices vector.
Here’s a minimal example what I’m trying to do:
class ConvNet(HybridBlock):
def __init__(self, name: str, indices_vector: tuple):
"""
Constructor
:param name: Name of the network
:param indices_vector: 1D list e.g. [0, 2, 3] which defines the values to select after the forward pass.
Note, this must be coherent with the input size of the network (e.g. 8x8).
"""
super(ConvNet, self).__init__(prefix=name + "_")
self.body = HybridSequential(prefix="")
with self.name_scope():
self.body.add(Conv2D(channels=1, kernel_size=(1, 1), use_bias=False))
self.body.add(BatchNorm())
self.body.add(Activation('relu'))
self.body.add(Flatten())
self.indices_vector = mx.gluon.Constant('const', indices_vector)
def hybrid_forward(self, F, x):
"""
Compute forward pass
:param F: MXNET-handle
:param x: Input data to the block
:return: Activation maps of the block
"""
x = self.body(x)
return F.take(x, self.indices_vector, axis=1)
This however throws the Exception:
TypeError: hybrid_forward() got an unexpected keyword argument 'self.indices_vector'
I also tried to create a MXNET constant based on this issue:
but couldn’t get it to work that way.
I know that you can select a subset afterwards in numpy, but I’d like to avoid this because of additional memory and runtime overhead.