遷移學習概論

做者|Muktha Sai Ajay
編譯|VK
來源|Towards Data Sciencepython

介紹

做爲人類,咱們有能力將在一項任務中得到的知識遷移到另外一項任務中去,任務越簡單,利用知識就越容易。一些簡單的例子是:git

  • 瞭解數學和統計學→學習機器學習github

  • 學會騎自行車→學騎摩托車算法

到目前爲止,大多數機器學習和深度學習算法都是針對解決特定任務而設計的。若是分佈發生變化,這些算法會再次被重建,而且很難重建和從新訓練,由於它須要計算能力和大量的時間。網絡

遷移學習是關於如何使用預訓練好的網絡,並將其應用到咱們的定製任務中,將它從之前的任務中學到的知識進行遷移。架構

遷移學習咱們能夠採用VGG 16和ResNet等架構。這些架構通過了普遍的超參數調整,基於他們已經學到的,咱們將這些知識應用到一個新的任務/模型中,而不是從頭開始,這就是所謂的遷移學習。app

一些遷移學習模型包括:機器學習

  • 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意味着它將從模型中刪除最後的層。

訓練

像VGG1六、VGG1九、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=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/

相關文章
相關標籤/搜索