當圖檔經曆了最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連結在這兒, 待更新。