MXnet Basics
1. 导入json模型
# 加载model-mxnet-symbol.json和model-mxnet-0000.params文件
sym, arg_params, aux_params = mx.model.load_checkpoint('model-mxnet', 0)
model = mx.mod.Module(symbol = sym)
model.bind(for_training=False, data_shapes=[('data', (1,3,256,256))])
model.set_params(arg_params, aux_params)
input = nd.ones(shape=(1, 3, 256, 256))
Batch = namedtuple('Batch', ['data']) # warp in tuple
model.forward(Batch([input]))
output = model.get_outputs()[0]
print('shape', output.shape, 'output:', output)
2. 统计模型信息:计算量、参数量
# 计算量
def traverse_net(net, data = (1,3,256,256)):
net_internals = net.symbol.get_internals()
list_conv = []
for i, node in enumerate(net_internals):
# print("index:%d,node name:%s"%(i, node.name))
if node.name == "data": # the first layer
continue
elif "conv" in node.name: # 只统计conv的计算量
if node.get_children() is None: # 无输入,说明不在网络中
continue
else: # 计算
arg_shape, out_shape, _ = node.infer_shape_partial(data = data)
if len(out_shape[0])==0:
continue
else:
# print("Name:%s" % node.name)
input_channel = 0
for child in node.get_children():
if child.name == "data":
input_channel += 3
if child.get_children() is None: # this is weight node
continue
arg_shape, chile_out_shape, _ = child.infer_shape_partial(data=data)
if len(chile_out_shape[0]) > 0:
input_channel += chile_out_shape[0][1]
kernel_ops = float(node.list_attr()['kernel'][1])**2 * (input_channel / int(node.list_attr()['num_group']))
bias_ops = 0 if node.list_attr()['no_bias'] == 'True' else 1
flops = np.prod(out_shape[0]) * (kernel_ops + bias_ops)
list_conv.append(flops)
# print(" Output_shape:", out_shape)
# print(" Attr:", node.list_attr())
print('total_compuation:', sum(list_conv) / 1e6, 'M')
# 参数量,统计的是trainable params,比如bn只有2个
model.initialize(mx.initializer.Constant(0.01))
y = model(inputs) # MXnet是延迟初始化,所以必须forward一次后,param才真正初始化了
params = model.collect_params()
sum([np.prod(params[i].shape) for i in pose_model.collect_params() if params[i]._differentiable])
3. 测试模型速度
# 注意添加同步操作!否则时间测量很小
import time
def measure(model, input, n_time):
out = model.forward(input)
tic = time.time()
for i in range(n_time):
model.forward(input)
output = model.get_outputs()[0]
out_np = output.asnumpy() # 必须调用(包含了同步操作,否则测不准)。mxnet是异步调用的,forward函数提交到了队列
cost = time.time() - tic
return cost / n_time