Mxnet利用loss层前的输出层做测试

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()

最后感谢我的可爱的苏璐岩小姐姐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值