1. 程式人生 > >Caffe學習系列(23):如何將別人訓練好的model用到自己的資料上

Caffe學習系列(23):如何將別人訓練好的model用到自己的資料上

caffe團隊用imagenet圖片進行訓練,迭代30多萬次,訓練出來一個model。這個model將圖片分為1000類,應該是目前為止最好的圖片分類model了。

假設我現在有一些自己的圖片想進行分類,但樣本量太小,可能只有幾百張,而一般深度學習都要求樣本量在1萬以上,因此訓練出來的model精度太低,根本用不上,那怎麼辦呢?

那就用caffe團隊提供給我們的model吧。

因為訓練好的model裡面存放的就是一些引數,因此我們實際上就是把別人預先訓練好的引數,拿來作為我們的初始化引數,而不需要再去隨機初始化了。圖片的整個訓練過程,說白了就是將初始化引數不斷更新到最優的引數的一個過程,既然這個過程別人已經幫我們做了,而且比我們做得更好,那為什麼不用他們的成果呢?

使用別人訓練好的引數,必須有一個前提,那就是必須和別人用同一個network,因為引數是根據network而來的。當然,最後一層,我們是可以修改的,因為我們的資料可能並沒有1000類,而只有幾類。我們把最後一層的輸出類別改一下,然後把層的名稱改一下就可以了。最後用別人的引數、修改後的network和我們自己的資料,再進行訓練,使得引數適應我們的資料,這樣一個過程,通常稱之為微調(fine tuning).

既然前兩篇文章我們已經講過使用digits來進行訓練和視覺化,這樣一個神器怎麼能不使用呢?因此本文以此工具為例,講解整個微調訓練過程。

一、下載model引數

檔名稱為:bvlc_reference_caffenet.caffemodel,檔案大小為230M左右,為了程式碼的統一,將這個caffemodel檔案下載到caffe根目錄下的 models/bvlc_reference_caffenet/ 資料夾下面。也可以執行指令碼檔案進行下載:

# sudo ./scripts/download_model_binary.py models/bvlc_reference_caffenet

 二、準備資料

這些資料共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。編號分別以3,4,5,6,7開頭,各為一類。我從其中每類選出20張作為測試,其餘80張作為訓練。因此最終訓練圖片400張(放在train資料夾內,每個類一個子資料夾),測試圖片100張(放在test資料夾內,每個類一個子資料夾)。

將圖片下載下來後解壓,放在一個資料夾內。比如我在當前使用者根目錄下建立了一個data資料夾,專門用來存放資料,因此我的訓練圖片路徑為:/home/xxx/data/re/train

開啟瀏覽器,執行digits,如果沒有這個工具的,推薦安裝,真的是學習caffe的神器。安裝及使用可參見我的前兩篇文章:Caffe學習系列(21):caffe圖形化操作工具digits的安裝與執行

新建一個classification dataset,設定如下圖:

下面圖片格式選為jpg, 為dataset取一個名字,就開始轉換吧。結果如圖:

三、設定model

回到digits根目錄,新建一個classification model, 選中你的dataset, 開始設定最重要的network.

caffenet的網路配置檔案,放在 caffe/models/bvlc_reference_caffenet/ 這個資料夾裡面,名字叫train_val.prototxt。開啟這個檔案,將裡面的內容複製到上圖的Custom Network文字框裡,然後進行修改,主要修改這幾個地方:

1、修改train階段的data層為:

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
  }
}

即把均值檔案(mean_file)、資料來源檔案(source)、批次大小(batch_size)和資料來源格式(backend)這四項都刪除了。因為這四項系統會根據dataset和頁面左邊“solver options"的設定自動生成。

2、修改test階段的data層:

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
  }
}

和上面一樣,也是刪除那些項。

3、修改最後一個全連線層(fc8):

layer {
  name: "fc8-re"               #原來為"fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1.0
    decay_mult: 1.0
  }
  param {
    lr_mult: 2.0
    decay_mult: 0.0
  }
  inner_product_param {
    num_output: 5        #原來為"1000"
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}

看註釋的地方,就只有兩個地方修改,其它不變。

設定好後,就可以開始微調了(fine tuning).

訓練結果就是一個新的model,可以用來單張圖片和多張圖片測試。具體測試方法前一篇文章已講過,在此就不重複了。

在此,將別人訓練好的model用到我們自己的圖片分類上,整個微調過程就是這樣了。如果你不用digits,而直接用命令操作,那就更簡單,只需要修改一個train_val.prototxt的配置檔案就可以了,其它都是一樣的操作。

2016.12.6更新

這篇文章是將近一年前寫的,digits版本已經升級,所以有些地方設定有點變化,導致很多網友出現錯誤。最多的錯誤提示如下:

ERROR: Layer 'accuracy' references bottom 'label' at the TEST stage however this blob is not included at that stage. Please consider using an include directive to limit the scope of this layer.

我當時用的版本是digits 3.0, 現在大家用的是digits 4.0, 因此會出現這個錯誤。修改如下:

最後四層的設定:

layer {
  name: "re-fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "fc8"
  bottom: "label"
  top: "accuracy"
  include {
     stage:"val"
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc8"
  bottom: "label"
  top: "loss"
  exclude{
      stage:"deploy"
      }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc8"
  top: "prob"
  include{
      stage:"deploy"
      }
}

原來網路結構中的全連線層fc8, 需要改一下名字,如我的改成"re-fc8". 因為我們做的是微調。微調的意思就是先在別的資料集上進行訓練,把訓練好的權值,作為我們現在資料集的權值初始化,就不再需要隨機初始化了。現在的資料和訓練時的資料不一致,因此有些層數的設定就會有點區別。比如這個例子中,用來訓練模型的資料集是imagenet,分為1000類,而我們的資料集就只有5類,因此在fc8這層上的num_output就會有區別,因此在這一層上就不能用人家的權值了,就需要把這層的名字改得和原來的網路結構不一樣。

在digits 4.0版本中,最後的全連線層不再需要num_output這個引數了,因此大家需要把這行刪除掉。digits會自動根據你的類別數把這個引數補充上。

也許原來的配置檔案中沒有Softmax層,現在需要加上這一層,因為digits會根據這裡的設定自動生成train_test.prototxt和deploy.prototxt兩個檔案。其它需要修改的地方,就是最後三層的include和exclude了。

最後還有一個問題就是視訊記憶體的問題。實話講我的這個訓練資料選得不太好,很吃視訊記憶體,有些GPU不好的同學,執行起來很吃力。因此大家非要用這個資料的話,建議把batch_size調低些。我用的是nvidia k20, 4G視訊記憶體,batch_size設定為16—32之間,執行得不錯,1分鐘左右執行完。

相關推薦

Caffe學習系列(23)如何別人訓練model自己資料

caffe團隊用imagenet圖片進行訓練,迭代30多萬次,訓練出來一個model。這個model將圖片分為1000類,應該是目前為止最好的圖片分類model了。 假設我現在有一些自己的圖片想進行分類,但樣本量太小,可能只有幾百張,而一般深度學習都要求樣本量在1萬以上,因此訓練出來的model精度太低,根

Caffe學習系列(20)訓練的caffemodel來進行分類

#coding=utf-8 #載入必要的庫 import numpy as npimport sys,os #設定當前目錄 caffe_root = '/home/xxx/caffe/' sys.path.insert(0, caffe_root + 'python') import caffe os.c

【2】Caffe學習系列(11)影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l

Caffe學習系列(14)初識資料視覺化

轉載自http://www.cnblogs.com/denny402/p/5092075.html 在jupyter notebook裡 首先將caffe的根目錄作為當前目錄,然後載入caffe程式自帶的小貓圖片,並顯示。 圖片大小為360x480,三通道 In [

tensorflow學習系列mnist從訓練儲存模型再到載入模型測試

    通過前面幾個系列的學習對tensorflow有了一個漸漸親切的感覺,本文主要是從tensorflow模型訓練與驗證的模型進行實踐一遍,以至於我們能夠通過tensorflow的訓練有一個整體的概念。下面主要是從訓練到儲存模型,然後載入模型進行預測。# -*- codin

Caffe學習系列(21)caffe圖形化操作工具digits的安裝與執行

經過前面一系列的學習,我們基本上學會了如何在linux下執行caffe程式,也學會了如何用python介面進行資料及引數的視覺化。 也許有人會覺得比較複雜。確實,對於一個使用慣了windows視窗操作的使用者來說,各種命令就要了人命,甚至會非常抵觸命令操作。沒有學過python,要自己去用python程

Caffe學習系列(22)caffe圖形化操作工具digits執行例項

經過前面的操作,我們就把資料準備好了。 一、訓練一個model 右擊右邊Models模組的” Images" 按鈕 ,選擇“classification" 在開啟頁面右下角可以看到,系統提供了一個caffe model,分別為LeNet, AlexNet, GoogLeNet, 如果使用這三個模型,

Caffe學習系列(1)安裝配置ubuntu14.04+cuda7.5+caffe+cudnn

一、版本 linux系統:Ubuntu 14.04 (64位) 顯示卡:Nvidia K20c cuda: cuda_7.5.18_linux.run cudnn: cudnn-7.0-linux-x64-v4.0-rc 二、下載 Ubuntu 14.04下載地址:http://www.ubunt

Caffe學習系列(7)solver及其配置

solver算是caffe的核心的核心,它協調著整個模型的運作。caffe程式執行必帶的一個引數就是solver配置檔案。執行程式碼一般為 # caffe train --solver=*_slover.prototxt 在Deep Learning中,往往loss

Caffe學習系列(13)資料視覺化環境(python介面)配置 jupyter notebook

caffe程式是由c++語言寫的,本身是不帶資料視覺化功能的。只能藉助其它的庫或介面,如opencv, python或matlab。大部分人使用python介面來進行視覺化,因為python出了個比較強大的東西:ipython notebook, 現在的最新版本改名叫jupyter notebook,它能將

TensorFlowLiteTensorFlow訓練的模型遷移到Android APP

在Android Studio中配置TensorFlowLite   把訓練好的 TensorFlow的 pb模型  移植到Android Studio上,TensorFlow Lite官方的例子中已經給我們展示了,我們其實只需要兩個檔案: libandroid_tensor

如何別人訓練model自己資料

caffe團隊用imagenet圖片進行訓練,迭代30多萬次,訓練出來一個model。這個model將圖片分為1000類,應該是目前為止最好的圖片分類model了。 假設我現在有一些自己的圖片想進行分類,但樣本量太小,可能只有幾百張,而一般深度學習都要求樣本量在1萬以上

【12】Caffe學習系列訓練和測試自己的圖片

一、準備資料 有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。驗證碼始終出不來需要翻牆(是google網站的驗證碼)。但是我沒有下載,原因是資料太大了。。。 我去網上找了一些其它的圖片

caffe學習系列訓練自己的圖片集(超詳細教程)

    學習的caffe的目的,不是簡單的做幾個練習,而是最終落實到自己的專案或科研中去。因此,本文介紹一下,從自己的原始圖片到lmdb資料,再到訓練和測試的整個流程。 一、資料的準備     有條件的同學,可以去ImageNet的官網點選開啟連結,下載ImageNet圖片

tensorflow 1.0 學習別人訓練的模型來進行圖像分類

ima ppi gin 什麽 dir targe spl flow blog 谷歌在大型圖像數據庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來圖像分類。 下載地址:https://storage.googleapis.com/d

【14】Caffe學習系列計算圖片資料的均值

圖片減去均值後,再進行訓練和測試,會提高速度和精度。因此,一般在各種模型中都會有這個操作。 那麼這個均值怎麼來的呢,實際上就是計算所有訓練樣本的平均值,計算出來後,儲存為一個均值檔案,在以後的測試中,就可以直接使用這個均值來相減,而不需要對測試圖片重新計算。 一、二進位制格式的均值計算

【13】Caffe學習系列資料視覺化環境(python介面)配置

caffe程式是由c++語言寫的,本身是不帶資料視覺化功能的。只能藉助其它的庫或介面,如opencv, python或matlab。更多人會使用python介面來進行視覺化,因為python出了個比較強大的東西:ipython notebook, 現在的最新版本改名叫jupyter notebook

【11】Caffe學習系列影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)

【10】Caffe學習系列命令列解析

caffe的執行提供三種介面:c++介面(命令列)、python介面和matlab介面。本文先對命令列進行解析,後續會依次介紹其它兩個介面。其實大部分情況下我們會使用python介面進行呼叫,當然caffe提供了C++命令列介面,還是有必要了解一下。命令列引數有個優點是支援多GPU執行。 caf

【9】Caffe學習系列執行caffe自帶的兩個簡單例子

為了程式的簡潔,在caffe中是不帶練習資料的,因此需要自己去下載。但在caffe根目錄下的data資料夾裡,作者已經為我們編寫好了下載資料的指令碼檔案,我們只需要聯網,執行這些指令碼檔案就行了。 注意:在caffe中執行所有程式,都必須在根目錄下進行,即/caffe,否則會出錯,因為指令碼檔案