在运行时获取 HybridBlock 层形状
Get HybridBlock layer shape on runtime
我正在尝试构建自定义池化层(用于 ndarray 和 Symbol)并且我需要知道运行时的输入形状。根据文档,HybridBlock 具有函数 "infer_shape",但我无法使其工作。关于我做错了什么的任何指示?
mxnet 版本
1.0.0,从 conda 构建,python3。
最小可重现示例
例如:
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__'
HybridBlock 的想法是让命令式世界中的调试变得容易,您可以在其中简单地放置一个断点或 print
语句,然后查看哪些数据正在您的网络中流动。当您确信网络正在执行您想要的操作时,您可以调用 .hybridize()
并享受速度提升。
在开发网络和使用命令式模式时,您可以简单地打印:
print('shape',_input.shape)
并在使用网络的混合版本时删除此行,因为这仅适用于 NDArrays。
如果这不能回答您的问题,您能否通过获取输入数据的形状来准确说明您试图实现的目标是什么?
我正在尝试构建自定义池化层(用于 ndarray 和 Symbol)并且我需要知道运行时的输入形状。根据文档,HybridBlock 具有函数 "infer_shape",但我无法使其工作。关于我做错了什么的任何指示?
mxnet 版本
1.0.0,从 conda 构建,python3。
最小可重现示例
例如:
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__'
HybridBlock 的想法是让命令式世界中的调试变得容易,您可以在其中简单地放置一个断点或 print
语句,然后查看哪些数据正在您的网络中流动。当您确信网络正在执行您想要的操作时,您可以调用 .hybridize()
并享受速度提升。
在开发网络和使用命令式模式时,您可以简单地打印:
print('shape',_input.shape)
并在使用网络的混合版本时删除此行,因为这仅适用于 NDArrays。
如果这不能回答您的问题,您能否通过获取输入数据的形状来准确说明您试图实现的目标是什么?