1. 程式人生 > >mxnet深度學習實戰:跑自己的資料實驗和一些問題總結

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

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

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

3.  利用 log 畫 training和val曲線

    需用到matplotlib,提前安裝

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

4. 儲存訓練好的模型

  在  train_model.py 加入如下程式碼,訓練完成後儲存

  1. prefix = 'UCM_MODEL'
  2. iteration = args.num_epochs  
  3. model.save(prefix, iteration)  

5. 利用儲存的模型進行predict

 predict_UCM.py

  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. # 這裡用的 mxnet 的 imanet訓練的 Inception模型, 其他模型同理
  9. prefix = '/home/panda/Ureserch/mxnet_panda/inception-21k model/Inception'
  10. iteration = 9
  11. model_load = mx.model.FeedForward.load(prefix, iteration)  
  12. data_shape = (3224224)  
  13. # 資料準備  batch_size = 1.  
  14. val = mx.io.ImageRecordIter(  
  15.         path_imgrec = '/xxx/xxx/' + "xxx.rec",  
  16.         mean_img    = '/xxx/xxx/' + "xxx.bin",  
  17.         rand_crop   = False,  
  18.         rand_mirror = False,  
  19.         data_shape  = data_shape,  
  20.         batch_size  = 1)  
  21. [prob, data1, label1] = model_load.predict(val, return_data=True)  

6 利用 pretrain模型提取任意層特徵

feature_extraction.py

模型和資料準備如 step.5, 還是

  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. 利用 scipy 儲存 為 matlab格式 。畢竟matlab簡單好操   
  9. import scipy.io as sio  
  10. sio.savemat('/xxx/xxx.mat', {'val_feature':val_feature})  

7 利用 pretrain 模型來初始化你的網路引數。
   再續