【Keras速成】Keras图像分类从模型自定义到测试
文章首發于微信公眾號《與有三學AI》
【Keras速成】Keras圖像分類從模型自定義到測試
這是給大家準備的Keras速成例子
這一次我們講講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、特征可視化等特性。
?
同時,在我的知乎專欄也會開始同步更新這個模塊,歡迎來交流
https://zhuanlan.zhihu.com/c_151876233
注:部分圖片來自網絡
—END—
本系列完整文章:
第一篇:【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圖像分類從模型自定義到測試
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續內容將會不定期奉上,歡迎大家關注有三公眾號 有三AI!
?
?
?
總結
以上是生活随笔為你收集整理的【Keras速成】Keras图像分类从模型自定义到测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【tensorflow速成】Tensor
- 下一篇: 【mxnet速成】mxnet图像分类从模