mxnetはデータを処理してから訓練を始めます.

13651 ワード

caffe依存性が多すぎて、構成が複雑です.
mxnetの長所は明らかで、簡潔で、効率的で、多機多カードのサポートが良いです.
mxnetのgithubダウンロードリンク:https://github.com/dmlc/mxnet/
mxnetの開発文書リンク:http://mxnet.readthedocs.org/en/latest/build.html
開発された文書は分かりやすく、インストール、文法、例などが含まれています.
1-トレーニング画像をフォーマットに変換し、ネットワークに送る方法
caffeでモデルをトレーニングする前に、トレーニング画像をleveldbまたはLMBB形式のデータに変換するように、mxnetは訓練前に画像をREC形式のデータに変換します.
ここでは、変換プロセスを直接記録し、RECデータフォーマットのコードと最終的にどのようにRECフォーマットデータをネットワークに再ロードするかを詳細に説明します.
Linuxの下で変換するためのツールはmxnet/binの下で「im 2 rec」という実行可能ファイルです.ファイルのソースはmxnet/tools/m 2 rec.cを確認できます.
まず、以下のim 2 recの変換ツールにはどのような入力パラメータがあるかを説明する.
まず入力しなければならない3つのパラメータです.順番は
image_lst:  //               

image_root_dir://       

output_rec://    .rec         
オプションの入力パラメータはあります.

label_width://    ,   1,           

resize: //   -1,        。               resize  ,        
    %%       300*200,resize=100,           150*100.

quality: //JPEG    ,   80。     1-100.(mxnet           )

center_crop: //   0,if(center_crop),             。  :  if(resize>0)   ,      。

nsplit://   1,           ,     image_lst      nsplit part
    %%  ,        ,  12     ,nsplit=35+4+34+4+4.(            )

part: //   0,           。 nsplit    ,     nsplit   part   
  • 1
  • (1)まず写真とラベル情報を保存するテキストです.ここで私のファイルはtrain.txtです.
             
    1 0 FY2D1.bmp
    2 1 FY2E1.bmp
    3 0 FY2D2.bmp
    4 1 FY2E2.bmp
  • 1
  • ,
  • (2)パラメータの運転と調整を容易にするために、ここにはWindowsバッチ処理コマンドのような実行可能ファイルを書いて、im 2 recを呼び出します.ここで私の実行可能ファイル名はconvert.shで、トレーニング画像はdataフォルダに格納されています.変換後の結果は現在のフォルダに保存され、trin.recと名付けられました.
    #!/bin/sh
    /home/zfan/mxnet/bin/im2rec train.txt data/ train.rec quality=90 resize=1000
    (3)端末を開けて、cdからconvert.shのあるフォルダに入力してください.運転ヒントは以下の通りです.
    [15:44:19] tools/im2rec.cc:54: New Image Size: Short Edge 1000
    [15:44:19] tools/im2rec.cc:76: Write to output: train.rec
    [15:44:19] tools/im2rec.cc:78: Output: train.rec
    [15:44:19] tools/im2rec.cc:86: JPEG encoding quality: 90
    [15:44:19] tools/im2rec.cc:160: Total: 4 images processed, 0.166033 sec elapsed
    
  • 1
  • ,
  • 4
  • 5
  • ディケンサ-変換後のデータをネットワークに送る:
    全体として、トレーニングを開始するには、3つの部分が必要である.トレーニングパラメータ、ネットワークモデル、トレーニングデータ.前のセクションでは、どのように元の画像データをmxnetに変換することができますか?RECフォーマットのデータを紹介しました.しかし、実際に訓練する時、RECデータを私達のトレーニングネットワークに送るツールが必要です.このツールは「ディエゼル」です.
    mxnetは、私たちのために、迅速にサブジェネレータを構築するための関数ImagerecordIterを提供しています.この関数はpython/mxnet/io.pyに位置しています.または、pythonコマンドウィンドウに以下のコマンドを入力して、io関数の位置および説明を取得することができます.
    import mxnet as mx
    help(mx.io)
    #    help(mx.io.ImageRecordIter)             
  • 1
  • 次に、ImageRecordIterのいくつかの一般的なパラメータについて説明します.
    
    path_imgrec:rec         ;string   ;   './data/imgrec.rec'
    
    data_shape:              ,        ;     ;    
    
    mean_img:           ;string   ;    
    
    batch_size:batch   ;int   ;    
    
    shuffle:      ;     ;   False;
    
    mirror:           ;     ;   False;
    
    rand_mirror:              ;     ;   False;
    
    rand_crop:              ;     ;   False;
    
    label_width:       ;int   ;   1
    
    mean_r、 mean_g、 mean_b:3        ;float   ;   0
    
    num_parts:         ;int   ;   1
    
    part_index:           ;int   ;   0
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • 15
  • ,
  • ,
  • ,
  • 1
  • 次に、この例がexample/image-classication/trin_にある場合の例を例に挙げて説明する.イメージnet.py中
    #                    
    def get_iterator(args, kv):
        train = mx.io.ImageRecordIter(
            path_imgrec = args.data_dir + "train.rec",
            mean_img    = args.data_dir + "mean.bin",
            data_shape  = data_shape,
            batch_size  = args.batch_size,
            rand_crop   = True,
            rand_mirror = True,
            num_parts   = kv.num_workers,
            part_index  = kv.rank)
        val = mx.io.ImageRecordIter(
            path_imgrec = args.data_dir + "val.rec",
            mean_img    = args.data_dir + "mean.bin",
            rand_crop   = False,
            rand_mirror = False,
            data_shape  = data_shape,
            batch_size  = args.batch_size,
            num_parts   = kv.num_workers,
            part_index  = kv.rank)
        return (train, val)
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • 15
  • ,
  • ,
  • ,
  • 一つのネットワークモデルはコネクタの層が一つですので、ネットワークモデルを構築したいです.まずmxnetにはどのような層がありますか?(以下は使用頻度によって並べ替えます.)一般的な層を紹介します.より多くの層はpythonコマンドウィンドウで以下のコードを実行して調べられます.
    import mxnet as mx
    help(mx.symbol)
  • 1
  • 2ネットワークモデルを構築する
    (1)Activation:アクティブ関数
       data:     ,symbol   
       act_type: {'relu', 'sigmoid', 'tanh'},    3     
    (2)Convolution:畳込み層
    data:    ,symbol   
    weight:    ,symbol   
    bias:  ,symbol   
    kernal:      (y,x),  tuple   
    stride:    (y,x),  tuple   ,   (1,1)
    pad:      (y,x),  tuple   ,   (0,0)
    num_filter :     (  )  ,int   
    no_bias :      ,     ,   False
    num_group:groups     ,int   ,   1.     CUDNN   , you can use SliceChannel to num_group,apply convolution and concat instead to achieve the same need.
    workspace:   Tmp       MB。long   ,   512
  • 1
  • ,
  • (3)Deconvolution:反巻積層
            
  • 1
  • (4)Dropout:
    data:    ,symbol   
    p :           dropped out   ,float   ,   0.5
  • 1
  • (5)Flatten:N次元データを1次元にする
    data:    ,symbol   
    name : string, optional. Name of the resulting symbol.
  • 1
  • (6)FulyConneced:全連結層
    data:    ,symbol   
    weight:    ,symbol   
    bias:  ,symbol   
    no_bias :      ,     ,   False
    num_hidden:         ,int   
  • 1
  • ,
  • (7)LRN:
    data:    ,symbol   
    alpha : float, optional, default=0.0001.value of the alpha variance scaling parameter in the normalization formula
    beta : float, optional, default=0.75.value of the beta power parameter in the normalization formula
    knorm : float, optional, default=2.value of the k parameter in normalization formula
    nsize : int (non-negative), required.normalization window width in elements.
  • 1
  • ,
  • (8)Pooling
    data:    ,symbol   
    kernal:pooling    (y,x),  tuple   
    stride:pooling  (y,x),  tuple   ,   (1,1)
    pad:pooling    (y,x),  tuple   ,   (0,0)
    pool_type : pooling   ,   3 {'avg', 'max', 'sum'}
  • 1
  • ,
  • (9)SoftmaxOutput:loglossを使ってBPを行う
    data:    ,symbol   
    grad_scale :            ,float   ,   1
    multi_output :      ,   False
        # If set to true, for a (n,k,x_1,..,x_n) dimensionalinput tensor, softmax will generate n*x_1*...*x_n output, eachhas k classes
  • 1
  • ,
  • (10)Varable:smbol型変数を定義する
    name :      ,str   
    attr : dict of string -> string.Additional attributes to set on the variable.
  • 1
  • mxnet/example/image-classicationフォルダの下でsmbolで始まるいくつか.pyファイルは定義されたネットワークモデルです.私たちは任意に一つを開けて、具体的にネットワークを構築する方法を知ることができます.一つの注意が必要なのは、mxnetでは一般的に畳み込み層と全連結層の間の価格にFlatten層を入れて接続に使います.
    3-トレーニング開始
    まず、私たちは今何を持っていますか?ネットワークモデルを保存したpyファイル、RECフォーマットのトレーニングデータ、データをネットワークのローズマリーに送ります.この基礎の上で、私達の足りないのはネットの訓練のいくつかの制御のパラメーターだけが残ります.例えば、学習率、訓練の日誌、GPUの選択など.初期には、細かいことは気にしないで早く使ってもいいです.それなら、一番簡単な方法はカバーmxnetの例を直接修正することです.例は主に/example/image-classicationと/tests/pythonに集中しています.簡単なトレーニング方法を紹介します.(1)ファイルを新規作成して、ファイルの下でファイルを作成します.mxnet.py、smbol_alexnet.py、train_imagnet.pyとtrain_model.pyの4つのファイルのcopyが入ります.(2)find_を保つmxnet.pyファイルはそのままで、smbol_alexnet.pyでは、Alexnetネットワークの構築方法に従って、自分のネットワークを構築します.最后に、ファイル名を自分のネット名に変えたほうがいいです.mynet.pyのようです.(3)トレイをimagnet.pyも名前を修正した方がいいです.train_に変更してください.x.py.40行目のコードの中の「smbol」を削除します.そうでないと、あなたのネットワークファイルは「smbol」から命名しなければなりません.mynet.py.
    net = importlib.import_module('symbol_' + args.network).get_symbol(args.num_classes)
      :
    net = importlib.import_module(args.network).get_symbol(args.num_classes)
  • 1
  • ,
  • 残りはパーパー.add_です.argmentではデフォルト値を変更しました.そうでないと、mynet.pyを呼び出して各パラメータを正確に指定しなければなりません.(4)スクリプトファイルを書くと、スクリプトファイルを実行してトレーニングを開始できます.如き
    python train_xx.py --data-dir=xx --model-prefix==xx --gpus=0
    #        epoch         ,  model-prefix     
         :http://blog.csdn.net/shuzfan/article/details/50037273
    
  • 1