zoukankan      html  css  js  c++  java
  • Caffe-5.2-(GPU完整流程)训练(依据googlenet微调)

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

    1. 训练

    迭代了2800次时死机,大概20分钟。

    使用的是2000次的模型。


    2. 測试

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

    .Buildx64Debugcaffe.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的使用)
    改Debugclassfication.bat例如以下(測试单张图F:caffe-master170309dataTrafficJamBigData03281545 estdu190416357.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-master170309dataTrafficJamBigData03301009目录里有2个目录、2个*.m,两个空的txt。
    得到标签train_label.txt与test_label.txt

    3.1.2 转换为lmdb格式
    F:caffe-master170309Buildx64Debug下新建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-master170309Buildx64Debug下新建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-master170309dataTrafficJamBigData03301009 目录内生成了TrafficJamBigData03301009-train_lmdb和TrafficJamBigData03301009-test_lmdb目录:例如以下:(8个文件)



    3.1.3 生成均值文件

    F:caffe-master170309Buildx64Debug下新建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-master170309dataTrafficJamBigData03301009TrafficJamBigData03301009-train_lmdb和F:caffe-master170309dataTrafficJamBigData03301009TrafficJamBigData03301009-test_lmdb复制到caffe-master170309/examples/TrafficJamBigData03301009里。
    改动F:caffe-master170309examplesTrafficJamBigData03301009synset_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文件。用于训练模型内容例如以下:

    .Buildx64Debugcaffe.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由原来的32改为2,由原来的50改为2.
    (整个网络结构有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: 2			#原来是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: 2			#原来是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 rain-TrafficJamBigData03301009.bat文件,開始训练
    1200张图(1200张训练+200张測试),迭代50000次,batch_size由“
    32和50”改为“2和2

    训练记录例如以下:

    11:54開始。

    iter40次,14秒。

    推算的话

    iter50000次,5小时。









  • 相关阅读:
    Maven的安装及更改下载仓库
    maven如何配置
    hibernate+mysql的连接池配置
    Hibernate配置方式
    如何获得Webapp的根项目路径 即ServletContext.getRealPath() 的输入参数要以"/"开头
    JAVA WEB项目中各种路径的获取
    java创建文件和目录
    Button或者ImageButton的背景设为透明或者半透明
    ScrollView中嵌套ListView的问题
    Android中RelativeLayout各个属性的含义
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7295370.html
Copyright © 2011-2022 走看看