1. 程式人生 > >深度學習Imagenet caffe AlexNet 實驗步驟

深度學習Imagenet caffe AlexNet 實驗步驟

1       論文:

ImageNet Classification with Deep Convolutional NeuralNetworks

2       環境需求

Linux作業系統(如ubuntu14.04)

caffe

matlab(windows或linux版都可以)

3       資料集:

3.1   資料集的準備

3.1.1  下載訓練和驗證圖片

由於ILSVRC2012沒有提供測試資料集的ground truth,所以本報告擬在訓練資料集上進行訓練,然後給出驗證資料集的top-1和top-5的錯誤率。

首先到ImageNet官網下載ILSVRC2012的訓練資料集和驗證資料集。除資料集外,ImageNet還提供了一個開發工具包ILSVRC2012_devkit_t12.tar.gz,是對ILSVRC2012資料集的詳細講解,提交比賽結果的要求,和對結果評價的程式碼。可以下載下來看一下里面的內容。ImageNet官網地址:

http://www.image-net.org/signup.php?next=download-images。注意下載前需用郵箱註冊,而且郵箱不能是地址以.com結尾的郵箱。

訓練資料集和驗證資料集分別是兩個tar檔案ILSVRC2012_img_train.tar和ILSVRC2012_img_val.tar。將這兩個檔案拷貝至伺服器合適的地址中(如/dataset/imagenet),對著兩個檔案分別解壓到當前目錄下。解壓命令為:

tar –xvf  ILSVRC2012_img_train.tar./train

tar –xvf ILSVRC2012_img_val.tar ./val

ILSVRC2012_img_train.tar解壓後是1000個tar檔案,每個tar檔案表示1000個分類中的一個類。需要對這1000個tar檔案再次解壓。在train目錄下執行unzip.sh檔案,最後得到1000個資料夾。每個資料夾中是該類的圖片。ILSVRC2012_img_val.tar解壓後的資料夾包含了所有的驗證集圖片。

unzip.sh

dir=./

for x in `ls *.tar`

do

filename=`basename $x .tar`

mkdir $filename

tar -xvf $x -C ./$filename

done

3.1.2  下載其他需要的檔案

在caffe目錄下執行命令 ./data/ilsvrc12/get_ilsvrc_aux.sh,下載一些訓練需要的附加檔案。其中train.txt是訓練資料集的ground truth檔案,val.txt是驗證資料集的ground truth檔案。需要這兩個檔案在生成lmdb資料庫時提供label資訊。

3.1.3  圖片預處理:

(1)大小歸一化:所有的圖片都歸一化為256*256的大小,對於一個長方形圖片,首先將短邊變成256的長度,然後剪裁圖片中心的256*256部分。

將examples/imagenet/create_imagenet.sh檔案中,將為RESIZE=false更改為RESIZE=true,將所有圖片歸一化為256*256的大小。注意需將檔案中的訓練資料集和測試資料集的地址更改為伺服器中實際存放的地址,即檔案中設定

TRAIN_DATA_ROOT=/dataset/ imagenet/train/

VAL_DATA_ROOT=/dataset/imagenet/val/

執行該檔案後生成訓練資料和驗證資料的lmdb資料庫:ilsvrc12_train_lmdb 、ilsvrc12_val_lmdb。

(2)減去畫素平均值:所有圖片的每個畫素都減去所有訓練集圖片的平均值。

 訓練集圖片的平均值儲存於data/ilsvrc12/imagenet_mean.binaryproto。如果沒有該檔案,執行

./examples/imagenet/make_imagenet_mean.sh可以生成該檔案。

3.2   ImageNet資料集的詳細內容

ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)是Pascal Visual Object Challenge的子部分。ImageNet是一個數據庫,有超過22000個種類,超過1500萬張圖片。

ILSVRC使用1000個類,每個類中有1000個圖片。這1000個類一一對應於WorldNet的1000個同義子集。這1000個同義子集互相不重疊,對於同義子集,不是的祖先。這樣的子集稱為低層子集。這1000個子集是ImageNet層次結構的一部分。可以認為這個子集包含了1000個低層子集和他們所有的祖先。共有860個這樣的祖先,被稱為高層子集。在層次結構中,所有的低層特徵稱為葉節點,高層子集稱為中間節點。儘管在ImageNet中低層子集會有子類,但ILSVRC2012並不考慮這些子類,ILSVRC2012的層次結構可以看作是對完整ImageNet結構的剪裁。ILSVRC競賽中,所有的標記都是針對低層子集,參賽者必須預測這1000個低層子集標記之一,不考慮預測高層子集的結果,而且也沒有高層子集的訓練圖片。

在ILSVRC中,子集資訊可參見ILSVRC2012_devkit_t12中的data/meta.mat檔案中的矩陣。

矩陣中的每一個行對應於一個子集,每一項中包含如下域值:

ILSVRC2012_ID是為每一子集分配的一個整數ID值,所有低層子集的ID值都在1到1000之間,所有高層子集的ID值都大於1000。所有的子集都是一句其ID值進行排序。提交預測結果時,ILSVRC2012_ID也作為相應子集的標記。

WNID是子集在WordNet中的ID。用於在ImageNet或WorldNet中唯一標記一個子集。包含訓練圖片的tar檔案就是用WNID命名的。同樣每一個訓練圖片也是用WNID命名的。

num_children是子集在剪裁後的結構中子孫的數目。對於低層子集其值為0,對於高層子集的值不為0。

children是子孫子集的ILSVRC2012_ID的向量。

wordnet_height是完整的ImageNet/WorldNet層次結構中到葉節點的最長路徑的值。(完整的ImageNet/WorldNet層次結構中葉節點的wordnet_height值為0)

注意caffe使用的labelILSVRC2012_devkit是不一致的。ILSVRC2012_IDILSVRC2012_devkit的提供的編號。而caffe中圖片的label是以圖片所屬子集的名字的ASC II的順序排列,並依次從0999編號。本文提供的所有程式都是依據caffe的編號編寫的。在caffe目錄下的data/ilsvrc12/synset_words.txt檔案檢視子集/編號的對應。

訓練圖片

對於每一個子集都有一個tar檔案,用其WNID命名。圖片檔案,命名為x_y.JPEG。其中x是子集的WNID,y是整數(不是固定長度,而且不一定連續),所有的圖片都是JPEG格式。

共有1281167張訓練圖片。其中每個子集的訓練圖片數目在732 至1300之間。

驗證圖片

共有50000張驗證圖片,分別被命名為:

      ILSVRC2012_val_00000001.JPEG

      ILSVRC2012_val_00000002.JPEG

      ...

      ILSVRC2012_val_00049999.JPEG

      ILSVRC2012_val_00050000.JPEG

對於每一個子集分別有50張驗證圖片。

驗證圖片的groundtruth在data/ILSVRC2012_validation_ground_truth.txt,檔案中每一行包含一個圖片對應的ILSVRC2012_ID,並以圖片名稱的升序排列。

測試圖片

共有100000張測試圖片,測試圖片的命名如下:

ILSVRC2012_test_00000001.JPEG

      ILSVRC2012_test_00000002.JPEG

      ...

      ILSVRC2012_test_00099999.JPEG

      ILSVRC2012_test_00100000.JPEG

對於每一個子集分別有100張測試圖片。

4      AlexNet結構的創新點

4.1   ReLU

加快訓練速度,使大規模神經網路能夠成功訓練。

4.2   多GPU訓練

單GPU的儲存空間過小,用120萬張圖片訓練的網路規模超出了單個GPU的儲存能力。因此使用2塊GPU,在每個GPU上儲存一半的kenels,這2塊GPU只在特定的層上通訊。比起在在一個GPU上訓練的每個卷積層只有一半kernels的方案,top1和top5的錯誤率分別降低了1.7%和1.2%。

4.3   區域性響應歸一化

區域性相應歸一化有助於模型的泛化,將模型top1和top5的錯誤率分別降低了1.4%和1.2%。

4.4   重疊池化

將模型top1和top5的錯誤率分別降低了0.4%和0.3%。

4.5   整體結構

AlexNet共8層,包括5個卷積層和3個全連線層。第2、4、5層的kernels僅與上一層在同一塊GPU上的kernel maps連線,第3層kernels與第2層所有的kernel maps連線。第1、2層卷積後進行區域性相應歸一化。第1、2、5層有重疊池化。卷積層和全連線層的每層輸出都有ReLU。

5      AlexNet避免過擬合的策略

5.1   資料增多

(1)在256*256的影象中選取224*224的patches以及這些patches的水平映象作為網路的輸入、將訓練資料增加了2048倍。

(2)在訓練集的RGB畫素值的集合上運用主成分分析。這個策略捕獲到了自然影象的一個重要特徵:物體的類別不隨著光線的亮度和顏色變化。這個策略將top1的錯誤率降低了1%。

5.2   Dropout

Dropout是一種組合多種模型的方式。在前兩個全連線層運用dropout。如果不使用dropout,模型會出現明顯的過擬合。但dropout會導致模型收斂需要的迭代次數翻倍。

6      模型訓練

AlexNet模型定義於檔案:models/bvlc_alexnet/train_val.prototxt,注意需將檔案中的訓練資料集和測試資料集的地址更改為伺服器中實際存放的地址。

訓練引數定義於檔案:models/bvlc_alexnet/solver.prototxt

在caffe目錄下執行命令:

由於訓練時間過程,可以令訓練過程不掛斷在後臺執行,命令為

nohup ./build/tools/caffe train--solver=models/bvlc_alexnet/solver.prototxt &

該命令的輸出會重定向到nohup.out檔案中,可以檢視該檔案檢視模型的訓練情況。

檢視GPU是否被佔用以及被佔用的記憶體大小命令:

nvidia-smi

模型訓練引數:

預設batch大小256(我們的伺服器GPU記憶體不夠,需要調整到128),迭代450000次,約90個epoch

learning rate初始化為0.01,採用step的演算法,每100000次(約20個epoch)迭代衰減一次。

momentum值為0.9,weight decay為0.0005

每10000個迭代輸出一個snapshot

caffe的AlexNet模型定義與論文不同之處:

1、caffe中的AlexNet模型沒有進行資料增多的操作。

2、用於訓練的圖片大小不一樣,論文中實際用於訓練的圖片大小為224*224,caffe的大小是227*227。而且對訓練圖片進行了隨機映象。

3、non-zero biases被初始化為0.1而不是1

訓練過程可以暫停,並從之前訓練生成的一個snapshort中開始恢復訓練。如從第10000輪迭代結果開始繼續訓練:

./build/tools/caffe train --solver=models/bvlc_alexnet/solver.prototxt–

snapshot=models/bvlc_alexnet/caffenet_train_iter_10000.solverstate

如果最多迭代450000次,最後訓練的模型為caffenet_train_iter_450000.caffemodel。大概需要2-3天。

7      模型驗證

利用已經訓練好的模型對驗證資料集的資料生成一個結果,該結果為一個文字檔案,檔案中的每一行對應一張圖片,以圖片名稱的升序排列,如從ILSVRC2012_val_00000001.JPEG 到 ILSVRC2012_val_00050000.JPEG。每一行包含對圖片預測的結果標記,即預測圖片所屬類別的值(0至999的整數),並以confidence值的降序排列。每一行的標記數目可以變化,但不能超過5。驗證資料預測結果的示例檔案可見ILSVRC2012_devkit中的/evaluation/demo.val.pred.txt

在caffe/examples目錄下執行alexneteval.py檔案。執行命令:

Python alexneteval.py (需要將modelname改為自己訓練的模型名字)

生成結果檔案alexnetpred.txt

alexneteval.py

import numpy as np

caffe_root = '../' # this file is expected to be in {caffe_root}/examples

val_dir = '/dataset/imagenet/val'

model_name ='caffenet_train_iter_450000.caffemodel'

import sys

sys.path.insert(0, caffe_root + 'python')

import caffe

import os

caffe.set_mode_cpu()

net = caffe.Net(caffe_root +'models/bvlc_reference_caffenet/deploy.prototxt',

               caffe_root + 'models/bvlc_reference_caffenet/'+model_name,

               caffe.TEST)

transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})

transformer.set_transpose('data', (2,0,1))

transformer.set_mean('data', np.load(caffe_root +'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1))

transformer.set_raw_scale('data', 255)  # the reference model operates on images in [0,255]range instead of [0,1]

transformer.set_channel_swap('data', (2,1,0))  # the reference model has channels in BGRorder instead of RGB  

net.blobs['data'].reshape(50,3,227,227)

fh = open('alexnetpred.txt','w')

batchsize = net.blobs['data'].shape[0]

for dirpath,dirnames,filenames inos.walk(val_dir):

   sortedfiles = sorted(filenames)

n=len(sortedfiles)

nbatch = (n+ batchsize - 1) // batchsize

for i inrange(nbatch):

   idx = np.arange(i*batchsize,min(n,(i+1)*batchsize))

   for tdx in idx:

              filename = sortedfiles[tdx]

                  indexofdata= tdx%batchsize

                  net.blobs['data'].data[indexofdata]= transformer.preprocess('data', caffe.io.load_image(os.path.join(dirpath,filename)))

       out =net.forward()

   for j in range(batchsize)

         output_pred=out['prob'][j].argsort()[-1:-6:-1]

         outlist=output_pred.tolist()

         templist=[str(i) for i in outlist]

         fh.write(' '.join(templist))

         fh.write('\n')

fh.close()

8      結果評價

基於matlab的評價程式參見ILSVRC2012_devkit_t12中demo_eval.m和eval_flat.m,其中demo_eval呼叫了eval_flat函式,這個函式需要輸入3個引數:

predict_file,預測結果檔案,每一行是對一張圖片的預測labels,必須為正整數,以空格分隔,以confidence的降序排列,每一行的labels可以改變,但是不能超過max_num_pred_per_image。我們的預測結果檔案就是alexnetpred.txt。

gtruth_file,與predict_file的格式一致,每一行是相應圖片的ground truth labels。在ILSVRC2012中,gtruth_file每行只有一個值。可以將caffe/data/ilsvrc12目錄下的val.txt檔案作為gtruth_file。但需要將檔案的第一列刪除。

max_num_pred_per_image,在計算top-1和top-5錯誤率的值分別為1和5。

在demo_eval.m中設定

pred_file='alexnetpred.txt'

ground_truth_file='val.txt';

在matlab中執行demo_eval輸出top-1和top-5的錯誤率。注意需要demo_eval.m和eval_flat.m檔案放置到matlab的當前工作路徑中。

參考資料

[1]     KrizhevskyA, Sutskever I, Hinton G E. Imagenet classification with deep convolutionalneural networks[C]//Advances in neural information processing systems. 2012:1097-1105.

[2]     http://caffe.berkeleyvision.org/gathered/examples/imagenet.html

[4]     ~/caffee/models/bvlc_alexnet/readme.md

[5]     ~/caffee/models /examples/imagenet/readme.md

[6]     ILSVRC2012_devkit_t12

相關推薦

深度學習Imagenet caffe AlexNet 實驗步驟

1       論文: ImageNet Classification with Deep Convolutional NeuralNetworks 2       環境需求 Linux作業系統(如ubuntu14.04) caffe matlab(windows或lin

Ubuntu16.04安裝深度學習框架caffe詳細步驟講解

此次安裝是帶有GPU的安裝,如果沒有GPU只安裝CPU,可參考我的另一篇文章,搞深度學習還得有顯示卡吃硬體,要不等著吐血吧。1、安裝環境:ubuntu16.04+caffe-master+cuda8.0+cudnnv5.1 ,安裝環境所需的安裝包我已打包上傳,下載地址.htt

深度學習 deep learning 深度學習框架 caffe 深入學習過程

深度學習(Deep Learning)核心技術開發與應用培訓班 主辦單位:中國管理科學研究院執業資格認證培訓中心 一,時間地點: 2018年09月13日— 2018年09月16日北京 (機房上課,每人一臺電腦進行實際案例操作,贈送 U盤拷貝資料及課件和軟體) 二,培訓目標: 1,

深度學習網路篇——AlexNet

作為一個機器學習剛入門的小學生,今天和大家分享的是一篇比較經典的論文《ImageNet Classification with Deep Convolutional Neural Networks》。只是我們在學習後的知識分享和總結,有不周到的地方還請各位大大們指正。 簡要概括 Al

深度學習框架Caffe的安裝與使用總結

Caffe 的安裝 官網:http://caffe.berkeleyvision.org/installation.html 部落格:https://blog.csdn.net/yhaolpz/article/details/71375762 GitHub:https

深度學習之安卓實驗

沒有蘋果開發環境,也沒有安卓手機,於是搗鼓搗鼓找到了一條模擬器開發安卓的方法,安卓用的就是linux核心,所以ubutnu下安卓開發環境還是很容易的,主要的就是java環境OpenJDK,Android SDK,NDK,安裝Android Studio,將sdk

10、深度學習框架Caffe學習與應用--訓練結果影象分析

一、觀察損失曲線:學習率  橫軸:輪。 縱軸:損失。  黃色:學習率太高;  藍色:學習率太低;  綠色:學習率高了;  紅色:學習率最好;  二、放大損失曲線:學習率、batch大小 沒有呈現線性:說明學習率低了。 下降太慢:說明學習率太高。 寬度

深度學習框架Caffe-權值視覺化[重啟]

配置 ubuntu16.04 Matlab2018b gcc6.3 (安裝教程): 安裝ubuntu16.04所遇到的問題 https://blog.csdn.net/baidu_40840693/article/details/85061079 安裝方面和下面的部落格一樣:

唐宇迪深度學習框架Caffe系列-11

deploy.prototxt 這個檔案和訓練檔案 .prototxt 很相似,但是他是在模型生成後,測試模型使用的配置檔案 內容上,除了資料層,其他層都是一模一樣的 caffe提供示例的地址:/home/apple/caffe/models/bvlc_reference_caffene

唐宇迪深度學習框架Caffe系列-10

繪製LOSS曲線 安裝matplotlib庫(這個庫需要安裝python-tk) sudo apt-get install python-tk sudo pip install matplotlib import numpy as np import matplotl

深度學習框架Caffe學習與應用】 第十一課

1.車輛檢測實踐:使用Caffe訓練的深度學習模型做目標檢測——以車輛檢測為例 有關檔案都放在以下資料夾中: 對vehicle_detetc.cpp進行編譯: 編譯之前,需要修改一下程式碼中的檔

深度學習框架caffe學習教程

Caffe是一個清晰而高效的深度學習框架,本文詳細介紹了caffe的優勢、架構、網路定義、各層定義,caffe的安裝與配置,解讀了caffe實現的影象分類 模型AlexNet,並演示了CIFAR-10在caffe上進行訓練與學習。 Caffe是純粹的C++/CUDA架

深度學習框架Caffe學習與應用】第三課 將圖片資料轉化為LMDB資料``

1.將圖片資料轉化為LMDB資料 第一步:建立圖片檔案列表清單,一般為一個txt檔案,一行一張圖片 我在caffe/data/目錄下新建一個test_data的資料夾,裡面放訓練集及資料集

深度學習Caffe框架

 caffe提供多媒體科學家和從業者一個乾淨可修改的框架,框架提供最新的深度學習演算法和一個參考模型的集合。  框架是一個BSD許可C++庫且繫結Python以及MATLAB來進行訓練,部署在通用目的卷積神經網路和其他有效的深度模型上。  Caffe適

深度學習實戰——caffe windows 下訓練自己的網路模型

1、相關準備 1.1 手寫數字資料集 1.2深度學習框架 本實戰基於caffe深度學習框架,需自行參考相關部落格搭建環境,這裡不再對如何搭建環境作介紹。 2、資料準備 2.

深度學習Caffe環境搭建

window10(64位)+VS2013+CUDA+CUDNN+caffe 配置過程 2.1 caff配置過程 進入你剛才儲存windows_caffe的資料夾下,進入 windows\CommonSettings.props.example,並重

深度學習框架Caffe學習筆記(4)-MNIST資料集轉換成視覺化圖片

MNIST圖片檔案格式 train-images-idx3-ubyte 檔案偏移量 資料型別 值 描述 0000 32位整型 2051 魔數(大端儲存) 0004 32位整型 60000 檔案包

深度學習caffe環境搭建(3)

ubuntu 系統下的Caffe環境搭建 作者:hjimce 對於caffe的系統一般使用linux系統,當然也有windows版本的caffe,不過如果你一開始使用了windows下面的caffe,後面學習的過程中,會經常遇到各種錯誤,網上下載的一些原始碼、模型也往往不

深度學習框架Caffe學習筆記(1)-Caffe環境搭建

Caffe是由伯克利視覺和學習中心開發的基於C++/CUDA/Python實現的卷積神經網路,提供了面向命令列、Matlab、Python的繫結介面。 Caffe環境搭建 系統:Ubuntu16.04 首先安裝Caffe依賴包: $ sudo

深度學習-採用caffe提供的工具extract_features.bin進行特徵提取

地1,在caffe目錄下建立一臨時目錄_temp mkdir examples/_temp 2,生成一個特提取影象的檔名列表檔案 find `pwd`/examples/images/myimages/ -type f -exec echo {} \; > examp