Reputation: 545
I am trying to build a custom pooling layer (both for ndarray and Symbol) and I need to know the input shape at runtime. According to the documentation, HybridBlock has the function "infer_shape", but I can't make it work. Any pointers into what I am doing wrong?
1.0.0 , build from conda, python3.
For example:
import mxnet as mx
import mxnet.ndarray as nd
from mxnet.gluon import HybridBlock
class runtime_shape(HybridBlock):
def __init__(self, **kwards):
HybridBlock.__init__(self,**kwards)
def hybrid_forward(self,F,_input):
print (self.infer_shape(_input))
return _input
xx = nd.random_uniform(shape=[5,5,16,16])
mynet = runtime_shape()
mynet.hybrid_forward(nd,xx)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-41-3f539a940958> in <module>()
----> 1 mynet.hybrid_forward(nd,xx)
<ipython-input-38-afc9785b716d> in hybrid_forward(self, F, _input)
17 def hybrid_forward(self,F,_input):
18
---> 19 print (self.infer_shape(_input))
20
21 return _input
/home/dia021/anaconda2/lib/python2.7/site-packages/mxnet/gluon/block.pyc in infer_shape(self, *args)
460 def infer_shape(self, *args):
461 """Infers shape of Parameters from inputs."""
--> 462 self._infer_attrs('infer_shape', 'shape', *args)
463
464 def infer_type(self, *args):
/home/dia021/anaconda2/lib/python2.7/site-packages/mxnet/gluon/block.pyc in _infer_attrs(self, infer_fn, attr, *args)
448 def _infer_attrs(self, infer_fn, attr, *args):
449 """Generic infer attributes."""
--> 450 inputs, out = self._get_graph(*args)
451 args, _ = _flatten(args)
452 arg_attrs, _, aux_attrs = getattr(out, infer_fn)(
/home/dia021/anaconda2/lib/python2.7/site-packages/mxnet/gluon/block.pyc in _get_graph(self, *args)
369 params = {i: j.var() for i, j in self._reg_params.items()}
370 with self.name_scope():
--> 371 out = self.hybrid_forward(symbol, *grouped_inputs, **params) # pylint: disable=no-value-for-parameter
372 out, self._out_format = _flatten(out)
373
/home/dia021/anaconda2/lib/python2.7/site-packages/mxnet/gluon/block.pyc in __exit__(self, ptype, value, trace)
78 if self._block._empty_prefix:
79 return
---> 80 self._name_scope.__exit__(ptype, value, trace)
81 self._name_scope = None
82 _BlockScope._current = self._old_scope
AttributeError: 'NoneType' object has no attribute '__exit__'
Upvotes: 2
Views: 562
Reputation: 701
The idea of the HybridBlock is to make it easy to debug in the imperative world, where you can simply put a breakpoint, or a print
statement, and see what data is flowing through your network. When you are confident the network is doing what you want, you can call .hybridize()
and enjoy the speed improvements.
Whilst developing your network and using the imperative mode, you can simply print:
print('shape',_input.shape)
and remove this line when using the hybridized version of your network, as this will only work for NDArrays.
If this does not answer your question, can you precise what is the goal you are trying to achieve by getting the shape of your input data?
Upvotes: 2