首這一次我們講講keras這個簡單、流行的深度學習框架,一個影象分類任務從訓練到測試出結果的全流程。
相關的程式碼、資料都在我們 Git 上,希望大家 Follow 一下這個 Git 專案,後面會持續更新不同框架下的任務。
https://
github。com/longpeng2008
/LongPeng_ML_Course
01 keras是什麼
Keras是一個非常流行、簡單的深度學習框架,它的設計參考了torch,用Python語言編寫,是一個高度模組化的神經網路庫,支援GPU和CPU。能夠在TensorFlow,CNTK或Theano之上執行。 Keras的特點是能夠快速實現模型的搭建, 簡單方便地讓你實現從想法到實驗驗證的轉化,這都是高效地進行科學研究的關鍵。
02 Keras 安裝配置
Keras的安裝非常簡單,但是需要先安裝一個後端框架作為支撐,TensorFlow, CNTK,Theano都可以,但是官網上強烈建議使用TensorFlow作為Keras的後端進行使用。本例以TensorFlow 1。4。0 版本作為Keras的後端進行測試。
sudo pip install tensorflow==1。4。0
sudo pip install keras==2。1。4
透過上面兩條命令就可以完成TensorFlow和Keras的安裝,此處需要注意的一點是Keras的版本和TensorFlow的版本要對應,否則會出現意外的錯誤。具體版本對應關係可在網上進行查詢。
03 Keras 自定義資料
3.1 MNIST例項
MNIST手寫字元分類被認為是深度學習框架裡的“Hello Word!”,下面簡單介紹一下MNIST資料集案例的測試。Keras的官方github的example目錄下提供了幾個MNIST案例的程式碼,下載mnist_mlp。py,mnist_cnn。py檔案,本地執行即可,其他檔案讀者也可以自行測試。
3.2 資料定義
前面我們介紹了MNIST資料集例項,很多讀者在學習深度學習框架的時候都卡在了這一步,執行完MNIST例項之後無從下手,很大原因可能是因為不知道怎麼處理自己的資料集,這一節我們透過一個簡單的影象二分類案例,介紹如何實現一個自定義的資料集。
資料處理有幾種方式,一種是像MNIST、CIFAR資料集,這些資料集的特點是已經為使用者打包封裝好了資料。使用者只要load_data即可實現資料匯入。其實就是事先把資料進行解析,然後儲存到。pkl 或者。h5等檔案中,然後在訓練模型的時候直接匯入,輸入到網路中;另一種是直接從本地讀取檔案,解析成網路需要的格式,輸入網路進行訓練。但是實際情況是,為了某一個專案我們不可能總是找到相應的打包好的資料集供使用,這時候自己建立一個dataset就十分重要。
Keras提供了一個影象資料的資料增強檔案,呼叫這個檔案我們可以實現網路資料載入的功能。
此處採用keras的processing模組裡的ImageDataGenerator類定義一個影象分類任務的dataset生成器:
train_data_dir = ‘。。/。。/。。/。。/datas/head/train/’
validation_data_dir = ‘。。/。。/。。/。。/datas/head/val’
# augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
rescale=1。 / 255,
shear_range=0。2,
zoom_range=0。2,
horizontal_flip=True)
# augmentation configuration use for testing only rescaling
val_datagen = ImageDataGenerator(rescale=1。 / 255)
train_generator = train_datagen。flow_from_directory(
train_data_dir,
target_size=(48, 48),
batch_size=16)
val_generator = val_datagen。flow_from_directory(
validation_data_dir,
target_size=(48, 48),
batch_size=16)
下面簡單地介紹一下上面的程式碼,完整程式碼請移步Git工程。
Keras的processing模組中提供了一個能夠實時進行資料增強的影象生成類ImagGenerator,該類下面有一個函式flow_from_directory,顧名思義該函式就是從資料夾中獲取影象資料。關於ImageGenerator更多的使用可以參考官方原始碼。資料集結構組織如下:
datas/train/left/*。jpg
datas/train/right/*。jpg
datas/val/left/*。jpg
datas/val/right/*。jpg
此處還需要注意的一點是,我們現在進行的是簡單的影象分類任務訓練,假如要完成語義分割,目標檢測等任務,則需要自定義一個類(繼承ImageDataGenerator),具體實現可以查詢相關程式碼進行參考。
04 Keras 網路搭建
Keras網路模型搭建有兩種形式,Sequential 順序模型和使用函式式API的 Model 類模型。本教程的例子採用一個簡單的三層卷積,以及兩層全連線和一個分類層組成的網路模型。由於函式式API更靈活方便,因此下面採用函式式方法搭建模型,模型定義如下:
4.1 函式式API
def simpleconv3(input_shape=(48, 48, 3), classes=2):
img_input = Input(shape=input_shape)
bn_axis = 3
x = Conv2D(12, (3, 3), strides=(2, 2), padding=‘same’, name=‘conv1’)(img_input)
x = BatchNormalization(axis=bn_axis, name=‘bn_conv1’)(x)
x = Activation(‘relu’)(x)
x = Conv2D(24, (3, 3), strides=(2, 2), padding=‘same’, name=‘conv2’)(x)
x = BatchNormalization(axis=bn_axis, name=‘bn_conv2’)(x)
x = Activation(‘relu’)(x)
x = Conv2D(48, (3, 3), strides=(2, 2), padding=‘same’, name=‘conv3’)(x)
x = BatchNormalization(axis=bn_axis, name=‘bn_conv3’)(x)
x = Activation(‘relu’)(x)
x = Flatten()(x)
x = Dense(1200, activation=‘relu’)(x)
x = Dense(128, activation=‘relu’)(x)
x = Dense(classes, activation=‘softmax’)(x)
model = Model(img_input, x)
return model
x = Conv2D(12, (3, 3), strides=(2, 2), padding=‘same’, name=‘conv1’)(img_input)
即輸出是12通道,卷積核大小3*3,步長為2,padding=‘same’表示邊緣補零
x = BatchNormalization(axis=bn_axis, name=‘bn_conv1’)(x)
axis表示需要歸一化的座標軸,bn_axis=3,由於採用TensorFlow作為後端,因此這句程式碼表示在通道數座標軸進行歸一化。
x = Flatten()(x) 表示將卷積特徵圖進行拉伸,以便和全連線層Dense()進行連線。
x = Dense(1200, activation=‘relu’)(x)
Dense()實現全連線層的功能,1200是輸出維度,‘relu‘表示啟用函式,使用其他函式可以自行修改。
最後一層採用‘softmax’啟用函式實現分類功能。
最終返回Model,包含網路的輸入和輸出。
4.2 模型編譯
網路搭建完成,在網路訓練前需要進行編譯,包括學習方法、損失函式、評估標準等,這些引數分別可以從optimizer、loss、metric模組中匯入。具體程式碼如下:
from keras。optimizers import SGD
from keras。losses import binary_crossentropy
from keras。metrics import binary_accuracy
from keras。callbacks import TensorBoard
tensorboard = TensorBoard(log_dir=(’。/logs‘))
callbacks = []
callbacks。append(tensorboard)
loss = binary_crossentropy
metrics = [binary_accuracy]
optimizer = SGD(lr=0。001, decay=1e-6, momentum=0。9)
其中callbacks模組包含了TensorBoard, ModelCheckpoint,LearningRateScheduler等功能,分別可以用來視覺化模型,設定模型檢查點,以及設定學習率策略。
05 模型訓練、測試
5.1 模型訓練
Keras模型訓練過程非常簡單,只需一行程式碼,設定幾個引數即可,具體程式碼如下:
history = model。fit_generator(
train_generator,
steps_per_epoch=num_train_samples // batch_size,
epochs=epochs,
callbacks=callbacks,
validation_data=val_generator,
validation_steps=num_val_samples // batch_size)
首先指定資料生成器,train_generator, 前面介紹過;steps_per_epoch是每次epoch迴圈的次數,透過訓練樣本數除以batch_size得到;epochs是整個資料集重複多少次訓練。
Keras是高度封裝的,在模型訓練過程中,看不到網路的預測結果和網路的反向傳播過程,只需定義好損失函式,事實上,網路定義中的模型輸出會包含網路的輸入和輸出。
5.2 訓練過程視覺化
keras可以採用tensorboard實現訓練過程的視覺化。執行完下面的命令就可以在瀏覽器訪問
http://
127。0。0。1:6006
檢視效果。
tensorboard ——logdir 日誌檔案路徑(預設路徑=‘。/logs’’)
上面是分別是訓練和測試過程的loss和accuracy。
5.3 模型測試
model = simpleconv3()
model。load_weights(model_path, by_name=True)
image_path = ’。。/。。/。。/。。/datas/head/train/0/1left。jpg‘
img = Image。open(image_path)
img = img_to_array(img)
img = cv2。resize(img, image_size)
img = np。expand_dims(img, axis=0)
img = preprocess_input(img)
result = model。predict(img, batch_size=1)
print(result)
以上程式碼簡單介紹一下:模型測試流程非常清晰,首先載入模型,載入引數>>將資料輸入網路>>模型預測。
06 模型儲存和匯入
model = train_model(model, loss, metrics, optimizer, num_epochs)
os。mkdir(’models‘)
model。save_weights(’models/model。h5‘)
模型訓練完成後,僅需用model。save_weights(’models/model。h5‘)一句程式碼就可以完成模型的儲存。同樣,模型的匯入採用model。load_weights(model_path, by_name=True),需要注意的是要設定by_name=True,這樣就能保證和模型名稱一樣的引數都能載入到模型,當然模型定義要和引數是匹配的,假如要進行fine-tune我們只需保證需要重新訓練或者新加的網路層的名稱和預載入模型引數名稱不一樣就可以。
07 總結
以上內容涵蓋了採用keras進行分類任務的全部流程,從資料匯入、模型搭建、模型訓練、測試,模型儲存和匯入幾個方面分別進行了介紹。當然這只是一些基本的應用,還有一些高階、個性化功能需要我們進一步學習,有機會,下一次介紹一下自定義網路層、設定check_point、特徵視覺化等特性。
本系列完整文章:
第一篇:【caffe速成】caffe影象分類從模型自定義到測試
第二篇:【tensorflow速成】Tensorflow影象分類從模型自定義到測試
第三篇:【pytorch速成】Pytorch影象分類從模型自定義到測試
第四篇:【paddlepaddle速成】paddlepaddle影象分類從模型自定義到測試
第五篇:【Keras速成】Keras影象分類從模型自定義到測試
第六篇:【mxnet速成】mxnet影象分類從模型自定義到測試
第七篇:【cntk速成】cntk影象分類從模型自定義到測試
第八篇:【chainer速成】chainer影象分類從模型自定義到測試
第九篇:【DL4J速成】Deeplearning4j影象分類從模型自定義到測試
第十篇:【MatConvnet速成】MatConvnet影象分類從模型自定義到測試
第十一篇:【Lasagne速成】Lasagne/Theano影象分類從模型自定義到測試
第十二篇:【darknet速成】Darknet影象分類從模型自定義到測試