使用MXNet时,如何处理不同的批量大小'在data_shapes?

时间:2018-05-15 03:17:03

标签: mxnet

嗨,我有一个问题,如何使用不固定的输入数据进行预测?我将尽力详细描述:   我使用MTCNN进行人脸检测(不熟悉它),并使用3个网络:PNet,RNet,ONet。 PNet检测到大量的提议面边界框,然后这些框由一个接一个的剩余网格粗到细,最终获得精确的面部bbox(s)。当将图像作为PNet的输入时,图像的大小是不固定的,并且来自PNet的输出提议框号也是不固定的,因此作为RNet,ONet。引用另一个MTCNN代码我在绑定模块时设置了一个大的data_shapes(例如,图像大小,批量大小),并将all初始化为零,然后进行预测。这虽然有效,但不是冗余计算吗? (问题1)

PNET:

max_img_w=1000
max_img_h=1000
sym, arg_params, aux_params = mx.model.load_checkpoint(‘det1’, 0)
self.PNets = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.PNets.bind(data_shapes=[(‘data’, (1, 3, max_img_w, max_img_h))],for_training=False)
self.PNets.set_params(arg_params,aux_params)

RNET

sym, arg_params, aux_params = mx.model.load_checkpoint(‘det2’, 0)
self.RNet = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.RNet.bind(data_shapes=[(‘data’, (2048,3, 24, 24))],for_training=False)
self.RNet.set_params(arg_params,aux_params,allow_missing=True)

ONET

sym, arg_params, aux_params = mx.model.load_checkpoint(‘det3’, 0)
self.ONet = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.ONet.bind(data_shapes=[(‘data’, (256, 3, 48, 48))],for_training=False)
self.ONet.set_params(arg_params,aux_params,allow_missing=True)

我在预测之前尝试mx.mod.Module.reshape,它会根据最后一个网络的输出调整数据形状,但是我收到了这个错误:(问题2) AssertionError:未指定数组的形状arg:prob1_label已更改。这可能导致新执行程序不与旧的执行程序共享参数。请检查网络中的错误。如果是这样,请设置partial_shaping = True以禁止显示此警告。

还有一件事是MTCNN代码(https://github.com/pangyupo/mxnet_mtcnn_face_detection)主要使用不推荐使用的函数来加载模型:

self.PNet = mx.model.FeedForward.load(‘det1’,0)

使用任意data_shapes的一行,为什么不推荐使用此函数..?(问题3) 我发现在加载模型之后,FeedFroward在预测之前需要0MB内存,但mx.mod.Module在加载后会占用内存,并且在进行一次预测后会明显增加。

1 个答案:

答案 0 :(得分:1)

您可以使用MXNet命令式API Gluon,这样可以使用不同的批量大小。

如果在这种情况下,你的模型是使用符号API训练的,或者是以序列化的MXNet格式导出的(例如'-0001.params',' - symbol.json'),你可以在Gluon中加载它那样:

ctx = mx.cpu()

sym = mx.sym.load_json(open('det1-symbol.json', 'r').read())
PNet = gluon.nn.SymbolBlock(outputs=sym, inputs=mx.sym.var('data'))
PNet.load_params('det1-0001.params', ctx=ctx)

然后您可以通过以下方式使用它:

# a given batch size (1)
data1 = mx.nd.ones((1, C, W, H))
output1 = PNet(data1)

# a different batch size (5)
data2 = mx.nd.ones((5, C, W, H))
output2 = PNet(data2)

它会起作用。

您可以使用官方60 minutes crash course

开始使用MXNet Gluon