caffe学习(4)数据层

数据是学习的原料,参考官网和网友的资料,来看一下数据与数据层。

Data:Ins and Outs
Caffe学习系列(2):数据层及参数,denny402

数据:输入与输出


在Caffe中,数据是以Blobs流动的(见caffe学习(1)caffe模型三种结构)。数据层的输入输出便需要由其他格式与Blobs进行相互转换。一些常见的变换如平均减法(mean-subtraction)、特征缩放是通过data layer配置完成。新的输入类型需要开发新的数据层,网络的其余部分遵循Caffe层目录的模块化。下段加载了MNIST数据:

layer {
  name: "mnist"
  # Data layer loads leveldb or lmdb storage DBs for high-throughput.加载leveldb 或 lmdb类型的数据实现高吞吐量
  type: "Data"
  # the 1st top is the data itself: the name is only convention
  top: "data"
  # the 2nd top is the ground truth: the name is only convention
  top: "label"
  # the Data layer configuration
  data_param {
    # path to the DB
    source: "examples/mnist/mnist_train_lmdb"
    # type of DB: LEVELDB or LMDB (LMDB supports concurrent reads)
    backend: LMDB
    # batch processing improves efficiency.
    batch_size: 64
  }
  # common data transformations
  transform_param {
    # feature scaling coefficient: this maps the [0, 255] MNIST data to [0, 1]
    scale: 0.00390625
  }
}
  • name: 表示该层的名称,可随意取,本层为”mnist”。
  • type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采用的LevelDB或LMDB数据,因此层类型设置为Data。
  • top或bottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。
  • data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。本例中第一个top是数据本身,第二个top是label(ground truth)(这些名字只是约定的)。
  • include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。(上例中没有出现)
include {
    phase: TRAIN #仅在训练中出现
  }
  • Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间。除了缩放,还有其他的一些预处理操作:
transform_param {
    scale: 0.00390625
    mean_file_size: "examples/cifar10/mean.binaryproto"
    # 用一个配置文件来进行均值操作
    mirror: 1  # 1表示开启镜像,0表示关闭,也可用ture和false来表示
    # 剪裁一个 227*227的图块,在训练阶段随机剪裁(random cropping),在测试阶段从中间裁剪
    crop_size: 227
  }
  • prefetching:预取,对于吞吐量数据层获取下一批数据,并在Net计算当前批处理时在后台准备。

具体的还需要分析data_param,data_param部分,就是根据数据的来源不同,来进行不同的设置。

  1. 数据来自于数据库(如LevelDB和LMDB)
    层类型(layer type):Data

    • 必须设置的参数:
      source: 包含数据库的目录名称
      batch_size: 每次处理的数据个数,如64
    • 可选的参数:
      rand_skip: 在开始的时候,跳过一定数量的数据输入,通常对异步的SGD很有用(useful for asynchronous sgd)。
      backend: 选择是采用LevelDB还是LMDB, 默认是LevelDB.
      示例:

      data_param {
          source: "examples/mnist/mnist_train_lmdb"
          batch_size: 64}
  2. 数据来自于内存
    层类型:MemoryData

    • 必须设置的参数:
      batch_size:每一次处理的数据个数,比如2
      channels:通道数
      height:高度
      width: 宽度
      即指定要从内存中读取的输入块的大小。存储器数据层直接从存储器读取数据,而不复制它。为了使用它,必须调用MemoryDataLayer :: Reset(C ++)或Net.set_input_arrays(Python),以便指定一个连续数据源(作为4D行主数组),一次读取一个批处理大小的块。示例:
      layer {
        top: "data"
        top: "label"
        name: "memory_data"
        type: "MemoryData"
        memory_data_param{
              batch_size: 2
              height: 100
              width: 100
              channels: 1
            }
        transform_param {
              scale: 0.0078125
              mean_file: "mean.proto"
              mirror: false
            }
      }
  3. 数据来自于HDF5(Input)
    层类型:HDF5Data

    • 必须设置的参数:
      source: 读取的文件名称
      batch_size: 每一次处理的数据个数
      示例:
      layer {
        name: "data"
        type: "HDF5Data"
        top: "data"
        top: "label"
        hdf5_data_param {
              source: "examples/hdf5_classification/data/train.txt"
              batch_size: 10
            }
      }
  4. 数据输出到HDF5(Output)
    层类型:HDF5Data

    • 必须设置的参数:
      file_name: 输出到的文件名称
      HDF5输出层执行与本节中其他层相反的功能:它将其输出blob写入磁盘。
  5. 数据来自于图片
    层类型:ImageData

    • 必须设置的参数:
      source: 一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)
      batch_size: 每一次处理的数据个数,即图片数
    • 可选参数:
      rand_skip: 在开始的时候,跳过一定的数据输入。通常对异步的SGD很有用。
      shuffle: 随机打乱顺序,默认值为false
      new_height,new_width: 如果设置,则将图片进行resize
      示例:
      layer {
        name: "data"
        type: "ImageData"
        top: "data"
        top: "label"
        transform_param {
              mirror: false
              crop_size: 227
              mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
            }
        image_data_param {
              source: "examples/_temp/file_list.txt"
              batch_size: 50
              new_height: 256
              new_width: 256
            }
      }
  6. 数据来源于Windows
    层类型:WindowData

    • 必须设置的参数:
      source: 一个文本文件的名字
      batch_size: 每一次处理的数据个数,即图片数
      示例:
      layer {
        name: "data"
        type: "WindowData"
        top: "data"
        top: "label"
        include {
              phase: TRAIN
            }
        transform_param {
              mirror: true
              crop_size: 227
              mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
            }
      window_data_param {
              source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt"
              batch_size: 128
              fg_threshold: 0.5
              bg_threshold: 0.5
              fg_fraction: 0.25
              context_pad: 16
              crop_mode: "warp"
            }
      }
  7. Dummy
    DummyData用于调试,详见DummyDataParameter。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值