遷移學習 Transfer Learning

2021-03-02 機器學習愛好者社區


公眾號後臺回復「python「,立刻領取100本機器學習必備Python電子書


 學習資料:

本節代碼

什麼是遷移學習短視頻

Stanford 遷移學習閱讀

在上次的動畫簡介中,我們大概了解了一些遷移學習的原理和為什麼要使用遷移學習. 如果用一句話來概括遷移學習, 那務必就是:「為了偷懶, 在訓練好了的模型上接著訓練其他內容, 充分使用原模型的理解力」.有時候也是為了避免再次花費特別長的時間重複訓練大型模型.

CNN 通常都是大型模型, 下面我們拿 CNN 來舉個例子. 我訓練好了一個區分男人和女人的 CNN.接著來了個任務, 說我下個任務是區分照片中人的年齡. 這看似完全不相干的兩個模型, 但是我們卻可以運用到遷移學習,讓之前那個 CNN 當我們的初始模型, 因為區分男女的 CNN 已經對人類有了理解.基於這個理解開始訓練, 總比完全重新開始訓練強. 但是如果你下一個任務是區分飛機和大象.這個 CNN 可能就沒那麼有用了, 因為這個 CNN 可能並沒有對飛機大象有任何的理解.

這一次, 我們就來遷移一個圖片分類的 CNN (VGG).這個 VGG 在1000個類別中訓練過.我們提取這個 VGG 前面的 Conv layers, 重新組建後面的 fully connected layers, 讓它做一個和分類完全不相干的事.我們在網上下載那1000個分類數據中的貓和老虎的圖片, 然後偽造一些貓和老虎長度的數據.最後做到讓遷移後的網絡分辨出貓和老虎的長度 (regressor)。

為了達到這次的目的, 我們不需要下載所有的1000個分類的所有圖片, 只要找到自己感興趣的類就好 (老虎和貓).我選老虎和貓的目的就是因為他們是近親, 還是有點像的, 可以增加點難度. 如果是飛機和大象的話, 學習難度就被降低了.

上圖是這個網址,你能在 Download 的那個 tag 中, 找到所有圖片的 urls, 我將所有老虎和貓的 urls 文件給大家放在下面:

我們可以編一個 Python功能逐個下載裡面的圖片. 這個功能我定義成 download(). 下載好後就會被放在 data 這個文件夾中了.

因為有些圖片url已經過期了, 所以我自己也手動過濾了一遍, 將不是圖片的和404的圖片給清理掉了. 因為只有兩個類,圖片不是很多, 比較好清理. 有網友說一些很多連結和圖片已經」失聯」, 我把我收集到的圖片數據打包放在我的百度雲,如果用代碼下圖片感到有困難的同學們, 請直接在我百度雲下載吧.

因為現在我們不是預測分類結果了, 所以我偽造了一些體長的數據. 老虎通常要比貓長, 所以它們的 distribution 就差不多是下面這種結構(單位cm)

處理好圖片後, 我們可以開始弄 VGG 的 pre-trained model. 我使用的是machrisaa 改寫的VGG16 的代碼.和他提供的 VGG16 train 好了的 model parameters, 你可以在這裡下載 這些 parameters(有網友說這個文件下載不了,我把它放在了百度雲共享了).做好準備, 這個 parameter 文件有500+MB.可見一般 CNN 的 model 有多大.

為了做遷移學習, 我對他的 tensorflow VGG16 代碼進行了改寫.保留了所有 Conv 和 pooling 層, 將後面的所有 fc 層拆了, 改成可以被 train 的兩層, 輸出一個數字, 這個數字代表了這隻貓或老虎的長度.

class Vgg16:
def __init__():
# ...前面的層
pool5 = self.max_pool(conv5_3, 'pool5')

# pool5 是最後的 conv 出來的結果
self.flatten = tf.reshape(pool5, [-1, 7*7*512])
self.fc6 = tf.layers.dense(self.flatten, 256, tf.nn.relu, name='fc6')
self.out = tf.layers.dense(self.fc6, 1, name='out')

在 self.flatten 之前的 layers, 都是不能被 train 的. 而 tf.layers.dense() 建立的 layers 是可以被 train 的.到時候我們 train 好了, 再定義一個 Saver 來保存由 tf.layers.dense() 建立的 parameters.

class Vgg16:
...
def save(self, path='./for_transfer_learning/model/transfer_learn'):
saver = tf.train.Saver()
saver.save(self.sess, path, write_meta_graph=False)

因為有了訓練好了的 VGG16, 你就能將 VGG16 的 Conv 層想像成是一個 feature extractor, 提取或壓縮圖片中的特徵.和 Autoencoder 中的 encoder 類似.用這些提取的特徵來訓練後面的 regressor. 具體代碼在這,下面是簡寫版.

def train():
xs, ys = ...

vgg = Vgg16(vgg16_npy_path='./for_transfer_learning/vgg16.npy')
print('Net built')
for i in range(100):
b_idx = np.random.randint(0, len(xs), 6)
train_loss = vgg.train(xs[b_idx], ys[b_idx])
print(i, 'train loss: ', train_loss)

vgg.save('./for_transfer_learning/model/transfer_learn')

這裡我只 train 了 100次, 如果是重新開始 train 一個 CNN, 100次絕對少了. 而且我使用的是只有 CPU 的電腦,不好意思, 我暫時沒有合適的 GPU… 所以你暫時在 莫煩Python 中基本找不到關於圖像處理的教程… 不過!正因為 transfer learning 讓我不用從頭 train CNN, 所以我做了這個教程!否則, 我想用我的 CPU, 估計得一周才能 train 出來這個 VGG 吧.

我們現在已經遷移好了, train 好了後面的 fc layers, 也保存了後面的 fc 參數. 接著我們提取原始的 VGG16 前半部分參數和 train 好的後半部分參數.進行測試.

def eval():
vgg = Vgg16(vgg16_npy_path='./for_transfer_learning/vgg16.npy',
restore_from='./for_transfer_learning/model/transfer_learn')
vgg.predict(
['./for_transfer_learning/data/kittycat/000129037.jpg',
'./for_transfer_learning/data/tiger/391412.jpg'])

我輸入了一張貓, 一張老虎的圖, 這個 VGG 給我預測除了他們的長度.

可以想像, 要讓 VGG 達到這個目的, VGG必須懂得區分哪些是貓, 哪些是老虎, 而這個認知, 在原始的 VGG conv 層中就已經學出來了.所以如果我們拆了後面的層, 將後面的 classifier 變成 regressor, 花費相當少的時間就能訓練好.

遷移學習的玩法除了這樣, 還有很多種其他的玩法, 我在這個短視頻中介紹了一些.遷移學習還有一些細節的地方也可以在這裡關注一下,比如什麼時候要稍微 train 一下前面的 conv layers, 什麼時候要完全固定住前面的 conv layers.


‍‍‍‍‍‍‍‍


記得把公號加星標,會第一時間收到通知。

創作不易,如果覺得有點用,希望可以隨手轉發或者」在看「,拜謝各位老鐵    

相關焦點

  • 春節充電系列:李宏毅2017機器學習課程學習筆記19之遷移學習(Transfer Learning)
    learning。本文討論機器學習中transfer learning的若干主要問題:model fine-tuning, multitask learning, domain-adversarial training 以及 zero-shot learning。話不多說,讓我們一起學習這些內容吧。
  • 元學習(Meta Learning)與遷移學習(Transfer Learning)的區別聯繫是什麼?
    不信你看~你可以說元學習是強調從不同的若干小任務小樣本來學習一個對未知樣本未知類別都有好的判別和泛化能力的模型,但其實你想想,難道這不就是知識遷移嗎?從遷移上來看,你可以說學習一個可遷移的特徵或模型,可以從A遷移到B。但這些可以被遷移過提純的東西,難道不能被叫做元知識嗎?鑑於目前的情況,這兩部分看似是兩個分支,各自也都發展出了很多的方法。
  • 深度學習不得不會的遷移學習(Transfer Learning)
    2.1 模型的訓練與預測:    2.2 為什麼要遷移學習?   如何合理的利用這些數據就是遷移學習主要解決的問題。遷移學習可以從現有的數據中遷移知識,用來幫助將來的學習。遷移學習(Transfer Learning)的目標是將從一個環境中學到的知識用來幫助新環境中的學習任務。因此,遷移學習不會像傳統機器學習那樣作同分布假設。二、什麼是遷移學習?
  • 【深度學習】一文看懂 (Transfer Learning)遷移學習(pytorch實現)
    這也用來表達我們要善於學習先輩的經驗, 一個人的成功往往還取決於先輩們累積的知識. 這句話, 放在機器學習中, 這就是今天要說的遷移學習了, transfer learning.什麼是遷移學習?遷移學習通俗來講,就是運用已有的知識來學習新的知識,核心是找到已有知識和新知識之間的相似性,用成語來說就是舉一反三。
  • 遷移學習 Transfer Learning—通俗易懂地介紹(常見網絡模型pytorch實現)
    這也用來表達我們要善於學習先輩的經驗, 一個人的成功往往還取決於先輩們累積的知識. 這句話, 放在機器學習中, 這就是今天要說的遷移學習了, transfer learning.什麼是遷移學習?遷移學習通俗來講,就是運用已有的知識來學習新的知識,核心是找到已有知識和新知識之間的相似性,用成語來說就是舉一反三。
  • ...利用基於遷移學習策略的transformer 模型進行Heck反應預測
    該文研究者創新性地提出使用遷移學習(transfer learning)來突破這個困局,使小數據的高精度預測能夠成為現實。值得注意的是,該文所使用的遷移學習,是一類經典的機器學習優化手段。該方法通過將化學領域的基礎知識轉移到特定的小數據預測,可以有效地提高模型對於小數據集的知識理解和性能預測。
  • |利用基於遷移學習策略的transformer 模型進行Heck...
    該文研究者創新性地提出使用遷移學習(transfer learning)來突破這個困局,使小數據的高精度預測能夠成為現實。值得注意的是,該文所使用的遷移學習,是一類經典的機器學習優化手段。該方法通過將化學領域的基礎知識轉移到特定的小數據預測,可以有效地提高模型對於小數據集的知識理解和性能預測。
  • 深度遷移學習(TransferLearning)核心技術 實戰培訓班
    實戰培訓班各企事業單位、高等院校及科研院所:近年來,深度遷移學習(TransferLearning)越來越受到研究者的重視,並已成功地應用於實際應用中,並且遷移學習是中國領先世界的少數幾個人工智慧方向。
  • 總結+paper分享 | 任務型對話中的跨領域&個性化&遷移學習
    1.1.1 目標領域的訓練數據太少,導致效果不佳甚至過擬合;1.1.2 很多情況下,很多已有模型只需要fine-tuning就可以用,從頭訓練費時費力,甚至還不討好;1.1.3遷移學習可以可以做多任務多目標的學習; 另外從模型角度說下遷移學習的好處:Lisa Torrey和Jude Shavlik在遷移學習的章節中描述了使用遷移學習的三個好處
  • 雜談|當前知識蒸餾與遷移學習有哪些可用的開源工具?
    作者&編輯 | 言有三【導讀】知識蒸餾與遷移學習不僅僅屬於模型優化的重要技術之一,也是提升模型跨領域泛化能力的重要技術,那麼當前有哪些可用的知識蒸餾和遷移學習開源工具呢?https://github.com/AberHu/Knowledge-Distillation-Zoodeep-transfer-learning是GitHub用戶easezyc整理的遷移學習項目。
  • 入門 | 簡述遷移學習在深度學習中的應用
    深度學習中使用遷移學習的例子下面用兩個常見的例子具體介紹一下深度學習模型中的遷移學習。使用圖像數據進行遷移學習在使用圖像作為輸入的預測建模問題中應用遷移學習是很常見的,其中使用圖像或視頻作為輸入。——遷移學習,CS231 卷積神經網絡視覺識別課程 (http://cs231n.github.io/transfer-learning/)語言數據中的遷移學習在以文本作為輸入-輸出的自然語言處理任務中,使用遷移學習是很常見的。
  • Chinese language Learning Common Mistakes
    A good example of this is when a native Chinese speaker learns Japanese, because many Japanese characters are derived from Chinese there is some positive transfer. 當學習一門新的語言時,往往會有來自母語的正負遷移。
  • 遷移學習怎麼做?遷移成分分析 (TCA) 方法簡介
    王晉東 (不在家),中國科學院計算技術研究所博士生,目前研究方向為機器學習、遷移學習、人工智慧等。之前整理總結遷移學習資料的時候有網友評論,大意就是現在的類似資料大全的東西已經太多了,想更深入地了解特定的細節。從這篇文章開始我將以《小王愛遷移》為名寫一系列的介紹分析性的文章,與大家共享遷移學習中的代表性方法、理論與自己的感想。
  • 阿里雲開源EasyTransfer:業界首個面向NLP場景深度遷移學習框架
    機器之心發布機器之心編輯部阿里雲正式開源了深度遷移學習框架 EasyTransfer,本文詳細介紹了 EasyTransfer 框架的核心功能近日,阿里雲正式開源了深度遷移學習框架 EasyTransfer,這是業界首個面向 NLP 場景的深度遷移學習框架。
  • 使用PyTorch進行主動遷移學習:讓模型預測自身的錯誤
    本文詳細說明主動遷移學習, 它是主動學習和遷移學習技術的結合,本文將實現書籍  Human-in-the-Loop Machine Learning 中的所有用到 PyTorch 的方法。什麼是遷移學習?遷移學習是將為一個特定任務建立的機器學習模型應用於另一個任務的過程。
  • 聯邦學習 OR 遷移學習?No,我們需要聯邦遷移學習
    1.2、遷移學習(Transfer Learning)遷移學習是機器學習的一個重要分支,其主要目的是將已經學習過的知識遷移應用於新的問題中。關於遷移學習最權威的綜述性文章是香港科技大學楊強教授團隊的《A survey on transfer learning》[7]。我們在這裡參考楊強教授的文章對一些遷移學習的基本概念進行闡述。
  • 「深度學習」基於RNN實現特定庫的分子生成的遷移學習指南
    通過對不同的遷移學習的配置實驗,作者提出了在基於RNN的分子生成任務中使用遷移學習的經驗性原則和建議。但是相應的特定功能的分子資料庫往往數據量比較小,因此針對於小數據任務的遷移學習經常被應用到其中。常用的操作是讓模型首先在龐大初始分子資料庫上學習基本知識,確保生成分子的有效性,隨後再遷移到作為目標的小資料庫上學習特定的功能。本文的作者試圖通過計算實驗探究目標數據集如何影響模型的遷移學習的表現。
  • 獨家 | 一文讀懂遷移學習(附學習工具包)
    近年來在機器學習領域受到廣泛關注的遷移學習恰恰解決了這兩個問題。遷移學習用已有的知識來解決目標領域中僅有少量有標籤樣本數據甚至沒有數據的學習問題,從根本上放寬了傳統機器學習的基本假設。由於被賦予了人類特有的舉一反三的智慧,遷移學習能夠將適用於大數據的模型遷移到小數據上,發現問題的共性,從而將通用的模型遷移到個性化的數據上,實現個性化遷移。2.
  • 深度學習筆記 | 第9講:遷移學習——理論與實踐
    因為我們有遷移學習。那究竟什麼是遷移學習呢?顧名思義,遷移學習就是利用數據、任務或模型之間的相似性,將在舊的領域學習過或訓練好的模型,應用於新的領域這樣的一個過程。從這段定義裡面,我們可以窺見遷移學習的關鍵點所在,即新的任務與舊的任務在數據、任務和模型之間的相似性。因而這也引出了遷移的應用場景。遷移學習到底在什麼情況下使用呢?是不是我模型訓練不好就可以用遷移學習進行改進呢?當然不是。
  • 母語遷移
    Combined with the differences in daily application, it is very easy to have negative transfer influence on oral English. 加之日常應用的差異,極容易在口語上出現負遷移影響。