做者|Muktha Sai Ajay
編譯|VK
來源|Towards Data Sciencepython
做爲人類,咱們有能力將在一項任務中得到的知識遷移到另外一項任務中去,任務越簡單,利用知識就越容易。一些簡單的例子是:git
瞭解數學和統計學→學習機器學習github
學會騎自行車→學騎摩托車算法
到目前爲止,大多數機器學習和深度學習算法都是針對解決特定任務而設計的。若是分佈發生變化,這些算法會再次被重建,而且很難重建和從新訓練,由於它須要計算能力和大量的時間。網絡
遷移學習是關於如何使用預訓練好的網絡,並將其應用到咱們的定製任務中,將它從之前的任務中學到的知識進行遷移。架構
遷移學習咱們能夠採用VGG 16和ResNet等架構。這些架構通過了普遍的超參數調整,基於他們已經學到的,咱們將這些知識應用到一個新的任務/模型中,而不是從頭開始,這就是所謂的遷移學習。app
一些遷移學習模型包括:機器學習
在此應用程序中,咱們將檢測患者是否患有肺炎。咱們使用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文件夾中有正常的圖像,即沒有肺部疾病。
若是你的電腦沒有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意味着它將從模型中刪除最後的層。
像VGG1六、VGG1九、Resnet等模型已經在成千上萬的圖像上進行了訓練,這些權重用於對數千個類進行分類,所以咱們使用這些模型權重對模型進行分類,所以咱們不須要再次訓練模型。
# 不要訓練現有的權重 for layer in vgg.layers: layer.trainable = False
咱們使用glob來找出模型中類的數量。train文件夾中的子文件夾數表示模型中的類數。
folders = glob('Datasets/train/*')
無論咱們從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=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/