雲栖号: https://www.aliyun.com/#module-yedOfott8 第一手的上雲資訊,不同行業精選的上雲企業案例庫,基于衆多成功案例萃取而成的最佳實踐,助力您上雲決策!

圖源:Unsplash
在機器學習中,決定因素往往不是算法而是資料集的大小。——吳恩達
圖像分類即根據固定類别對輸入的圖像設定标簽。盡管計算機視覺過于簡單,但是它在實際中仍有廣泛的應用,而圖像分類就是其中的核心問題之一。
在本文中,小芯将示範如何在資料不足的情況下應用深度學習。現已建立特制汽車和巴士分類器兩個資料集,每個資料集包含100個圖像。其中,訓練集有70個圖像,驗證集有30個。
掌握深度學習,資料不足也能進行圖像分類
挑戰
- 視點變化:基于相機,單一對象執行個體可以從多個視角聚焦。
- 尺度變化:視覺分類常常存在尺度變化(這裡的尺度指的是現實世界中的物體的大小,而不僅僅就圖像而言)。
- 圖檔變形:許多目标對象并非剛體(指在運動中和受力作用後,形狀和大小不變,而且内部各點的相對位置不變的物體),可能會産生極端變形。
- 圖檔遮擋:目标對象可能會被遮擋,是以有時隻會顯示對象的一小部分(最少時可能隻有一些像素點)。
- 光照條件:光照影響在像素級别上非常明顯。
貓vs 狗圖像分類
應用
- 圖檔庫和視訊網站:促成圖檔網站每日數十億的搜尋量。為使用者提供工具,通過搜尋找到可視化内容。
- 為改善産品可尋性提供可視化搜尋:采用可視化搜尋,使用者可以将自行拍攝的圖像或網上下載下傳的圖像作為參考搜尋相似的圖像或産品。
- 安保行業:這項新興技術在安保行業舉足輕重,已用于研發多種安保裝置,如:無人機、監控攝像頭和用于面部識别的生物特征識别裝置等等。
- 醫療行業:醫療行業中,機器人驅動的顯微外科手術就利用了計算機視覺和圖像識别技術。
- 汽車行業:這項技術可以減少道路交通事故,促進人們遵守交通規則、維護交通秩序等。
資料量函數模型性能
環境和工具:
- Matplotlib
- keras
資料
這是一個二進制分類的問題。小芯下載下傳了200個圖像,其中100個為巴士圖像,剩下的是汽車圖像。現将資料分解如下所示:
dataset train
car
car1.jpg
car2.jpg
//
bus
bus1.jpg
bus2.jpg
// validation
//...
汽車
巴士
圖像分類
正式且完整的圖像分類路徑如下:
· 輸入包含N個圖像的訓練集,每個圖像均由單一類别标記,總共有兩種不同類别。
· 随後,利用該訓練集訓練分類器辨認各個類别的特征。
· 最後,要求分類器對之前從未接觸過的新圖像進行标簽預測,随後對比這些圖像的實際标簽和分類器預測的标簽,以此來評估分類器的性能。
首先是編寫代碼。
一開始先加載keras及其各層,這些将用于後面的模型建構。
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
viewrawimports6.py hostedwith ❤ by GitHub
接下來,構模組化型,可分為3步完成。
1.使用2個由卷積層和最大池化層組成的卷積塊,将線性整流函數(Rectified LinearUnit, ReLU)作為卷積層的激活函數。
2.最頂部使用flatten層,下面是分别由線性整流函數和S型函數作為激活函數的兩個完全連接配接層。
3.使用Adam優化器,交叉熵(cross-entropy)作為損失函數。
classifier = Sequential()
Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape= (64, 64, 3), activation='relu'))
Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size= (2, 2)))
Adding a second convolutional layer
classifier.add(Convolution2D(32, 3, 3, activation='relu'))
Step 3 - Flattening
classifier.add(Flatten())
Step 4 - Full connection
classifier.add(Dense(output_dim=128, activation='relu'))
classifier.add(Dense(output_dim=1, activation='sigmoid'))
Compiling the CNN
classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics= ['accuracy'])
viewrawmodel2.py hostedwith ❤ by GitHub
資料增強
資料增強是擴大訓練集規模的有效途徑。增強訓練樣例可以使網絡在訓練中擷取更多多樣化但仍具代表性的資料點。
下列代碼可以為訓練集定義一組增強操作:旋轉、平移、剪切、翻轉以及縮放。
如果資料集規模太小,就應該使用資料增強建立其它的訓練資料。
同時,小芯建立了一個資料生成器,以便自動從檔案夾中擷取資料并轉入Keras。Keras為此提供了便捷的python生成器函數。
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
width_shift_range=0.2,
height_shift_range=0.2,
rotation_range=15,
vertical_flip=True,
fill_mode='reflect',
data_format='channels_last',
brightness_range=[0.5, 1.5],
featurewise_center=True,
featurewise_std_normalization=True)
test_datagen = ImageDataGenerator(rescale=1./255)
training_set = train_datagen.flow_from_directory('dataset/train',
target_size= (64, 64),
batch_size=32,
class_mode='binary')
test_set = test_datagen.flow_from_directory('dataset/validation',
viewrawsplit_data.py hostedwith ❤ by GitHub
随後,該模型訓練了50個epoch,每個epoch共32個批次。
Batch size(批尺寸)是深度學習十分重要的超級參數之一。小芯更習慣用較大的Batch size(批大小)進行模型訓練,因為這樣可以允許圖形處理器并行的同時加快計算速度。
但是,衆所周知,Batch size(批尺寸)太大會導緻泛化功能低下。
一方面,使用規模相當于整個資料集的批量資料可以保證收斂達到目标函數全局最優。但是如此會導緻最優收斂速度降低。
另一方面,已證明使用較小的Batch size(批尺寸)可以更快地向良好結果收斂。事實可以直覺說明這一點,即較小的Batch size(批尺寸)允許模型在擷取所有資料前就開始學習。
但是,它的缺點是無法保證全局最優。是以,一般建議大家首先利用小規模批量處理從更快速的訓練動态中獲益,而後通過訓練逐漸增加批量規模。
history = classifier.fit_generator(training_set,
samples_per_epoch=128,
nb_epoch=50,
validation_data= test_set,
nb_val_samples=59)
viewrawtrain4.py hostedwith ❤ by GitHub
将損耗可視化并精準繪圖。
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(history.history['val_loss'])
plt.legend(['validation'], loc='upper left')
plt.title('validation loss vs epoch')
plt.ylabel('validation loss')
plt.xlabel('Epoch')
viewrawval_loss.py hostedwith ❤ by GitHub
驗證損耗VS epoch
plt.plot(history.history['val_acc'])
plt.title('validation accuracy vs epoch')
plt.ylabel('validation accuracy')
viewrawval_acc.py hostedwith ❤ by GitHub
該模型跑完50次 epoch可達到100%的驗證精度。
結論
是以,資料不足時也能進行深度學習。
本模型僅憑各類别的100個圖像就可以在50次epoch實作100%驗證精度。
此模型還可以延伸到解決其他二進制或多級别圖像分類問題。
有人可能認為這一模型相當簡單,因為憑借肉眼也可以輕松看出汽車和巴士差別甚大。那麼是否可以借助這一模型開發出識别良性/惡性惡性良性腫瘤的分類器呢?
答案是肯定的。
我們可以開發出這樣的分類器,但是關鍵在于出現任何資料集規模小的情況都要使用資料增強的方法。另一種解決辦法則是采用預訓練權重實作遷移學習。
現在,你明白了嗎?
原文釋出時間:2019-12-10
本文作者:讀芯術
本文來自雲栖社群合作夥伴“
讀芯術”,了解相關資訊可以關注“
”