深度學習Caffe實戰筆記(3)用AlexNet跑自己的資料
上一篇部落格介紹瞭如何在caffe框架平臺下,用LeNet網路訓練車牌識別資料,今天介紹用AlexNet跑自己的資料,同樣基於windows平臺下,會比基於Ubuntu平臺下麻煩一些,特別是後面的Siamese網路,說起Siamese網路真是一把辛酸一把淚啊,先讓我哭一會,,,,,哭了5分鐘,算了,Siamese網路的苦水等以後再倒吧,言歸正傳,開始train。
在caffe平臺下,實現用Alexnet跑自己的資料步驟和上一篇的步驟差不多,可以說幾乎一樣。。。。。
1、準備資料
在caffe根目錄下data資料夾新建一個資料夾,名字自己起一個就行了,我起的名字是cloth,在cloth資料夾下新建兩個資料夾,分別存放train和val資料,在train資料夾下存放要分類的資料,要分幾類就建立幾個資料夾,分別把對應的影象放進去。(當然,也可以把所有的影象都放在一個資料夾下,只是在標籤檔案中標明就行)。
然後建立train資料集對應的標籤txt檔案。同樣,在val資料夾下存放驗證資料,並建立驗證影象對應的txt標籤檔案。
2、轉換資料
編譯成功的caffe根目錄下bin資料夾下有一個convert_imageset.exe檔案,用來轉換資料,在cloth資料夾下新建一個指令碼檔案,內容:
mtrainldb和mvalldb分別是轉化好的資料集檔案,既caffe需要的檔案。這樣在cloth資料夾下會生成兩個資料夾:
這裡面儲存的就是生成的資料檔案。
3、計算均值
在cloth資料夾下新建一個計算均值的指令碼檔案,內容如下:
用到的computer_image_mean也是bin目錄下生成的一個可執行檔案,用來計算均值,mtrainldb是存放訓練資料的資料夾,mimg_mean_binaryproto就是要生成的均值檔案。雙擊執行後會生成mimg_mean_binaryproto檔案,這個檔案就是計算出來的均值檔案。
4、開始訓練
同樣,在cloth資料夾下,新建一個train指令碼檔案,檔案內容如下:
這個就不過多解釋了吧,solver就是Alexnet的超參檔案,開啟後如下:
net: "train_val.prototxt" #需要用哪個網路訓練
test_iter: 1000
test_interval: 1000
base_lr: 0.01 #初始化學習率
lr_policy: "step" #學習策略,每stepsize之後,將學習率乘以gamma
gamma: 0.1 #學習率變化因子
stepsize: 100000 #每stpesize之後降低學習率
display: 20
max_iter: 450000 #最大迭代次數
momentum: 0.9 #動量,上次引數更新的權重
weight_decay: 0.0005 #權重衰減量
snapshot: 10000 #每10000次儲存一次模型結果
snapshot_prefix: "cloth" #模型儲存路徑
solver_mode: GPU #CPU或者GPU訓練,這裡使用CPU,所以需要把GPU改成CPU
開啟train_val.prototxt,內容如下:
name: "AlexNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "mimg_mean.binaryproto" #均值檔案
}
data_param {
source: "mtrainldb" #訓練資料
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "mimg_mean.binaryproto" #均值檔案
}
data_param {
source: "mvaldb" #驗證資料
batch_size: 50
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "norm1"
type: "LRN"
bottom: "conv1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "norm1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0.1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "norm2"
type: "LRN"
bottom: "conv2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "norm2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "pool2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0.1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0.1
}
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 0.1
}
}
}
layer {
name: "relu6"
type: "ReLU"
bottom: "fc6"
top: "fc6"
}
layer {
name: "drop6"
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 0.1
}
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2 #注意:這裡需要改成你要分成的類的個數
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 {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
網路協議中需要注意的地方我都做了說明,其它的一些內容就不多做介紹了,想要了解的學友自行查資料吧。。。。
雙擊train.bat開始訓練吧。
5、測試
同樣,測試需要一個類別標籤檔案,category.txt,
在這裡介紹一下類別檔案的作用,第一個數就是訓練時打的標籤,後面那個是標籤對應的類別名稱,我這裡為了方便寫了0和1,其實應該把後面的0和1改成long sleve和short sleve,以便於測試的時候能直接顯示出是長袖或者短袖。
寫一個test指令碼,
classification是bin目錄下一個可執行檔案,用於caffe中的分類。第二個是測試需要的協議,第三個我們訓練好的模型,第四個是均值檔案,第五個是類別標籤,第六個是需要測試的影象。開啟測試需要的deploy.prororxt,內容如下:
name: "AlexNet"
input: "data"
input_dim: 10
input_dim: 3 #資料
input_dim: 227
input_dim: 227
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "norm1"
type: "LRN"
bottom: "conv1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "norm1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "norm2"
type: "LRN"
bottom: "conv2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "norm2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "pool2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
group: 2
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
group: 2
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
}
}
layer {
name: "relu6"
type: "ReLU"
bottom: "fc6"
top: "fc6"
}
layer {
name: "drop6"
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096 #改成和訓練網路一致
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2 #輸出的類別個數
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "fc8"
top: "prob"
}
雙擊執行,測試結果:
表示為短袖的概率為100%.測試圖片為:
這兩個部落格一個是完成lenet網路訓練,一個是完成Alexnet網路訓練,那麼舉二反無窮,不管用什麼網路,用自己的資料來跑基本上就是這個步驟了對不對,即使有不同,也是大同小異,只需要做小量修改即可,到時候需要具體情況具體分析。。。。。。。
寫在後面的話:
話說寫部落格也不是一件輕鬆的事情啊,好累,好費時間,在我學習的過程中有好多都是從別的同學的部落格裡學習到的,所以我很願意把我學習到的東西分享給別人,因為我也是從一頭霧水,問誰誰不理的時候一步步走來的。說到分享,昨天看了一個上本科時學院的書記轉發的一個朋友圈文章,叫“為什麼層次越高的人,計較的越少”,就談到了願不願分享的問題,有的人覺得自己辛苦得來的東西,害怕別人知道了,不願意告訴別人怎麼做的,其實這樣的人格局實在太小,殊不知你告訴別人的只不過是一個結果,在你探索過程中得到的分析能力,思維方式,你的知識結構別人是拿不去的!你在乎的,往往能反映出你的水準,為什麼層次越高的人,反而計較的越少呢?不是說他有多麼寬容,而是有些事根本入不了他的眼。願不願意分享,就能看出一個人的眼界和格局,而眼界和格局往往才是決定一個人盛衰成敗的關鍵!共勉。。。。。。
相關推薦
深度學習Caffe實戰筆記(3)用AlexNet跑自己的資料
上一篇部落格介紹瞭如何在caffe框架平臺下,用LeNet網路訓練車牌識別資料,今天介紹用AlexNet跑自己的資料,同樣基於windows平臺下,會比基於Ubuntu平臺下麻煩一些,特別是後面的Siamese網路,說起Siamese網路真是一把辛酸一把淚啊,先
深度學習Caffe實戰筆記(2)用LeNet跑車牌識別資料
caffe實戰之“車牌識別” 上一篇部落格寫了如何在cpu的情況下配置環境,配置好環境後編譯成功,就可以用caffe框架訓練卷積神經網路了。今天介紹如何在caffe環境下,跑車牌識別的資料,利用的網路是LeNet,這裡只介紹具體caffe實戰步驟,網路結構不做
深度學習tensorflow實戰筆記(3)VGG-16訓練自己的資料並測試和儲存模型
前面的部落格介紹瞭如何把影象資料轉換成tfrecords格式並讀取,本篇部落格介紹如何用自己的tfrecords格式的資料訓練CNN模型,採用的模型是VGG-16。現有的教程都是在mnist或者cifar-10資料集上做的訓練,如何用自己的資料集進行訓練相關的資料比較
深度學習Caffe實戰筆記(10)Windows Caffe使用MATLAB介面提取和視覺化特徵
上一篇部落格中介紹瞭如何使用MATLAB訓練和測試資料,這篇部落格介紹如何從訓練好的模型中提取影象特徵,並介紹把卷積層特徵視覺化方法。 之前提取特徵都是用python,儘管用python提取特徵很方便,但是感覺MATLAB提取特徵更方便,因為博主對MATLAB
深度學習Caffe實戰筆記(21)Windows平臺 Faster-RCNN 訓練好的模型測試資料
前一篇部落格介紹瞭如何利用Faster-RCNN訓練自己的資料集,訓練好會得到一個模型,這篇部落格介紹如何利用訓練好的模型進行測試資料。 1、訓練好的模型存放位置 訓練好的模型存放在faster_rcnn-master\output\faster_rcnn_
深度學習caffe實戰筆記(4)Windows caffe平臺下跑cifar10
上一篇部落格介紹瞭如何用alexnet跑自己的資料,能跑自己的資料按理說再跑cifar10應該沒問題了啊,但是想想還是要把cifar10的記錄下來,因為cifar10資料格式是屬於特殊的資料格式,需要用caffe環境把資料轉換檔案編譯出來,這也是後面Siames
深度學習Caffe實戰筆記(20)Windows平臺 Faster-RCNN 訓練自己的資料集
1、把自己的資料集放到Faster-master中 我覺得這個過程是最重要的一個過程吧,博主在這裡跳了很多的坑,最後找到了一個非常簡單高效的方法。不用修改任何檔案,就可以輕鬆實現載入自己的資料集。 在faster_rcnn-master資料夾下,有一個d
深度學習caffe實戰筆記(13)利用MATLAB視覺化mnist資料集
之前的部落格中介紹過利用MATLAB視覺化影象特徵,因為最近在看《深度學習21天實戰caffe》,裡面有一章節是關於視覺化的,所以把視覺化mnist資料集的程式碼共享一下,在這裡要感謝趙永科老師 clc; clear; close all; image_fil
深度學習Caffe實戰筆記(5)Windows caffe平臺跑Siamese mnist資料集
前幾篇部落格介紹了環境搭建,caffe跑lenet,alexnet,cifar10,基礎的一些操作都介紹的很詳細了。這篇部落格介紹如何使用Siamese網路跑mnist資料集,下一篇介紹如何用Siamese網路跑自己的資料集。說到Siamese網路,這次不哭了,
深度學習Caffe實戰筆記(18)Windows平臺 Faster-RCNN 環境配置
好久不寫部落格了,因為前一段時間博主身體抱恙,感觸頗多。。。。。。都說windows平臺做caffe和tensorflow坑多,博主沒有太多優點,唯獨的一個優點就是不服輸,Windows平臺雖然坑多,但是填坑也是蠻有意思的一件事情。另外,在Siamese網路訓練
深度學習Caffe實戰筆記(7)Caffe平臺下,如何調整卷積神經網路結構
授人以魚不如授人以漁,紅鯉魚家有頭小綠驢叫驢屢屢。至於修改網路結構多虧了課題組大師姐老龐,在小米實習回校修整,我問她怎麼修改網路,她說改網路就是改協議,哎呀,一語驚醒夢中人啊!老龐師姐,你真美!雖然博主之前也想過修改網路協議試一試,鑑於一直不懂網路結構中的各個引
深度學習Caffe實戰筆記(15)CNN網路結構視覺化
利用python是可以實現卷積網路結構的視覺化的,但是window平臺下使用相當麻煩,這裡介紹一種非常方便快捷的視覺化方法,這個是珍藏已久的東西啦,今天拿出來分享一下,再次感謝課題組大師姐老龐,老龐師姐,你真美! 網址: http://ethereon.gi
深度學習tensorflow實戰筆記(5)用預訓練好的VGG-16模型提取影象特徵
上一篇部落格介紹瞭如果使用自己訓練好的模型用於影象分類和特徵提取,但是有時候自己的資料集大小有限,所以更多的時候我們需要用VGG-16預訓練好的模型提取特徵,相關學者預訓練好的模型使用的都是公開的標準資料集,所以我們直接用預訓練的模型提取我們自己影象的特徵,可以用於
深度學習tensorflow實戰筆記(1)全連線神經網路(FCN)訓練自己的資料(從txt檔案中讀取)
寫在前面的話:離上一次寫部落格已經有些日子了,以前的工程都是在caffe平臺下做的,caffe平臺雖然挺好用的,但是caffe主要用於做CNN,對於其它的網路模型用起來不太方便,所以博主轉戰tensorflow,Google對待tensorflow就想當年對待An
深度學習tensorflow實戰筆記(4)利用儲存的VGG-16CNN網路模型提取特徵
前幾篇部落格寫了如何處理資料,如何把用自己的資料訓練VGG-16,如何把訓練好的模型儲存。而在實際應用中,並不是所有的操作都是為了分類的,有時候需要提取影象的特徵,那麼怎麼利用已經儲存的模型提取特徵呢? “桃葉兒尖上尖,柳葉兒就遮滿了天” 測試資料轉換成tf
20180813視頻筆記 深度學習基礎上篇(1)之必備基礎知識點 深度學習基礎上篇(2)神經網絡模型視頻筆記:深度學習基礎上篇(3)神經網絡案例實戰 和 深度學習基礎下篇
計算 概念 人臉識別 大量 png 技巧 表現 lex github 深度學習基礎上篇(3)神經網絡案例實戰 https://www.bilibili.com/video/av27935126/?p=1 第一課:開發環境的配置 Anaconda的安裝 庫的安裝 Windo
redis實戰筆記(3)-第3章 Redis命令
chan 4.4 ges 打包 常用 重要 讀取 表操作 nio 第3章 Redis命令 本章主要內容 字符串命令、 列表命令和集合命令 散列命令和有序集合命令 發布命令與訂閱命令 其他命令 在每個不同的數據類型的章節裏, 展示的都是該數據類型所獨有的、 最具代表性
斯坦福CS224N_自然語言處理NLP深度學習DL課程筆記(一)
Lecture 1: Introduction pdf 本節課是對自然語言處理的定義介紹和應用介紹,還順帶說了NLP的難點; 本節課使用深度學習作為NLP的主要處理工具。 傳統的機器學習技術,需要人為地去做特徵工程,將這些的特徵餵給機器學期演算法;然後機器學習演
java面向物件學習相關簡要筆記(3)
抽象類: 具體例項: abstract void shout(); //定義抽象方法shout() abstract class Animal //定義抽象類 Animal {
Coursera吳恩達《神經網路與深度學習》課程筆記(2)-- 神經網路基礎之邏輯迴歸
上節課我們主要對深度學習(Deep Learning)的概念做了簡要的概述。我們先從房價預測的例子出發,建立了標準的神經網路(Neural Network)模型結構。然後從監督式學習入手,介紹了Standard NN,CNN和RNN三種不同的神經網路模型。接