数据层

数据层是模型最底层,提供提供数据输入和数据从Blobs转换成别的格式进行保存输出,通常数据预处理(减去均值,放大缩小,裁剪和镜像等)也在这一层设置参数实现.

参数设置:

  • name: 名称
  • type: 类型
    • Data: 从LMDB/LEVELDB读取数据和标签, 转换(http://deepdish.io/2015/04/28/creating-lmdb-in-python/) 可以使用convert_imageset转换
    • ImageData: 直接读取图片数据
    • ....
  • top: 输出数据(和下一层的bottom一样)
  • bottom: 输入数据()
  • include: 一般训练和测试的时候,模型层不一样,由include指定在哪一层出现, TRIAN/TEST
  • transform_params: 数据预处理
  • data_params: 数据参数

    • source: 数据位置
    • backend
    • batchsize: 设置batch的大小

例如,caffe中自带的mnist example

layer {
  name: "mnist" #名称
  type: "Data" #输入的是LMDB数据,前面的create_mnist.sh做了转换
  include: TRIAN  #只在训练的时候才包括(测试没有label)
  transform_param {
    scale: 0.00390625 #缩放参数
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb" #数据来源是在当前文件夹中的 mnist_train_lmdb中
    backend: LMDB
    batch_size: 64 #batch的大小
  }
  top: "data" #第一层输出data和label, 无bottom
  top: "label" #
}

--------------------------------------------------------------------------------------------------------------------------------------------------

convert_imageset [FLAGS] ROOTFOLDER/  LISTFILE DB_NAME

前面我们提到数据层中Data类型输入是LMDB/LEVELDB数据,而我们有的经常是原始图片数据,而且有可能原始图片的大小还不一致,我们需要将其转换为格式一致的可输入数据,caffe中的convert_imageset 为我们提供了这样的工具。

FLAGS:图片组参数

  • -gray: 是否以灰度图的方式打开图片,程序调用opencv库中的imread()函数来打开图片,默认为false
  • -shuffle: 是否随机打乱图片顺序,默认为false
  • -backend: 需要转换成db文件格式,可选为leveldb或lmdb默认为lmdb
  • -resize_width/resize_height: 改变图片大小,需要的时候可以使得图片大小一致,程序调用opencv的resize()函数来对图片进行缩放,默认为0,不变
  • -check_size: 检查所有的数据是否有相同的尺寸,默认为false, 不检查
  • -encoded: 是否将原图片的编码放入最终的数据,默认为false
  • -encoded_type: 与前一个参数对应,将图片编码为一个格式

ROOTFOLDER: 图片存放的绝对路径,从linux系统根目录开始

LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片及其类别标签

DB_NAME: 最终生成的db文件存放目录

例如:

#!/usr/bin/env sh
DATA=examples/images/cropimage/  #路径变量
rm -rf $DATA/img_train_lmdb #如果文件存在,先删除再重新创建
build/tools/convert_imageset --shuffle --gray --check_size=true  /home/vicent/caffe/examples/images/cropimage/ $DATA/batchfile.txt $DATA/img_train_lmdb

#乱序,转换为灰度,检查大小是否一致                                                   

  

--------------------------------------------------------------------------------------------------------------------------------------------------

视觉层

卷积层

卷积的目的是提取feature

  • name: 名称
  • type: 层类型
  • bottom: 输入
  • top: 输出
  • lr_mt: 学习率速率, 最终学习率是这个数乘以solver.prototxt 配置文件中的base_lr; 如果有两个lr_mt一个表示偏置学习率,一个表示权值学习率
  • num_outputs: filter的个数
  • kernel_size: 卷积核大小
  • stride: 步长
  • pad: 边缘扩充
  • weight_filler: 权值初始化, 默认为constant, 值全为0,经常用xavier, 也可设置为gaussian
  • bias_filler: 偏置初始化方法, 一般偏置初始化方法可以不设置

例如:

layer {
  name: "conv1" #名称
  type: "Convolution" #层类型
  bottom: "data" #上一层输入数据
  top: "conv1" #这一层输出数据
  param {
    lr_mult: 1  #权重学习率速率
  }
  param {
    lr_mult: 2  #偏置学习率速率
  }
  convolution_param {
    num_output: 20  #filter的个数
    kernel_size: 5    #卷积核的大小
    stride: 1  
    weight_filler {
      type: "xavier"  #权重初始化方法
    }
    bias_filler {
      type: "constant"  #偏置初始化方法
    }
  }
}

 

池化层

减少数据量和数据维度

  • kernel_size:池化核大小
  • pool: 池化方法, max, ave, stochastic
  • pad:
  • stride

 

Normalization