码迷,mamicode.com
首页 > Web开发 > 详细

Caffe-5.2-(GPU完整流程)训练(根据googlenet、alexnet微调)

时间:2017-03-30 11:55:10      阅读:2842      评论:0      收藏:0      [点我收藏+]

标签:margin   文件夹   prot   cuda   1.2   snap   weight   nsf   size   

上一篇使用caffenet的模型微调,但因为caffenet有220M太大,测试速度太慢,因此换为googlenet.

1. 训练

迭代了2800次时死机,大概20分钟。使用的是2000次的模型。


2. 测试

2.1 测试批处理
在F:\caffe-master170309新建如下图文件test-TrafficJamBigData03292057.bat。

.\Build\x64\Debug\caffe.exe test --model=models/bvlc_googlenet0329_1/train_val.prototxt -weights=models/bvlc_googlenet0329_1/bvlc_googlenet_iter_2000.caffemodel -gpu=0
pause

效果如下:

技术分享


2.2 测试单张图片

下面用训练出的模型,测试单个图片的准确率。(参考model的使用)
改Debug\classfication.bat如下(测试单张图F:\caffe-master170309\data\TrafficJamBigData03281545\test\du\190416357.png)

通过手动运行可知需要3:67秒,故MFC程序的延时降低为4秒。这样比caffenet的11秒快得多了。

不过效果不准:10张图(5张堵、5张不堵)全部识别为不堵,效果如下:

技术分享

上述我认为是训练的模型不好,故重新训练。


3. 重新训练  (参考

下面重新训练googlenet模型,主要增加迭代次数和batch_size。

3.1 训练数据转lmdb格式和mean文件

由于之前用caffenet时,是以227*227的图片训练的(将crop_size设为227)。用227*227的图片测试的(直接将图由480*480转为了227*227)

此需要用480*480大小的重新训练。

3.1.1 读取图片的标签,并将图片名+标签写入train_label.txt与test_label.txt里

在F:\caffe-master170309\data\TrafficJamBigData03301009文件夹里有2个文件夹、2个*.m,两个空的txt。
得到标签train_label.txt与test_label.txt

3.1.2 转换为lmdb格式
F:\caffe-master170309\Build\x64\Debug下新建convert-TrafficJamBigData03301009-train.bat,内容如下:
F:/caffe-master170309/Build/x64/Debug/convert_imageset.exe --shuffle --resize_width=480 --resize_height=480 F:/caffe-master170309/data/TrafficJamBigData03301009/ F:/caffe-master170309/data/TrafficJamBigData03301009/train_label.txt F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-train_lmdb -backend=lmdb
pause


F:\caffe-master170309\Build\x64\Debug下新建convert-TrafficJamBigData03281545-test.bat,内容如下
F:/caffe-master170309/Build/x64/Debug/convert_imageset.exe --shuffle --resize_width=480 --resize_height=480 F:/caffe-master170309/data/TrafficJamBigData03301009/ F:/caffe-master170309/data/TrafficJamBigData03301009/test_label.txt F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-test_lmdb -backend=lmdb
pause



分别运行,效果如下,且在F:\caffe-master170309\data\TrafficJamBigData03301009 文件夹内生成了TrafficJamBigData03301009-train_lmdb和TrafficJamBigData03301009-test_lmdb文件夹:如下:(8个文件)



3.1.3 生成均值文件

F:\caffe-master170309\Build\x64\Debug下新建mean-TrafficJamBigData03301009.bat,内容如下:

compute_image_mean.exe F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-train_lmdb mean.binaryproto --backend=lmdb
pause 


3.1.4  拷贝文件
在caffe-master170309/examples下新建TrafficJamBigData03301009文件夹。
把刚才生成的Debug/mean.binaryproto和F:\caffe-master170309\data\TrafficJamBigData03301009\TrafficJamBigData03301009-train_lmdb和F:\caffe-master170309\data\TrafficJamBigData03301009\TrafficJamBigData03301009-test_lmdb拷贝到caffe-master170309/examples/TrafficJamBigData03301009里。
修改F:\caffe-master170309\examples\TrafficJamBigData03301009\synset_words.txt为堵与不堵两类(注意budu在第一行,du在第二行,因为要和前面的label.txt对应)


3.1.5 新建文件

caffe-master170309/examples/TrafficJamBigData03301009里新建

空的RecognizeResultRecordFromCmdTxt.txt 

和 空的AnalysisOfRecognitionfromCmdTxt.txt

和 synset_words.txt(里面第一行是budu,第二行是du)
效果如下: 

技术分享


3.2 修改训练的“参数文件” & “模型结构”

3.2.1 编写训练bat(别急着运行) 参考1,参考2,参考我的微调笔记
在F:\caffe-master170309文件夹下新建一个train-TrafficJamBigData03301009.bat文件,用于训练模型内容如下:

.\Build\x64\Debug\caffe.exe  train --solver=models/bvlc_googlenet0329_1/solver.prototxt --weights=models/bvlc_googlenet0329_1/bvlc_googlenet.caffemodel  --gpu 0
pause


3.2.2 参数文件solver.prototxt  参考我的微调笔记

test_iter: 100								#原来1000,改为100
test_interval: 1000							#test_interval: 4000->1000
test_initialization: false
display: 40
average_loss: 40
base_lr: 0.01								#原来base_lr: 0.01
											#来自quick_solver的是      lr_policy: "poly"   
											#来自quick_solver的是      power: 0.5
lr_policy: "step"
stepsize: 320000
gamma: 0.96
max_iter: 50000								#max_iter: 10000000->10000
momentum: 0.9
weight_decay: 0.0002
snapshot: 1000								#snapshot: 40000->1000
snapshot_prefix: "models/bvlc_googlenet0329_1/bvlc_googlenet"
solver_mode: GPU


3.2.3 网络模型文件train_val.prototxt  参考我的微调笔记
其中finetune出现error=cudaSuccess(2 vs. 0) out of memory?网上意思是:batch_size改小,将batch_size由原来的256改为50,由原来的50改为10.
(整个网络结构有2000行,只改了前面2层和最后1层),改的部分截取如下:

前2层是:

name: "GoogleNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true			#原来也是true
    crop_size: 480			#原来是224
    mean_value: 104
    mean_value: 117
    mean_value: 123
  }
  data_param {
    source: "data/TrafficJamBigData03281545/TrafficJamBigData03281545-train_lmdb"
    batch_size: 10			#原来是32
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 480			#原来是224
    mean_value: 104
    mean_value: 117
    mean_value: 123
  }
  data_param {
    source: "data/TrafficJamBigData03281545/TrafficJamBigData03281545-test_lmdb"
    batch_size: 8			#原来是50
    backend: LMDB
  }
}


最后1层是:

layer {
  name: "loss3/top-5"
  type: "Accuracy"
  bottom: "loss3/classifier123"	#原来是(3个):loss3/classifier  loss2/classifier    loss1/classifier
  bottom: "label"
  top: "loss3/top-5"
  include {
    phase: TEST
  }
  accuracy_param {
    top_k: 2					#原来是5
  }
}


3.2.4 测试模型文件deploy.prototxt 参考我的微调笔记
改的第1层和倒数第2层,如下:

第1层如下:

name: "GoogleNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 480 dim: 480 } }		#  input_param { shape: { dim: 10 dim: 3 dim: 224 dim: 224 } }
}



倒数第二层如下:

layer {
  name: "loss3/classifier123"
  type: "InnerProduct"
  bottom: "pool5/7x7_s1"
  top: "loss3/classifier123"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 2				#原来是1000
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "loss3/classifier123"
  top: "prob"
}




3.2.5 运行F:\caffe-master170309\train-TrafficJamBigData03301009.bat文件,开始训练
1200张图(1200张训练+200张测试),迭代50000次,batch_size由“
32和50”改为“10和8

训练记录如下:










Caffe-5.2-(GPU完整流程)训练(根据googlenet、alexnet微调)

标签:margin   文件夹   prot   cuda   1.2   snap   weight   nsf   size   

原文地址:http://blog.csdn.net/daska110/article/details/68090214

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!