初學者怎樣使用Keras進行遷移學習

本文為 AI 研習社編譯的技術博客,原標題 :

Keras Transfer Learning For Beginners

作者 | Aditya Ananthram

翻譯 | 鄧普斯•傑弗、斯蒂芬•二狗子

校對 | 鄧普斯•傑弗       校對 | 鄧普斯•傑弗     整理 | 菠蘿妹

原文鏈接:

https://towardsdatascience.com/keras-transfer-learning-for-beginners-6c9b8b7143e

初學者怎樣使用Keras進行遷移學習

本博客由3部分組成:

  1. 什麼是遷移學習?

  2. 為什麼遷移學習如此有效?

  3. 使用遷移學習實現一個圖像識別器。

直接訪問Github上的代碼。

「夜晚的星系」由布萊恩高夫在 Unsplash 發佈  


  什麼是遷移學習?

如果沒有遷移學習,實現機器學習對於初學者來說是一件非常艱難的事情。在機器學習底層上,涉及計算從輸入側映射到輸出之間的函數。函數本身只是一些加法和乘法的計算,當通過非線性激活函數和一些堆疊的神經網絡層,可以構建這樣的具有學習能力的函數,只要有足夠的數據可供學習,並且有巨大的計算能力,就可以依葫蘆畫瓢地學習。

歡迎來到深度學習。

捲入神經網絡在訓練足夠的數據時可以學習極其複雜的映射函數。我們還不能理解卷積網絡是如何學習這種複雜的映射關係。

在基本層面上,CNN(卷積神經網絡)的權重由過濾器組成。把一個過濾器想象成一個由某些數字組成的(n*n)矩陣。現在,這個過濾器對輸入的圖像進行卷積(滑動和乘法)。假設輸入圖像的大小為(10,10),過濾器的大小為(3,3),首先將過濾器與輸入圖像左上角的9個像素相乘,此相乘產生另一個(3,3)矩陣。該矩陣的9個像素值相加,該值成為CNN第2層左上角的單個像素值。

卷積網絡的表示

CNN的訓練基本上包括在每個過濾器上找到正確的值,這樣當輸入圖像通過多層時,激活最後一層的某些神經元,從而預測正確的類別。

儘管對於小型項目來說,從頭開始訓練CNN是可能的,但大多數應用程序都需要對非常大的CNN進行訓練,正如您所猜測的,這需要非常大量的數據處理和計算能力。而這兩個都不是那麼容易被實現的。

這就是遷移學習的作用所在。在遷移學習中,我們取一個已經訓練過的模型的預先訓練的權重(一個已經在1000個類別的數百萬張圖片上訓練過的權重,在幾天的高功率GPU上訓練過的權重),並使用這些已經學習過的特徵來預測新的類別。

遷移學習的優勢在於:

1:不需要一個非常大的訓練數據集。

2:不需要太多的計算能力,因為我們使用的是預先訓練好的權重,只需要學習最後幾層的權重。

有幾個模型已經在圖像網絡數據集上進行了訓練,並且已經開放源代碼。

例如,vgg-16、vgg-19、inception-v3等。有關這些型號的更多詳細信息,請閱讀此處的官方keras文檔。


  為什麼遷移學習如此有效?

為了了解為什麼遷移學習如此有效,我們必須首先看看卷積神經網絡的不同層真正學習的是什麼。

當我們在一組圖像上訓練一個深卷積神經網絡時,在訓練過程中,通過在每一層圖像上應用多個過濾器,圖像通過網絡。過濾矩陣的值與每層圖像的激活值相乘。最後一層的激活用於確定圖像屬於哪個類。

當我們訓練一個深層網絡時,我們的目標是在每個濾波器矩陣上找到最佳值,這樣當圖像通過網絡傳播時,輸出激活可以用來精確地找到圖像所屬的類。尋找這些濾波器矩陣值的過程是梯度下降。

當我們在ImageNet數據集上訓練一個conv網絡,然後看看conv網絡的每一層上的過濾器學會了識別什麼,或者每個過濾器被激活了什麼,我們就能看到一些真正有趣的東西。

conv網絡前幾層的過濾器學習識別顏色和某些水平和垂直線。

接下來的幾層慢慢地學習如何使用在前幾層中學習到的線條和顏色來識別細小的形狀。

然後,下一層學習識別紋理,然後部分對象,如腿、眼睛、鼻子等。

最後,最後一層中的過濾器被諸如狗、汽車等整個物體激活。

現在讓我們開始遷移學習。它之所以如此有效,是因為我們使用了一個對ImageNet數據集進行預訓練的網絡,並且該網絡已經學會識別初始層中不同對象的微小形狀和小部分。通過使用預訓練網絡來進行遷移學習,我們只需在預訓練網絡的末尾添加一些密集的層,然後學習這些已經學習的特性的組合有助於識別新數據集中的對象。

因此,我們只訓練了幾個密集層。此外,我們使用這些已經學習過的瑣碎特性的組合來識別新對象。所有這些都有助於使訓練過程非常快速,與從頭開始訓練conv net相比,所需的訓練數據非常少。


  現在讓我們使用Keras中的遷移學習建立一個實際的圖像識別模型。

我們將在這裡使用的模型是MobileNet。

MobileNet是一種模型,它可以提供相當好的圖像網絡分類精度並佔用非常少的空間。(根據keras文檔,17 MB)。

需要的依賴關係:

  • Keras(帶有tensorflow後端)

  • NumPy

  • Matplotlib

  • pandas

數據要求:

  • 訓練數據必須以特定格式存儲,以便饋送到網絡中進行訓練。我們將使用Keras中提供的ImageDataGenerator來訓練我們的可用數據模型。這樣,就代碼而言,該過程變得更加簡單。

  • 必須有一個主數據文件夾,在該數據文件夾中,每個包含相應圖像的數據類必須有一個文件夾。文件夾的名稱必須是其各自類的名稱。

模型的構建是一個三步過程:

  1. 導入預先訓練的模型並添加密集層。

  2. 將數據加載到ImageDataGenerators中。

  3. 訓練和評估模型。

首先,載入相關包

import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense,GlobalAveragePooling2D
from keras.applications import MobileNet
from keras.preprocessing import image
from keras.applications.mobilenet import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam

然後,導入預訓練好的MobileNet模型。Mobilenet(在Imagenet數據集上針對1000個類進行了訓練)的最後一層由1000個神經元組成(每類一個)。 我們需要在網絡的最後一層有儘可能多的神經元,一遍我們得到和我們想要識別的圖片類別的數量一樣。 因此,我們刪掉這個了1000個神經元的網絡層,並在網絡最後添加了我們自己的定義的全連接層。

這過程可以通過導入模型時設置(IncludeTop=False)來實現。 

假設你想訓練一個犬種分類器來識別120種不同的犬種,我們最後一層只需要120個神經元。使用以下代碼完成。  

這是這個過程的第一步。導入和構建所需的模型。 

要檢查模型的體系結構,我們只需要使用下面給出的這行代碼。

for i,layer in enumerate(model.layers):
 print(i,layer.name)

現在我們有了模型,我們將使用預先訓練的權重,我們的模型已經在(Imagenet數據集)上訓練過了,我們必須將所有的權重設置為不可訓練。我們將只訓練我們之前製作的最後一層緻密層。下面給出了這樣做的代碼。 

for layer in model.layers:
   layer.trainable=False
# or if we want to set the first 20 layers of the network to be non-trainable
for layer in model.layers[:20]:
   layer.trainable=False
for layer in model.layers[20:]:
   layer.trainable=True

現在我們進入流程的第2步,將訓練數據加載到ImageDataGenerator中。

ImageDataGenerators內置在keras中,幫助我們訓練我們的模型。我們只需要指定訓練數據的路徑,它就會自動分批發送訓練數據。它使代碼更加簡單。為此,我們需要使用博客前面提到的特定格式的培訓數據。

train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) #included in our dependencies

train_generator=train_datagen.flow_from_directory('path-to-the-main-data-folder',
                                                target_size=(224,224),
                                                color_mode='rgb',
                                                batch_size=32,
                                                class_mode='categorical',
                                                shuffle=True)

接下來我們進入步驟3,在數據集上訓練模型。 

為此,我們首先編譯我們創建的模型,然後用generator訓練我們的模型。這可以使用下面的代碼來完成。

model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
# Adam optimizer
# loss function will be categorical cross entropy
# evaluation metric will be accuracy

step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator,
                  steps_per_epoch=step_size_train,
                  epochs=10)

有了這個,我們將訓練一個模型。然後,通過使用這個訓練過的模型預測新圖片,類似代碼model.predict(new_image)。

獲取Github上的代碼。

一如既往,快樂學習。


想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊【初學者怎樣使用Keras進行遷移學習】:

https://ai.yanxishe.com/page/TextTranslation/1184


AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網雷鋒網雷鋒網

使用樹莓派和Python實現目標檢測

傑出數據科學家的關鍵技能是什麼?

初學者怎樣使用Keras進行遷移學習

如果你想學數據科學,這 7 類資源千萬不能錯過

等你來譯:

深度學習目標檢測算法綜述

一文教你如何用PyTorch構建 Faster RCNN

高級DQNs:利用深度強化學習玩吃豆人遊戲

用於深度強化學習的結構化控制網絡 (ICML 論文講解)



想在手機閱讀更多博客及網站收入資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems