天天看點

眼底圖分類(二) 初試keras-sequential模型

當圖檔經曆了最naive的預處理後,我決定用最naive的方法跑一遍圖像分類的流程。  

于是會遇到三個主要突破口: 

1. 熟悉keras架構的sequential模型。 

2. 熟悉如何在中間記錄訓練的參數,友善後面debug

3. 熟悉在遠端伺服器上跑通自己的代碼 

一. keras的sequential模型初探

1. 最主要的肯定是看它的官方連結咯~ 講真無論是安裝、還是快速上手,寫的真的好。 英語不好的話配合google翻譯一起用效率更佳~

2. 首先建立一個模型 self.model = Sequential()

3. 然後就可以一層層往裡加了,以我的履歷模型的第一個block(conv-pool-conv-pool)為例的話就是

def comment_build(self):
        self.model = Sequential()
	#block 1
        self.model.add(Conv2D(32, (3,3),  input_shape=(512, 512, 3), kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01),  padding='same',name='block1_conv1'))
        self.model.add(LeakyReLU(alpha=0.01)) 
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((3, 3), strides=(2, 2), name='block1_pool1'))
        self.model.add(Conv2D(32, (3,3), kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01), padding='same', name='block1_conv2'))
        self.model.add(LeakyReLU(alpha=0.01))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((3, 3), strides=(2, 2), name='block1_pool2'))
           

這裡第2行的LeakyRelu也可以作為第一行的一個arguments,能運作但是會給warning

4. 第4步是compile 

sgd = SGD(lr=lr, decay=decay, momentum=0.9, nesterov=False)
self.model.compile(optimizer=sgd, loss='categorical_crossentropy',
                metrics=['categorical_accuracy', sensi, speci]) 
           

optimizer最常見的就是rmsprop & adagrad  loss最常見的就是⬆️和mse

metrics後面的是可以自定義的函數(例如這裡的sensi, speci,一般輸入都依次是y_true, y_pred)。 

5. 最後一步就是訓練 model.fit

hs = self.model.fit_generator(train_generator,
                                steps_per_epoch = len(y_train)/batch_size,
                                epochs = epoch,
                                verbose = 2,
                                validation_data = validate_generator,
                                validation_steps = len(y_valid),
                                initial_epoch = 0                
                                )
           

     訓練時可以用更容易上手的fit,也可以用我的fit_generator 

二. 關于記錄參數

1. 首先還是看callbacks的官方文檔咯

2. 我這裡主要用到了它的3個子函數

  1)History:  如最直白的中文翻譯

 hs = History()

hs = self.model.fit_generator(train_generator,....)

df = pd.DataFrame(hs.history)   #pd是pandas的縮寫。 它的官方文檔寫的也很好

df.to_csv('%s_hist.csv' % time.strftime("%Y%m%d%H%M%S", time.localtime()))

  2)  TensorBoard: 用來列印train&test中的metrics

tb = TensorBoard(log_dir='logs', histogram_freq=5)  #意思是會儲存到logs檔案夾裡, 每個epoch列印5次activation&weight histograms

  3)  EarlyStopping:  在訓練中實時監測,如果監測量沒有變更優就提前結束訓練。 

es = EarlyStopping(monitor='loss', min_delta=0.0008, patience=2, mode='min',verbose = 0)

      #檢測loss 如果連續2輪的min(decrease) 都<min_delta就early stopping

         最後結合成一個arguments callbacks = [tb, hs, es] 放到model.fit裡。

三. 在遠端伺服器上跑通自己的程式

1. 配置安裝包

pip install upgrade virtualenv

virtualenv .env

source .env/bin/activate

pip install --upgrade tensorflow

pip install keras

pip install pandas

pip install pillow

pip install -U scikit-learn

反正這裡就隻想感歎一下virtualenv大法好,我在mac和linux伺服器上都用⬆️的法子配置好的。一開始在mac上各種sudo 感覺自己就像個傻子 emmm

2. 可能會用到scp指令跨伺服器拷貝圖檔 

           我是參考的這個連結,感覺寫的很贊。我用的是 scp -r local_folder [email protected]_ip:remote_folder  就可以拷貝檔案夾了~

3.  防止因為電腦斷線程式down掉。

還記得昨天那個月黑風高的晚上,我在0:03終于跑通了程式離開軟體園,回校的路上遇到了各種發絲在風中亂揚的同類。然後,今天早上到實驗室迎接我的就一個packet_write_wait: Connection to 192.168.0.15 port 22: Broken pipe的bug...emmm....

其實解決起來還是挺容易的,詳見這裡, 我用了其中的screen的法子,目前還挺順溜。。 

以上。 代碼和人都比較naive,歡迎指正,不勝感激。

代碼github連結在這兒, 待更新。

繼續閱讀