构建简单网络测试MXNet中一些问题

一,构建一个简单网络训练自己的数据

### Train a simple network with our data ###
data = mx.sym.Variable('data')
#conduct network
fc1 = mx.sym.FullyConnected(data=data, num_hidden=3, name='fc1')
fc2 = mx.sym.FullyConnected(data=fc1, num_hidden=2, name='fc2')
sym = mx.sym.SoftmaxOutput(data=fc2, name='softmax')

# creat data
Data = mx.nd.random.uniform(0,1,shape=(6,4))
Label = mx.nd.round(mx.nd.random.uniform(0,1,shape=(6,)))
train_data = mx.io.NDArrayIter(data={'data':Data},
                                label={'softmax_label':Label},
                                batch_size=2)

#train
mod = mx.mod.Module(symbol=sym,context=mx.cpu())
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def epoch_callback(epoch,symbol,arg_params,aux_params):
 	for epoch in range(5):
		mod.save_checkpoint('E:\Spyder\MXNET',epoch,save_optimizer_states=True)

mod.fit(train_data, num_epoch=5, epoch_end_callback = epoch_callback,)

二,查看一个训练好网络的parameter

### check the structure and parameter of the network ### 
# load parmeter 
save_dict = mx.nd.load('E:\Spyder\MXNET-0004.params')  
arg_params = {}  
aux_params = {}  
for k, v in save_dict.items():
    tp, name = k.split(':', 1)
    if tp == 'arg':
        arg_params[name] = v  
    if tp == 'aux':
        aux_params[name] = v  

print(arg_params.keys())

print('Fc1_Weight', arg_params['fc1_weight'])
print('Fc1_Bias', arg_params['fc1_bias'])
print('Fc2_Weight', arg_params['fc2_weight'])
print('Fc2_Bias', arg_params['fc2_bias'])

三,测试一个网络

mod.forward的output为sofmax后的output,此时输入的data使用Batch = namedtuple('Batch', ['data']),其中data是一个list,其中的元素是一个mxnet.NDArray。

### evaluate a trained network ###
#prepare evaluate data
Batch = namedtuple('Batch', ['data'])
data = [mx.nd.ones((1, 4))]

# load pretrained model
prefix = 'E:/Spyder/MXNET'
sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, 4)
# mod = mx.mod.Module(symbol=sym, context=mx.cpu(), label_names=["softmax_label"])
# mod.bind(for_training=False, data_shapes=[('data', (1,4))],
#          label_shapes=[('softmax_label', (1,))])
mod = mx.mod.Module(symbol=sym, context=mx.cpu(), label_names=None)
mod.bind(data_shapes=[('data', (1, 4))])
mod.set_params(arg_params, aux_params, allow_missing=True)

mod.forward(Batch(data))
print (mod.get_outputs()[0].asnumpy())
#mod.get_outputs gets the softmax_output of the previous forward computation

mod. predict得到预测的output,输入data和label,type为mxnet.NDArray,使用mx.io.NDArrayIter做成循环

#mod.predict 
val_iter = mx.io.NDArrayIter(data[0], label[0], 1)
y = mod.predict(val_iter)
print(y)

四,提取中间层输出

通过特征提取,即提取中间层输出。使用get_internals 方法从Symbol获取所有中间层。

mod.get_outputs得到的是哪里的输出要看mx.mod.Module(symbol=----, .......)中的symbol的赋值。比如在Sec.三中symbol=sym,所以得到的是整个网络的softmax输出;而在Sec.四中,symbol=fc2_sym为第二层的输出,因此输出的就是第二层的结果。

### get the hidden layer output ###
# load pretrained model
prefix = 'E:/Spyder/MXNET'
sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, 4)

# list all the layers
all_layers = sym.get_internals()
print(all_layers.list_outputs())

# get the pre_sofmax layer output, which is usually used for knowledge distillation 
fc2_sym = all_layers['fc2_output']
fc2_mod = mx.mod.Module(symbol=fc2_sym, context=mx.cpu(), label_names=None)
fc2_mod.bind(data_shapes=[('data', (1, 4))])
fc2_mod.set_params(arg_params, aux_params, allow_missing=True)

fc2_mod.forward(Batch(data))
fc2_out = fc2_mod.get_outputs()[0].asnumpy()
print(fc2_out)

(注,mod.score可用于直接计算accuracy,但代码一直报错,无法找到原因,暂不学习)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值