作者|Muktha Sai Ajay
編譯|VK
來源|Towards Data Science
介紹
作為人類,我們有能力將在一項任務中獲得的知識遷移到另一項任務中去,任務越簡單,利用知識就越容易,一些簡單的例子是:
-
了解數學和統計學→學習機器學習
-
學會騎自行車→學騎摩托車
到目前為止,大多數機器學習和深度學習演算法都是針對解決特定任務而設計的,如果分布發生變化,這些演算法會再次被重建,并且很難重建和重新訓練,因為它需要計算能力和大量的時間,
遷移學習是關于如何使用預訓練好的網路,并將其應用到我們的定制任務中,將它從以前的任務中學到的知識進行遷移,
遷移學習我們可以采用VGG 16和ResNet等架構,這些架構經過了廣泛的超引數調整,基于他們已經學到的,我們將這些知識應用到一個新的任務/模型中,而不是從頭開始,這就是所謂的遷移學習,
一些遷移學習模型包括:
- Xception
- VGG16
- VGG19
- Resnet, ResnetV2
- InceptionV3
- MobileNet
應用遷移學習實作醫學應用
在此應用程式中,我們將檢測患者是否患有肺炎,我們使用Kaggle資料集進行分類,下面給出了資料集和代碼的鏈接,
資料集鏈接:
https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia
代碼鏈接:
https://github.com/ajaymuktha/DeepLearning/blob/master/TransferLearning/transfer-learning.ipynb
資料集由一個訓練集和測驗集組成,子檔案夾為normal(正常)和pneumonia(肺炎),pneumonia檔案夾有肺炎患者的胸部x光影像,normal檔案夾中有正常的影像,即沒有肺部疾病,
安裝Tensorflow
如果你的電腦沒有GPU,你可以使用google colab,或者你可以使用Jupyter Notebook,如果你使用你的系統,請升級pip,然后安裝TensorFlow,如下所示

匯入庫
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
調整影像大小
這里,我們將調整所有影像的大小為224*224,因為我們使用VGG16模型,它接受224*224大小的影像,
# 調整影像大小
IMAGE_SIZE = [224, 224]
訓練和測驗路徑
我們將指定訓練和測驗路徑,
train_path = 'Datasets/train'
valid_path = 'Datasets/test'
匯入VGG16
vgg = VGG16(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)
在這里,我們將為我們的應用程式匯入VGG16模型權重,我們應該向模型宣告一個影像大小,我們已經在上一步中完成了,引數3表示影像將接受RGB影像,即彩色影像,
為了訓練我們的模型,我們使用imagenet權重,include_top = False意味著它將從模型中洗掉最后的層,
訓練
像VGG16、VGG19、Resnet等模型已經在成千上萬的影像上進行了訓練,這些權重用于對數千個類進行分類,因此我們使用這些模型權重對模型進行分類,因此我們不需要再次訓練模型,
# 不要訓練現有的權重
for layer in vgg.layers:
layer.trainable = False
類數量
我們使用glob來找出模型中類的數量,train檔案夾中的子檔案夾數表示模型中的類數,
folders = glob('Datasets/train/*')
Flattening
不管我們從VGG16得到的輸出是什么,我們都要把它展平,我們把VGG16的最后一層去掉,這樣我們就可以保留我們自己的輸出層了,我們用問題陳述中的類別數替換最后一層,我們使用softmax做我們的激活函式,我們把它附加到x上,
x = Flatten()(vgg.output)
prediction = Dense(len(folders), activation='softmax')(x)
模型
我們將把它包裝成一個模型,其中輸入指的是我們從VGG16得到的,而輸出是指我們在上一步中創建的輸出層,
model = Model(inputs=vgg.input, outputs=prediction)
model.summary()

上圖是我們模型的摘要,在全連接層,我們有兩個節點,因為兩個不同的類別我們有肺炎和正常,
編譯
我們使用categoricaa_cross_entropy作為損失,adam優化器和精度作為度量標準來編譯我們的模型,
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
預處理
為了避免過度擬合,我們將對訓練影像進行一些變換,如果不進行變換,訓練集和測驗集的精度會有很大的差異,
我們執行一些幾何變換,比如水平翻轉影像、垂直翻轉影像、放大、縮小等等,我們應用它,這樣我們的模型就不會過擬合我們的訓練影像,我們使用ImageDataGenerator類執行上述方法,
我們不為測驗集應用轉換,因為我們只使用它們來評估,我們測驗集的唯一任務就是重新調整影像大小,因為在訓練部分,我們為影像定義了一個可以輸入網路的目標大小,
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將影像增強程序連接到我們的訓練集,我們需要傳遞我們訓練集的路徑,Target size是需要輸入神經網路的影像的大小,batch size定義32,class mode是分類(categorical)的,因為我們只有兩個輸出,
training_set = train_datagen.flow_from_directory('Datasets/train',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
現在我們定義從目錄匯入測驗映像的測驗集,我們定義了引數,跟訓練集一樣,
test_set = test_datagen.flow_from_directory('Datasets/test',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
擬合模型
我們將擬合我們的模型,并宣告epoch的數量為5,每個epoch的長度是訓練集的長度,驗證的長度是測驗集的長度,
r = model.fit_generator(
training_set,
validation_data=https://www.cnblogs.com/panchuangai/p/test_set,
epochs=5,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)

很好,我們達到了97.7%的準確率和91.5%的驗證準確率,這就是遷移學習的力量,希望你喜歡這篇關于遷移學習的教程,
原文鏈接:https://towardsdatascience.com/introduction-to-transfer-learning-c59f6f27e3e
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/709.html
標籤:其他
下一篇:利用深度學習生成醫療報告
