Home >> Blog >> transfer learning-了解深度學習的遷移學習

放下手中的SEO優化案子,讓我們來聊聊機器學習這一塊先進科技領域。

transfer learning-了解深度學習的遷移學習

概述

  • 什麼是遷移學習,它正在發揮作用
  • 遷移學習如何運作
  • 為什麼要使用遷移學習?
  • 何時使用遷移學習
  • 模型 Th at 已經過預訓練

在新問題上重用先前學習的模型稱為遷移學習。它現在在深度學習中特別流行,因為它可以用少量數據訓練深度神經網絡。這在數據科學領域特別有價值,因為大多數實際情況不需要數百萬個標記數據點來訓練複雜的模型。

了解深度學習的遷移學習

項目

  • 什麼是遷移學習,它正在發揮作用
  • 遷移學習如何運作
  • 為什麼要使用遷移學習?
  • 何時使用遷移學習
  • 已預訓練的模型
  • 用 Python 實現遷移學習的程式碼

什麼是遷移學習及其工作

在新問題上重用預訓練模型被稱為機器學習中的遷移學習。機器使用從先前任務中學到的知識來增加對遷移學習中新任務的預測。例如,您可以在訓練分類器以預測圖像是否包含美食時,使用訓練期間獲得的資訊來區分飲料。

已經訓練好的機器學習模型的知識在整個遷移學習過程中被轉移到一個不同但密切相關的問題上。例如,如果您訓練了一個簡單的分類器來預測圖像是否包含背包,您可以使用模型的訓練知識來識別其他對象,例如太陽眼鏡。

了解深度學習的遷移學習

通過遷移學習,我們基本上嘗試使用我們在一項任務中學到的知識來更好地理解另一項任務中的概念。權重會自動從執行新“任務 B”的網絡轉移到執行“任務 A”的網絡。

由於需要大量的 CPU 能力,遷移學習通常應用於計算機視覺和自然語言處理任務,如情感分析。

遷移學習如何運作

在計算機視覺中,神經網絡通常旨在檢測第一層的邊緣、中間層的形式以及後幾層的特定任務特徵。早期和中心層用於遷移學習,後面的層只進行再訓練。它利用了訓練任務中的標記數據。

通過遷移學習,我們基本上嘗試使用我們在一項任務中學到的知識來更好地理解另一項任務中的概念。權重會自動從執行新“任務 B”的網絡轉移到執行“任務 A”的網絡。

由於需要大量的 CPU 能力,遷移學習通常應用於計算機視覺和自然語言處理任務,如情感分析。

遷移學習如何運作

在計算機視覺中,神經網絡通常旨在檢測第一層的邊緣、中間層的形式以及後幾層的特定任務特徵。早期和中心層用於遷移學習,後面的層只進行再訓練。它利用了訓練任務中的標記數據。

了解深度學習的遷移學習

讓我們回到一個模型示例,該模型旨在識別圖像中的背包,現在將用於檢測太陽鏡。因為該模型已經訓練識別早期級別的對象,所以我們將簡單地重新訓練後續層以了解太陽鏡與其他對象的區別。

為什麼要使用遷移學習?

遷移學習提供了許多優勢,其中最重要的是減少了訓練時間、提高了神經網絡性能(在大多數情況下)以及無需大量數據。

要從頭開始訓練神經模型,通常需要大量數據,但並非總是可以訪問這些數據——這就是遷移學習派上用場的時候。

了解深度學習的遷移學習

由於該模型已經過預訓練,因此可以使用遷移學習用相當少的訓練數據生成一個好的機器學習模型。這在自然語言處理中特別有用,其中巨大的標記數據集需要大量專家知識。此外,由於從復雜任務開始構建深度神經網絡可能需要數天甚至數週的時間,因此訓練時間也會減少。

何時使用遷移學習

當我們沒有足夠的註釋數據來訓練我們的模型時。當有一個經過類似數據和任務訓練的預訓練模型時。如果您使用 TensorFlow 訓練原始模型,您可以簡單地恢復它並為您的工作重新訓練一些層。另一方面,遷移學習只有在第一個任務中學習的特徵是通用的時才有效,這意味著它們可以應用於另一個活動。此外,模型的輸入必須與第一次訓練時的大小相同。如果

如果您沒有它,請添加一個步驟以將您的輸入調整為所需的大小。

1. 訓練模型以重用它

考慮一下您希望處理任務 A 但缺乏訓練深度神經網絡所需數據的情況。找到具有大量數據的相關任務 B 是解決此問題的一種方法。

利用深度神經網絡對任務 B 進行訓練,然後使用模型解決任務 A。您要解決的問題將決定您是需要使用整個模型還是僅使用幾層。

如果兩個作業中的輸入相同,您可以重新應用模型並對新輸入進行預測。另一方面,更改和重新訓練不同的特定任務層和輸出層是一種調查方法。

2. 使用預訓練模型

第二種選擇是使用已經訓練過的模型。有很多這樣的模型,所以事先做一些研究。重用和再訓練的層數由任務決定。

Keras 由九個用於遷移學習、預測、微調的預訓練模型組成。可以在此處找到這些模型以及有關如何使用它們的一些快速課程。許多研究機構還提供訓練有素的模型。

這種形式的遷移學習最流行的應用是深度學習。

3. 特徵提取

另一種選擇是利用深度學習來識別問題的最佳表示,其中包括識別關鍵特徵。這種方法被稱為表示學習,它通常可以產生比手工設計的表示更好的結果。

機器學習中的特徵創建主要由研究人員和領域專家手工完成。幸運的是,深度學習可以自動提取特徵。當然,這並沒有降低特徵工程和領域知識的重要性;您仍然必須選擇要包含在您的網絡中的功能。

了解深度學習的遷移學習

另一方面,神經網絡有能力學習哪些特徵是關鍵的,哪些不是。即使對於原本需要大量人力的複雜任務,表示學習算法也可以在短時間內找到合適的特徵組合。

然後可以將學習到的表示應用於各種其他挑戰。只需利用初始層來找到合適的特徵表示,但避免使用網絡的輸出,因為它過於特定於任務。相反,將數據發送到您的網絡並通過其中一個中間層輸出。

然後可以將原始數據理解為該層的表示。

這種方法通常用於計算機視覺,因為它可以縮小數據集,減少計算時間並使其更適合經典算法。

已預訓練的模型

有許多流行的預訓練機器學習模型可用。為 ImageNet“大型視覺識別挑戰”開發的 Inception-v3 模型就是其中之一。” 這項挑戰的參與者必須將圖片分為 1000 個子類別,例如“斑馬”、“斑點狗”和“洗碗機”。

用 Python 實現遷移學習的程式碼

(數據集是來自 Kaggle 的胸部 CT 掃描)

導入庫

將張量流導入為 tf
將熊貓導入為 pd
將 matplotlib.pyplot 導入為 plt
從 tensorflow.keras 導入模型
從 tensorflow.keras.layers 導入 Conv2D、Dense、MaxPooling2D、Dropout、Flatten、GlobalAveragePooling2D
從 tensorflow.keras.models 導入順序
從 tensorflow.keras.preprocessing.image 導入 ImageDataGenerator
從 tensorflow.keras.callbacks 導入 ReduceLROnPlateau
從 tensorflow.keras.layers 導入 Input、Lambda、Dense、Flatten
從 tensorflow.keras.models 導入模型
從 tensorflow.keras.applications.inception_v3 導入 InceptionV3
從 tensorflow.keras.applications.inception_v3 導入 preprocess_input
從 tensorflow.keras.preprocessing 導入圖像
從 tensorflow.keras.preprocessing.image 導入 ImageDataGenerator,load_img
從 tensorflow.keras.models 導入順序
將 numpy 導入為 np
從全局導入全局

通過 Kaggle API 上傳數據

from google.colab import files
files.upload()

將 kaggle.json 保存到 kaggle.json

!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/

!chmod 600 ~/.kaggle/kaggle.json

!kaggle datasets download -d mohamedhanyyy/chest-ctscan-images #downloading data from kaggle API of Dataset

from zipfile import ZipFile
file_name = "chest-ctscan-images.zip"

with ZipFile(file_name,'r') as zip:
zip.extractall()
print('Done')

借助預訓練模型設計我們的 CNN 模型

InceptionV3_model = tf.keras.applications.InceptionV3(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten,GlobalAveragePooling2D
from tensorflow.keras.models import Sequential

# The last 15 layers fine tune
for layer in InceptionV3_model.layers[:-15]:
layer.trainable = False

x = InceptionV3_model.output
x = GlobalAveragePooling2D()(x)
x = Flatten()(x)
x = Dense(units=512, activation='relu')(x)
x = Dropout(0.3)(x)
x = Dense(units=512, activation='relu')(x)
x = Dropout(0.3)(x)
output = Dense(units=4, activation='softmax')(x)
model = Model(InceptionV3_model.input, output)


model.summary()

圖像增強(用於防止過度擬合的問題)

# 使用圖像數據生成器從數據集中導入圖像(x)
從 tensorflow.keras.preprocessing.image 導入 ImageDataGenerator(x)
(x)
train_datagen = ImageDataGenerator(rescale = 1./255,(x)
剪切範圍 = 0.2,(x)
縮放範圍 = 0.2,(x)
水平翻轉=真)(x)
(x)
test_datagen = ImageDataGenerator(rescale = 1./255)(x)
#測試數據不翻轉和縮放

(x)

# Make sure you provide the same target size as initialied for the image size
training_set = train_datagen.flow_from_directory('/content/Data/train',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')

訓練我們的模型

# 擬合模型
# 運行單元格。執行需要一些時間
r = model.fit_generator(
訓練集,
驗證數據=測試集,
時期=8,
steps_per_epoch=len(training_set),
驗證步驟=長度(測試集)
)

# plot the loss
plt.plot(r.history['loss'], label='train loss')
plt.plot(r.history['val_loss'], label='val loss')
plt.legend()
plt.show()
plt.savefig('LossVal_loss')

# plot the accuracy
plt.plot(r.history['accuracy'], label='train acc')
plt.plot(r.history['val_accuracy'], label='val acc')
plt.legend()
plt.show()
plt.savefig('AccVal_acc')

做出預測

將 numpy 導入為 np
y_pred = np.argmax(y_pred, 軸=1)
y_pred

上面的程式碼正在執行,使用遷移學習進行分類的相應輸出顯示在嵌入式筆記本下方:

了解深度學習的遷移學習

了解深度學習的遷移學習

source