Mxnet利用loss层前的输出层做测试
无论是在分类,还是目标检测模型中,在测试的时候我们都会存在这样的需求:只输入图像数据(无标签)然后执行模型的前向计算,得到对应的分类结果或者目标检测结果。但是用训练过程中的模型,因为存在softmaxoutput等类似的层,需要传入label。接下来介绍一下,怎么使用训练好的模型和参数直接执行前向运算而不需要传入label。
接下来以多分类为例举例说明:模型的fc1层即为输出的各类别的值,然后通过softmaxoutput()执行softmax和corssentropy操作,因此我们只需要输出fc1的结果就好了。这样就不用传入label了。
#加载预训练模型
sym,arg_params,aux_params=mx.model.load_checkpoint(prefix,epoch)
#提取中间某些层作为输出 (此函数非常有用)
all_layers=sym.get_internals()
new_sym=all_layers['fc1_output']
#绑定 初始化参数
model=mx.mod.Module(symbol=new_sym,label_names=None)
model.bind(for_training=False, data_shapes=[('data',(1,3,224,224)])
model.set_params(arg_params,aux_params)
接下来给出更完整的代码:
def get_img(path):
img=cv2.imread(path)
#因为opencv 读入的格式是BGR 而mxnet需要的格式是RGB, 因此需要转换
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img=cv2.resize(img,(224,224))
#重塑数组的形状,从(h,w,c)改为 mxnet的 CHW形状
img=np.swapaxes(img,0,2)
img=np.swapaxes(img,1,2)
#添加batch 维度
img=img[np.newaxis,:]
array=mx.nd.array(img)
return array
#加载预训练模型
sym,arg_params,aux_params=mx.model.load_checkpoint(prefix,epoch)
#提取中间某些层作为输出 (此函数非常有用)
all_layers=sym.get_internals()
new_sym=all_layers['fc1_output']
#绑定 初始化参数
model=mx.mod.Module(symbol=new_sym,label_names=None)
model.bind(for_training=False, data_shapes=[('data',(1,3,224,224)])
model.set_params(arg_params,aux_params)
Batch=namedtuple('batch',['data'])
#前向计算
array=get_img(path)
model.forward(Batch([array])) #注意此处Batch必须为list 否则会报维度不一致错误参看源码
results=model.get_outputs()[0].asnumpy()
最后感谢我的可爱的苏璐岩小姐姐