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 在計算機視覺中的地位。這裡將利用對這一模型的分析