介紹
作為人類,我們有能力將在一項(xiàng)任務(wù)中獲得的知識(shí)遷移到另一項(xiàng)任務(wù)中去,任務(wù)越簡單,利用知識(shí)就越容易。一些簡單的例子是:
- 了解數(shù)學(xué)和統(tǒng)計(jì)學(xué)→學(xué)習(xí)機(jī)器學(xué)習(xí)
- 學(xué)會(huì)騎自行車→學(xué)騎摩托車
到目前為止,大多數(shù)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)算法都是針對(duì)解決特定任務(wù)而設(shè)計(jì)的。如果分布發(fā)生變化,這些算法會(huì)再次被重建,并且很難重建和重新訓(xùn)練,因?yàn)樗枰?jì)算能力和大量的時(shí)間。
遷移學(xué)習(xí)是關(guān)于如何使用預(yù)訓(xùn)練好的網(wǎng)絡(luò),并將其應(yīng)用到我們的定制任務(wù)中,將它從以前的任務(wù)中學(xué)到的知識(shí)進(jìn)行遷移。
遷移學(xué)習(xí)我們可以采用VGG 16和ResNet等架構(gòu)。這些架構(gòu)經(jīng)過了廣泛的超參數(shù)調(diào)整,基于他們已經(jīng)學(xué)到的,我們將這些知識(shí)應(yīng)用到一個(gè)新的任務(wù)/模型中,而不是從頭開始,這就是所謂的遷移學(xué)習(xí)。
一些遷移學(xué)習(xí)模型包括:
- Xception
- VGG16
- VGG19
- Resnet, ResnetV2
- InceptionV3
- MobileNet
應(yīng)用遷移學(xué)習(xí)實(shí)現(xiàn)醫(yī)學(xué)應(yīng)用
在此應(yīng)用程序中,我們將檢測患者是否患有肺炎。我們使用Kaggle數(shù)據(jù)集進(jìn)行分類。下面給出了數(shù)據(jù)集和代碼的鏈接。
數(shù)據(jù)集鏈接:
https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia
代碼鏈接:
https://github.com/ajaymuktha/DeepLearning/blob/master/TransferLearning/transfer-learning.ipynb
數(shù)據(jù)集由一個(gè)訓(xùn)練集和測試集組成,子文件夾為normal(正常)和pneumonia(肺炎)。pneumonia文件夾有肺炎患者的胸部x光圖像,normal文件夾中有正常的圖像,即沒有肺部疾病。
安裝Tensorflow
如果你的電腦沒有GPU,你可以使用google colab,或者你可以使用Jupyter Notebook。如果你使用你的系統(tǒng),請(qǐng)升級(jí)pip,然后安裝TensorFlow,如下所示
導(dǎo)入庫
from keras.layers import Input, Lambda, Dense, Flatten
from keras.models import Model
from keras.Applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
import numpy as np
from glob import glob
import matplotlib.pyplot as plt
調(diào)整圖像大小
這里,我們將調(diào)整所有圖像的大小為224*224,因?yàn)槲覀兪褂肰GG16模型,它接受224*224大小的圖像。
# 調(diào)整圖像大小
IMAGE_SIZE = [224, 224]
訓(xùn)練和測試路徑
我們將指定訓(xùn)練和測試路徑。
train_path = 'Datasets/train'
valid_path = 'Datasets/test'
導(dǎo)入VGG16
vgg = VGG16(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)
在這里,我們將為我們的應(yīng)用程序?qū)隫GG16模型權(quán)重。我們應(yīng)該向模型聲明一個(gè)圖像大小,我們已經(jīng)在上一步中完成了,參數(shù)3表示圖像將接受RGB圖像,即彩色圖像。
為了訓(xùn)練我們的模型,我們使用imagenet權(quán)重,include_top = False意味著它將從模型中刪除最后的層。
訓(xùn)練
像VGG16、VGG19、Resnet等模型已經(jīng)在成千上萬的圖像上進(jìn)行了訓(xùn)練,這些權(quán)重用于對(duì)數(shù)千個(gè)類進(jìn)行分類,因此我們使用這些模型權(quán)重對(duì)模型進(jìn)行分類,因此我們不需要再次訓(xùn)練模型。
# 不要訓(xùn)練現(xiàn)有的權(quán)重
for layer in vgg.layers:
layer.trainable = False
類數(shù)量
我們使用glob來找出模型中類的數(shù)量。train文件夾中的子文件夾數(shù)表示模型中的類數(shù)。
folders = glob('Datasets/train/*')
Flattening
不管我們從VGG16得到的輸出是什么,我們都要把它展平,我們把VGG16的最后一層去掉,這樣我們就可以保留我們自己的輸出層了。我們用問題陳述中的類別數(shù)替換最后一層。我們使用softmax做我們的激活函數(shù),我們把它附加到x上。
x = Flatten()(vgg.output)
prediction = Dense(len(folders), activation='softmax')(x)
模型
我們將把它包裝成一個(gè)模型,其中輸入指的是我們從VGG16得到的,而輸出是指我們在上一步中創(chuàng)建的輸出層。
model = Model(inputs=vgg.input, outputs=prediction)
model.summary()
上圖是我們模型的摘要,在全連接層,我們有兩個(gè)節(jié)點(diǎn),因?yàn)閮蓚€(gè)不同的類別我們有肺炎和正常。
編譯
我們使用categoricaa_cross_entropy作為損失,adam優(yōu)化器和精度作為度量標(biāo)準(zhǔn)來編譯我們的模型。
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
預(yù)處理
為了避免過度擬合,我們將對(duì)訓(xùn)練圖像進(jìn)行一些變換,如果不進(jìn)行變換,訓(xùn)練集和測試集的精度會(huì)有很大的差異。
我們執(zhí)行一些幾何變換,比如水平翻轉(zhuǎn)圖像、垂直翻轉(zhuǎn)圖像、放大、縮小等等,我們應(yīng)用它,這樣我們的模型就不會(huì)過擬合我們的訓(xùn)練圖像。我們使用ImageDataGenerator類執(zhí)行上述方法。
我們不為測試集應(yīng)用轉(zhuǎn)換,因?yàn)槲覀冎皇褂盟鼈儊碓u(píng)估,我們測試集的唯一任務(wù)就是重新調(diào)整圖像大小,因?yàn)樵谟?xùn)練部分,我們?yōu)閳D像定義了一個(gè)可以輸入網(wǎng)絡(luò)的目標(biāo)大小。
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
flow_from_directory將圖像增強(qiáng)過程連接到我們的訓(xùn)練集。我們需要傳遞我們訓(xùn)練集的路徑。Target size是需要輸入神經(jīng)網(wǎng)絡(luò)的圖像的大小。batch size定義32,class mode是分類(categorical)的,因?yàn)槲覀冎挥袃蓚€(gè)輸出。
training_set = train_datagen.flow_from_directory('Datasets/train',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
現(xiàn)在我們定義從目錄導(dǎo)入測試映像的測試集。我們定義了參數(shù),跟訓(xùn)練集一樣。
test_set = test_datagen.flow_from_directory('Datasets/test',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
擬合模型
我們將擬合我們的模型,并聲明epoch的數(shù)量為5,每個(gè)epoch的長度是訓(xùn)練集的長度,驗(yàn)證的長度是測試集的長度。
r = model.fit_generator(
training_set,
validation_data=test_set,
epochs=5,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)
很好,我們達(dá)到了97.7%的準(zhǔn)確率和91.5%的驗(yàn)證準(zhǔn)確率,這就是遷移學(xué)習(xí)的力量。希望你喜歡這篇關(guān)于遷移學(xué)習(xí)的教程。