最近工做要開始用到MXnet,然而MXnet的文檔寫的實在是.....因此在這記錄點東西,方便本身,也方便你們。python
我以爲搞清楚一個框架怎麼使用,第一步就是用它來訓練本身的數據,這是個很關鍵的一步。 架構
1、MXnet數據預處理app
整個數據預處理的代碼都集成在了toosl/im2rec.py中了,這個首先要造出一個list文件,lst文件有三列,分別是index label 圖片路徑。以下圖所示:框架
我這個label是瞎填的,因此都是0。另外最新的MXnet上面的im2rec是有問題的,它生成的list全部的index都是0,不過聽說這個index沒什麼用.....但我仍是改了一下。把yield生成器換成直接append便可。dom
執行的命令以下:ide
sudo python im2rec.py --list=True /home/erya/dhc/result/try /home/erya/dhc/result/ --recursive=True --shuffle=true --train-ratio=0.8 this
每一個參數的意義在代碼內部均可以查到,簡單說一下這裏用到的:--list=True說明此次的目的是make list,後面緊跟的是生成的list的名字的前綴,我這裏是加了路徑,而後是圖片所在文件夾的路徑,recursive是是否迭代的進入文件夾讀取圖片,--train-ratio則表示train和val在數據集中的比例。spa
執行上面的命令後,會獲得三個文件:3d
而後再執行下面的命令生成最後的rec文件:code
sudo python im2rec.py /home/erya/dhc/result/try_val.lst /home/erya/dhc/result --quality=100
以及,sudo python im2rec.py /home/erya/dhc/result/try_train.lst /home/erya/dhc/result --quality=100
來生成相應的lst文件的rec文件,參數意義太簡單就不說了..看着就明白,result是我存放圖片的目錄。
這樣最終就完成了數據的預處理,簡單的說,就是先生成lst文件,這個其實徹底能夠本身作,並且後期我作segmentation的時候,label就是圖片了..
2、很是簡單的小demo
先上代碼:
1 import mxnet as mx 2 import logging 3 import numpy as np 4 5 logger = logging.getLogger() 6 logger.setLevel(logging.DEBUG)#暫時不須要管的log 7 def ConvFactory(data, num_filter, kernel, stride=(1,1), pad=(0, 0), act_type="relu"): 8 conv = mx.symbol.Convolution(data=data, workspace=256, 9 num_filter=num_filter, kernel=kernel, stride=stride, pad=pad) 10 return conv #我把這個刪除到只有一個卷積的操做 11 def DownsampleFactory(data, ch_3x3): 12 # conv 3x3 13 conv = ConvFactory(data=data, kernel=(3, 3), stride=(2, 2), num_filter=ch_3x3, pad=(1, 1)) 14 # pool 15 pool = mx.symbol.Pooling(data=data, kernel=(3, 3), stride=(2, 2), pool_type='max') 16 # concat 17 concat = mx.symbol.Concat(*[conv, pool]) 18 return concat 19 def SimpleFactory(data, ch_1x1, ch_3x3): 20 # 1x1 21 conv1x1 = ConvFactory(data=data, kernel=(1, 1), pad=(0, 0), num_filter=ch_1x1) 22 # 3x3 23 conv3x3 = ConvFactory(data=data, kernel=(3, 3), pad=(1, 1), num_filter=ch_3x3) 24 #concat 25 concat = mx.symbol.Concat(*[conv1x1, conv3x3]) 26 return concat 27 if __name__ == "__main__": 28 batch_size = 1 29 train_dataiter = mx.io.ImageRecordIter( 30 shuffle=True, 31 path_imgrec="/home/erya/dhc/result/try_train.rec", 32 rand_crop=True, 33 rand_mirror=True, 34 data_shape=(3,28,28), 35 batch_size=batch_size, 36 preprocess_threads=1)#這裏是使用咱們以前的創造的數據,簡單的說就是要本身寫一個iter,而後把相應的參數填進去。 37 test_dataiter = mx.io.ImageRecordIter( 38 path_imgrec="/home/erya/dhc/result/try_val.rec", 39 rand_crop=False, 40 rand_mirror=False, 41 data_shape=(3,28,28), 42 batch_size=batch_size, 43 round_batch=False, 44 preprocess_threads=1)#同理 45 data = mx.symbol.Variable(name="data") 46 conv1 = ConvFactory(data=data, kernel=(3,3), pad=(1,1), num_filter=96, act_type="relu") 47 in3a = SimpleFactory(conv1, 32, 32) 48 fc = mx.symbol.FullyConnected(data=in3a, num_hidden=10) 49 softmax = mx.symbol.SoftmaxOutput(name='softmax',data=fc)#上面就是定義了一個巨巨巨簡單的結構 50 # For demo purpose, this model only train 1 epoch 51 # We will use the first GPU to do training 52 num_epoch = 1 53 model = mx.model.FeedForward(ctx=mx.gpu(), symbol=softmax, num_epoch=num_epoch, 54 learning_rate=0.05, momentum=0.9, wd=0.00001) #將整個model訓練的架構定下來了,相似於caffe裏面solver所作的事情。 55 56 # we can add learning rate scheduler to the model 57 # model = mx.model.FeedForward(ctx=mx.gpu(), symbol=softmax, num_epoch=num_epoch, 58 # learning_rate=0.05, momentum=0.9, wd=0.00001, 59 # lr_scheduler=mx.misc.FactorScheduler(2)) 60 model.fit(X=train_dataiter, 61 eval_data=test_dataiter, 62 eval_metric="accuracy", 63 batch_end_callback=mx.callback.Speedometer(batch_size))#開跑數據。