mxnet深度学习实战:跑自己的数据实验和一些问题总结

用mxnet跑自己的数据

0 代码编译

  git clone https://github.com/dmlc/mxnet.git

  git clone https://github.com/dmlc/mshadow.git

  git clone https://github.com/dmlc/dmlc-core.git

  git clone https://github.com/dmlc/ps-lite.git

  make -j4

1 数据准备

   参考  http://blog.csdn.net/a350203223/article/details/50263737   把数据转换成 REC 模式。

   备注: make_list.py  可以自动生成 train 和 val 的 lst文件。  可使用参数  --train_ratio=XXX 

2 跑数据

  参考mxnet/example/image-classification里面train_cifar10.py 和 symbol_inception-bn-28-small.py

  symbol文件主要用来保存网络结构

  一个简单的3层CNN网络

symbol_UCM.py

[python] view plain copy
  1. import find_mxnet  
  2. import mxnet as mx  
  3.   
  4.   
  5. def get_symbol(num_classes = 21):  
  6.     data = mx.symbol.Variable('data')  
  7.     # first conv  
  8.     conv1 = mx.symbol.Convolution(data=data, kernel=(3,3), num_filter=128)  
  9.     bn1 = mx.symbol.BatchNorm(data=conv1)  
  10.     relu1 = mx.symbol.Activation(data=bn1, act_type="relu")  
  11.     pool1 = mx.symbol.Pooling(data=relu1, pool_type="max",  
  12.               kernel=(5,5), stride=(3,3))  
  13.     # second conv  
  14.     conv2 = mx.symbol.Convolution(data=pool1, kernel=(3,3), num_filter=196)  
  15.     bn2 = mx.symbol.BatchNorm(data=conv2)  
  16.     relu2 = mx.symbol.Activation(data=bn2, act_type="relu")  
  17.     pool2 = mx.symbol.Pooling(data=relu2, pool_type="max",  
  18.               kernel=(3,3), stride=(2,2))  
  19.     # second conv  
  20.     conv3 = mx.symbol.Convolution(data=pool2, kernel=(3,3), num_filter=196)  
  21.     bn3 = mx.symbol.BatchNorm(data=conv3)  
  22.     relu3 = mx.symbol.Activation(data=bn3, act_type="relu")  
  23.     pool3 = mx.symbol.Pooling(data=relu3, pool_type="max",  
  24.               kernel=(2,2), stride=(2,2), name="final_pool")  
  25.     # first fullc  
  26.     flatten = mx.symbol.Flatten(data=pool3)  
  27.     fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=420)  
  28.     relu4 = mx.symbol.Activation(data=fc1, act_type="relu")  
  29.     # second fullc  
  30.     fc2 = mx.symbol.FullyConnected(data=relu4, num_hidden=num_classes)  
  31.     # loss  
  32.     softmax = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')  
  33.     return softmax  

   train_UCM.py

   

[python] view plain copy
  1. import find_mxnet  
  2. import mxnet as mx  
  3. import argparse  
  4. import os, sys  
  5. import train_model  
  6.   
  7. parser = argparse.ArgumentParser(description='train an image classifer on UCMnet')  
  8. parser.add_argument('--network', type=str, default='UCM_128_BN3layer',  
  9.                     help = 'the cnn to use')  
  10. parser.add_argument('--data-dir', type=str, default='/home/panda/Ureserch/data/Scene/UCM/',  
  11.                     help='the input data directory')  
  12. parser.add_argument('--gpus', type=str, default='0',  
  13.                     help='the gpus will be used, e.g "0,1,2,3"')  
  14. parser.add_argument('--num-examples', type=int, default=1680,  
  15.                     help='the number of training examples')  
  16. parser.add_argument('--batch-size', type=int, default=64,  
  17.                     help='the batch size')  
  18. parser.add_argument('--lr', type=float, default=.01,  
  19.                     help='the initial learning rate')  
  20. parser.add_argument('--lr-factor', type=float, default=.94,  
  21.                     help='times the lr with a factor for every lr-factor-epoch epoch')  
  22. parser.add_argument('--lr-factor-epoch', type=float, default=5,  
  23.                     help='the number of epoch to factor the lr, could be .5')  
  24. parser.add_argument('--model-prefix', type=str,  
  25.                     help='the prefix of the model to load/save')  
  26. parser.add_argument('--num-epochs', type=int, default=80,  
  27.                     help='the number of training epochs')  
  28. parser.add_argument('--load-epoch', type=int,  
  29.                     help="load the model on an epoch using the model-prefix")  
  30. parser.add_argument('--kv-store', type=str, default='local',  
  31.                     help='the kvstore type')  
  32. # 存放训练信息,用来画 training curve  
  33. parser.add_argument('--log-file', type=str,default="xxx",  
  34.                     help='the name of log file')  
  35. parser.add_argument('--log-dir', type=str, default="/xxx/xxx/xxx/",  
  36.                     help='directory of the log file')  
  37. args = parser.parse_args()   
  38.   
  39. # network  
  40. import importlib  
  41. net = importlib.import_module('symbol_' + args.network).get_symbol(21)  
  42.   
  43.   
  44.   
  45. # data   如果没有 image-mean , 会自动计算,存放于 args.data_dir + "xxx.bin"  
  46. def get_iterator(args, kv):  
  47.     data_shape = (3109109)  
  48.   
  49.     train = mx.io.ImageRecordIter(  
  50.         path_imgrec = args.data_dir + "xxx.rec",  
  51.         mean_img    = args.data_dir + "xxx.bin",          
  52.         data_shape  = data_shape,  
  53.         batch_size  = args.batch_size,  
  54.         rand_crop   = True,  
  55.         rand_mirror = True,  
  56.         num_parts   = kv.num_workers,  
  57.         part_index  = kv.rank)  
  58.   
  59.     val = mx.io.ImageRecordIter(  
  60.         path_imgrec = args.data_dir + "xxxrec",  
  61.         mean_img    = args.data_dir + "xxx.bin",  
  62.         rand_crop   = False,  
  63.         rand_mirror = False,  
  64.         data_shape  = data_shape,  
  65.         batch_size  = args.batch_size,  
  66.         num_parts   = kv.num_workers,  
  67.         part_index  = kv.rank)  
  68.   
  69.     return (train, val)  
  70.   
  71.   
  72. # train  
  73. train_model.fit(args, net, get_iterator)  

3.  利用 log 画 training和val曲线

    需用到matplotlib,提前安装

[python] view plain copy
  1. import matplotlib.pyplot as plt  
  2. import numpy as np  
  3. import re  
  4. import argparse  
  5.   
  6. parser = argparse.ArgumentParser(description='Parses log file and generates train/val curves')  
  7. parser.add_argument('--log-file', type=str,default="/home/panda/Ureserch/mxnet_panda/UCM_EXP/UCM_128_log_4",  
  8.                     help='the path of log file')  
  9. args = parser.parse_args()  
  10.   
  11.   
  12. TR_RE = re.compile('.*?]\sTrain-accuracy=([\d\.]+)')  
  13. VA_RE = re.compile('.*?]\sValidation-accuracy=([\d\.]+)')  
  14.   
  15. log = open(args.log_file).read()  
  16.   
  17. log_tr = [float(x) for x in TR_RE.findall(log)]  
  18. log_va = [float(x) for x in VA_RE.findall(log)]  
  19. idx = np.arange(len(log_tr))  
  20.   
  21. plt.figure(figsize=(86))  
  22. plt.xlabel("Epoch")  
  23. plt.ylabel("Accuracy")  
  24. plt.plot(idx, log_tr, 'o', linestyle='-', color="r",  
  25.          label="Train accuracy")  
  26.   
  27. plt.plot(idx, log_va, 'o', linestyle='-', color="b",  
  28.          label="Validation accuracy")  
  29.   
  30. plt.legend(loc="best")  
  31. plt.xticks(np.arange(min(idx), max(idx)+15))  
  32. plt.yticks(np.arange(010.2))  
  33. plt.ylim([0,1])  
  34. plt.show()  

4. 保存训练好的模型

  在  train_model.py 加入如下代码,训练完成后保存

[python] view plain copy
  1. prefix = 'UCM_MODEL'  
  2. iteration = args.num_epochs  
  3. model.save(prefix, iteration)  

5. 利用保存的模型进行predict

 predict_UCM.py

[python] view plain copy
  1. import find_mxnet  
  2. import mxnet as mx  
  3. import logging  
  4. import argparse  
  5. import os, sys  
  6. import train_model  
  7. import numpy as np  
  8.   
  9. # 这里用的 mxnet 的 imanet训练的 Inception模型, 其他模型同理  
  10. prefix = '/home/panda/Ureserch/mxnet_panda/inception-21k model/Inception'  
  11. iteration = 9  
  12. model_load = mx.model.FeedForward.load(prefix, iteration)  
  13. data_shape = (3224224)  
  14.   
  15. # 数据准备  batch_size = 1.    
  16. val = mx.io.ImageRecordIter(  
  17.         path_imgrec = '/xxx/xxx/' + "xxx.rec",  
  18.         mean_img    = '/xxx/xxx/' + "xxx.bin",  
  19.         rand_crop   = False,  
  20.         rand_mirror = False,  
  21.         data_shape  = data_shape,  
  22.         batch_size  = 1)  
  23.   
  24. [prob, data1, label1] = model_load.predict(val, return_data=True)  

6 利用 pretrain模型提取任意层特征

feature_extraction.py

模型和数据准备如 step.5, 还是

[python] view plain copy
  1. internals = model_load.symbol.get_internals()  
  2. # 记住要提取特征的那一层的名字。 我这是 flatten 。   
  3. fea_symbol = internals["flatten_output"]  
  4. feature_extractor = mx.model.FeedForward(ctx=mx.gpu(), symbol=fea_symbol, numpy_batch_size=1,  
  5.                                          arg_params=model_load.arg_params, aux_params=model_load.aux_params,  
  6.                                          allow_extra_params=True)  
  7. [val_feature, valdata, vallabel]= feature_extractor.predict(val, return_data=True)  
  8.   
  9. 利用 scipy 保存 为 matlab格式 。毕竟matlab简单好操   
  10. import scipy.io as sio  
  11. sio.savemat('/xxx/xxx.mat', {'val_feature':val_feature})  

7 利用 pretrain 模型来初始化你的网络参数。
   再续

你可能感兴趣的:(mxnet)