1. 程式人生 > >caffe簡易上手指南(二)—— 訓練我們自己的資料

caffe簡易上手指南(二)—— 訓練我們自己的資料

訓練我們自己的資料

本篇繼續之前的教程,下面我們嘗試使用別人定義好的網路,來訓練我們自己的網路。

1、準備資料

首先很重要的一點,我們需要準備若干種不同型別的圖片進行分類。這裡我選擇從ImageNet上下載了3個分類的圖片(Cat,Dog,Fish)。

圖片需要分兩批:訓練集(train)、測試集(test),一般訓練集與測試集的比例大概是5:1以上,此外每個分類的圖片也不能太少,我這裡每個分類大概選了5000張訓練圖+1000張測試圖。

找好圖片以後,需要準備以下檔案:

words.txt:分類序號與分類對應關係(注意:要從0開始標註

0 cat
1 dog
2 fish

train.txt:標明訓練圖片路徑及其對應分類,路徑和分類序號直接用空格分隔,最好隨機打亂一下圖片

/opt/caffe/examples/my_simple_image/data/cat_train/n02123045_4416.JPEG 0
/opt/caffe/examples/my_simple_image/data/cat_train/n02123045_3568.JPEG 0
/opt/caffe/examples/my_simple_image/data/fish_train/n02512053_4451.JPEG 2
/opt/caffe/examples/my_simple_image/data/cat_train/n02123045_3179.JPEG 0
/opt/caffe/examples/my_simple_image/data/cat_train/n02123045_6956.JPEG 0
/opt/caffe/examples/my_simple_image/data/cat_train/n02123045_10143.JPEG 0
......

val.txt:標明測試圖片路徑及其對應分類

/opt/caffe/examples/my_simple_image/data/dog_val/n02084071_12307.JPEG 1
/opt/caffe/examples/my_simple_image/data/dog_val/n02084071_10619.JPEG 1
/opt/caffe/examples/my_simple_image/data/cat_val/n02123045_13360.JPEG 0
/opt/caffe/examples/my_simple_image/data/cat_val/n02123045_13060.JPEG 0
/opt/caffe/examples/my_simple_image/data/cat_val/n02123045_11859.JPEG 0
......

2、生成lmdb檔案

lmdb是caffe使用的一種輸入資料格式,相當於我們把圖片及其分類重新整合一下,變成一個數據庫輸給caffe訓練。

這裡我們使用caffenet的create_imagenet.sh檔案修改,主要是重新指定一下路徑:

EXAMPLE=examples/my_simple_image/
DATA=examples/my_simple_image/data/
TOOLS=build/tools

TRAIN_DATA_ROOT=/
VAL_DATA_ROOT=/

# 這裡我們開啟resize,需要把所有圖片尺寸統一
RESIZE=true
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi

.......

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/ilsvrc12_train_lmdb  #生成的lmdb路徑

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/val.txt \
    $EXAMPLE/ilsvrc12_val_lmdb    #生成的lmdb路徑
echo "Done."

3、生成mean_file

下面我們用lmdb生成mean_file,用於訓練(具體做啥用的我還沒研究。。。)

這裡也是用imagenet例子的指令碼:

EXAMPLE=examples/my_simple_image
DATA=examples/my_simple_image
TOOLS=build/tools

$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb $DATA/imagenet_mean.binaryproto

echo "Done."

4、修改solver、train_val配置檔案

這裡我們可以選用cifar的網路,也可以用imagenet的網路,不過後者的網路結構更復雜一些,為了學習,我們就用cifar的網路來改。

把cifar的兩個配置檔案拷過來:

cifar10_quick_solver.prototxt
cifar10_quick_train_test.prototxt

首先修改cifar10_quick_train_test.prototxt的路徑以及輸出層數量(標註出黑體的部分):

name: "CIFAR10_quick"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "examples/my_simple_image/imagenet_mean.binaryproto"
  }
  data_param {
source: "examples/my_simple_image/ilsvrc12_train_lmdb" batch_size: 50 #一次訓練的圖片數量,一般指定50也夠了 backend: LMDB } } layer { name: "cifar" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { mean_file: "examples/my_simple_image/imagenet_mean.binaryproto" } data_param { source: "examples/my_simple_image/ilsvrc12_val_lmdb" batch_size: 50 #一次訓練的圖片數量 backend: LMDB } }
..........
layer { name: "ip2" type: "InnerProduct" bottom: "ip1" top: "ip2" .......... inner_product_param { num_output: 3 #輸出層數量,就是你要分類的個數 weight_filler { type: "gaussian" std: 0.1 } bias_filler { type: "constant" } } } ......

cifar10_quick_solver.prototxt的修改根據自己的實際需要:

net: "examples/my_simple_image/cifar/cifar10_quick_train_test.prototxt"   #網路檔案路徑
test_iter: 20 #測試執行的迭代次數
test_interval: 10 #迭代多少次進行測試 base_lr: 0.001 #迭代速率,這裡我們改小了一個數量級,因為資料比較少
momentum: 0.9 weight_decay: 0.004 lr_policy: "fixed" #採用固定學習速率的模式display: 1 #迭代幾次就顯示一下資訊,這裡我為了及時跟蹤效果,改成1 max_iter: 4000 #最大迭代次數 snapshot: 1000 #迭代多少次生成一次快照 snapshot_prefix: "examples/my_simple_image/cifar/cifar10_quick" #快照路徑和字首 solver_mode: CPU #CPU或者GPU

5、開始訓練

執行下面的命令,開始訓練(為了方便可以做成指令碼)

./build/tools/caffe train --solver=examples/my_simple_image/cifar/cifar10_quick_solver.prototxt

6、小技巧

網路的配置和訓練其實有一些小技巧。

- 訓練過程中,正確率時高時低是很正常的現象,但是總體上是要下降的

- 觀察loss值的趨勢,如果迭代幾次以後一直在增大,最後變成nan,那就是發散了,需要考慮減小訓練速率,或者是調整其他引數

- 資料不能太少,如果太少的話很容易發散

相關推薦

caffe簡易上手指南—— 訓練我們自己資料

訓練我們自己的資料 本篇繼續之前的教程,下面我們嘗試使用別人定義好的網路,來訓練我們自己的網路。 1、準備資料 首先很重要的一點,我們需要準備若干種不同型別的圖片進行分類。這裡我選擇從ImageNet上下載了3個分類的圖片(Cat,Dog,Fish)。 圖片需要分兩批:訓練集(train)、測試集

Rancher及Docker快速上手指南

......接上一篇文章 四、新增和管理容器 在Rancher通過介面方式新增容器的方式其實有兩種,一種是在上面提到的管理主機,直接新增獨立容器(獨立於Rancher平臺的容器,就算Rancher平臺停了,容器還會在各自主機保留),另一種是下一節會講到的,通過應用新增的方式新增容器(由R

LARC Caffe筆記 訓練自己的img

繼看完 賀完結!CS231n官方筆記 上一次已經成功跑起caffe自帶的例程,mnist和cifar10 但是終歸用的是裡面寫好的指令碼,於是打算訓練自己的img 〇、目標 準備好food圖片3類(出於資料安全考慮,使用food101公開資料集) 每一類都是沒有resize的1000張圖片

Maven入門指南

deploy ... web服務器 快速 repos 必須 轉載 關於 net 轉載自並發編程網 – ifeve.com本文鏈接地址: Maven入門指南(二) Maven目錄結構 Maven有一個標準的目錄結構。如果你在項目中遵循Maven的目錄結構,就無需在pom文件中

小橙書閱讀指南——選擇排序

sel alt 代碼示例 運行時間 mon cti override 和數 integer 算法描述:一種最簡單的排序算法是這樣的:首先,找到數組中最小的那個元素,其次,將它和數組的第一個元素交換位置。再次,再剩下的元素中找到最小的元素,將它與數組的第二個元素交換位置。如此

計算機考研機試指南——日期類問題

ios pro ril num oct 思路 %d isl space 編程筆記 cha2-2 日期類問題 日期差值 1 #include <iostream> 2 #include <algorithm> 3

python檔案讀寫指南

我們知道當檔案不存在的時候,open()方法的寫模式與追加模式都會新建檔案,但是對檔案進行判斷的場景還有很多,比如,在爬蟲下載圖片的時候,可能需要判斷檔案是否存在,以免重複下載;又比如,建立新檔案的時候,可能需要判斷檔案是否存在,存在就先做個備份......所以,學習判斷檔案是否存在,還是很有必要的

Machine Learning筆記整理 ------ 訓練集與測試集的劃分

1. 留出法 (Hold-out) 將資料集D劃分為2個互斥子集,其中一個作為訓練集S,另一個作為測試集T,即有: D = S ∪ T, S ∩ T = ∅ 用訓練集S訓練模型,再用測試集T評估誤差,作為泛化誤差估計。 特點:單次使用留出法得到的估計結果往往不夠穩定可靠,故如果要使用留出法,一般採用若

Scratch 3.0建站指南後臺技術選型

上一節,我們簡單講了一下Scratch 3.0的背景介紹,以及如何在本地編譯執行的內容,對於採用面對面的教學方式,如果部署在區域網,這種方式應該也足夠了。Scratch 3.0的指令碼可以存放在本地,如果是公用電腦,可以使用目錄的方式分開存放,如果是學生自帶的

Drools規則引擎入門指南

本篇部落格主要講解Drools常用的屬性以及函式 屬性 首先我們在resources\rules資料夾下建立一個Property.drl,還有一個DroolsApplicationPropertyTests 1. salience優先順序 salience 屬性的值預設為0,它的值越大執行的

Rancher及Docker快速上手指南

......續接上一篇文章。 六、映象庫及應用 Rancher還有很多功能,在這裡都不細說了,因為這是一篇快速上手指南,講到這已經差不多了。但是還得補充下更重要的內容,上一篇通篇講的都是使用Rancher拉取公共映象來建立容器或應用,那麼如何建立和使用我們自已的私有映象,這也是初學者必須

Rancher及Docker快速上手指南

Rancher是一個開源的企業級全棧化容器部署及管理平臺,目前我們使用的是穩定釋出的版本V1.6(2017年釋出),其中Rancher2.0也於2018年釋出,Rancher 2.0是一個簡化、加速企業Kubernetes(K8S)快速落地的產品,由於2.0版本變動太大,不便於我們入門應用,而且

RabbitMQ指南 基本概念和開發

2.1 基本概念   下圖是RabbitMQ的基本模型,模型中包括以下部分:生產者、交換機、佇列和消費者。   生產者產生訊息,並將訊息傳送至交換機,交換機根據一定的路由規則將訊息傳送至一個或多個訊息佇列中,訊息的消費者從相應的訊息佇列中取資料,進行處理。  

機器學習之python入門指南元組、集合、字典的使用

Python3中元組、集合、字典的使用 Python中元組的用法元組的建立與訪問 元組和列表類似,不同之處在於元組不能修改,元組使用小括號,列表使用方括號,注意元組中如果只包含以個元素需要在後面加,否則會被當作運算子使用 元組與字串類似,下標索引從0開始,可以進行擷取,取捨

Android開發————簡易APP設計

實驗內容 使用sqlite 給備忘錄app增加資料儲存功能 實驗步驟 活動1: Xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sche

從零開始搭建一個簡易的伺服器

超級大坑 第一篇部落格到現在拖坑有半年了(不過估計也沒人記得我),原本的打算是既然要寫伺服器,那自然要設計一門語言,類似於php這樣的工作於伺服器後端負責後端渲染,然後到目前為止的時間基本都花在寫編譯器上了囧,編譯器的專案在這裡。如果真的等編譯器全部寫

CTC學習筆記 訓練和公式推導

整體思路 訓練流程和傳統的神經網路類似,構建loss function,然後根據BP演算法進行訓練,不同之處在於傳統的神經網路的訓練準則是針對每幀資料,即每幀資料的訓練誤差最小,而CTC的訓練準則是基於序列(比如語音識別的一整句話)的,比如最大化p(z|x

Linux基本指南:Linux基本命令詳解

目錄 一、常用指令 ls 顯示檔案或目錄 -l 列出檔案詳細資訊l(list) -a 列出當前目錄下所有檔案及目錄,包括隱藏的a(all) mkdir 建立目錄 -p 建立目錄,若無父目錄,則建立p(parent)

人臉識別——訓練分類器

上一篇簡單整理了下人臉識別的相關基礎知識,這一篇將著重介紹利用pencv(2.4.9)已有的模型進行分類器訓練。 一、關於ORL人臉資料庫  ORL是一個40個人,每人採取10張人臉頭像構成的一

Caffe框架的理解:詳解AlexNet

引言 在2012年的時候,Geoffrey和他學生Alex為了迴應質疑者,在ImageNet的競賽中利用AlexNet一舉重新整理image classification的記錄,奠定了deep learning 在計算機視覺中的地位。這裡將利用對這一模型的分析