Digits Deepdetect

使用digits进行finetune

· by wangf · Read in about 1 min · (206 Words)
digits caffe

一、下载model参数

可以直接在浏览器里输入地址下载,也可以运行脚本文件下载。下载地址为:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel 文件名称为:bvlc_reference_caffenet.caffemodel,文件大小为230M左右,为了代码的统一,将这个caffemodel文件下载到caffe根目录下的 models/bvlc_reference_caffenet/ 文件夹下面。也可以运行脚本文件进行下载:

# sudo ./scripts/download_model_binary.py models/bvlc_reference_caffenet

二、准备数据

将训练数据放在一个文件夹内。比如我在当前用户根目录下创建了一个data文件夹,专门用来存放数据,因此我的训练图片路径为:/home/xxx/data/re/train 打开浏览器,运行digits,新建一个classification dataset,设置如下图:

下面图片格式选为jpg, 为dataset取一个名字,就开始转换吧。结果如图:

三、设置model

回到digits根目录,新建一个classification model, 选中你的dataset, 开始设置最重要的network.

  • caffenet的网络配置文件,放在 caffe/models/bvlc_reference_caffenet/ 这个文件夹里面,名字叫train_val.prototxt。打开这个文件,将里面的内容复制到上图的Custom Network文本框里,然后进行修改,主要修改这几个地方:

1、修改train阶段的data层为:

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
  }
}

  • 即把均值文件(mean_file)、数据源文件(source)、批次大小(batch_size)和数据源格式(backend)这四项都删除了。因为这四项系统会根据dataset和页面左边“solver options»的设置自动生成。如果想用原始数据训练,可以不用crop_size,即图像数据不会crop,按照原始图像大小训练。

2、修改test阶段的data层:和上面一样,也是删除那些项。

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
  }
}

3、修改最后一个全连接层(fc8):

layer {
  name: "fc8-re"               #原来为"fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1.0
    decay_mult: 1.0
  }
  param {
    lr_mult: 2.0
    decay_mult: 0.0
  }
  inner_product_param {
    num_output: 5        #原来为"1000"
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}
  • 看注释的地方,就只有两个地方修改,其它不变。
  • 设置好后,就可以开始微调了(fine tuning).
  • 训练结果就是一个新的model,可以用来单张图片和多张图片测试。在此,将别人训练好的model用到我们自己的图片分类上,整个微调过程就是这样了。如果你不用digits,而直接用命令操作,那就更简单,只需要修改一个train_val.prototxt的配置文件就可以了,其它都是一样的操作。
  • 【注意】新版digits的网络结构是针对所有网络的,即包括的训练的网络结构,测试的网络结构和验证的网络结构,即在一个.prototxt 中包含了train/val/deploy 所有的结构。

  • 如果使用新版digits,除了上面数据层和最后一个全连接层的改动外,还有以下3处:

  • (1)修改accuracy层,删除原来phase: TEST修改为stage: «val»,下图的-表示删除,+表示增加,后面的均是这样表示。

layer {
name: "accuracy"
     type: "Accuracy"
     bottom: "output"
     bottom: "label"
     top: "accuracy"
-     include {
-         phase: TEST
-     }
+    include { stage: "val" }
}
  • (2)修改loss层,增加exclude { stage: «deploy» },表示loss只在训练和验证中计算,测试时不计算。
layer {
       name: "loss"
       type: "SoftmaxWithLoss"
       bottom: "output"
       bottom: "label"
       top: "loss"
+     exclude { stage: "deploy" }
+}
  • (3)增加softmax层,该层不在训练和验证中计算,只在测试时计算。
+ layer {
+      name: "softmax"
+      type: "Softmax"
+      bottom: "output"
+      top: "softmax"
+         include { stage: "deploy" }
+}

Comments