Caffe 在 train_val.proto 中一起使用 hdf5 层和 imagedata 输入层

Caffe using hdf5 layer and imagedata input layer together in train_val.proto

我目前正在使用 hdf5 数据层读取我拥有的图像(大约 30000 张)和一些关于图像的元数据作为输入。

我无法进行 crop-flip 数据增强,因为当我只使用中心裁剪时,存储大约 1500 张图像的数据只会导致大约 1.5 GB 的 h5 文件,hdf5 数据集的总大小(30 个 h5 文件)变成 ~40 GB,所以我不能使用扩充,因为 hdf5 数据集会太大。

所以,我在想,如果我可以使用Imagedata层来读取图像,使用hdf5数据层来读取元数据,我的问题就可以解决了。但是我没有在这上面找到任何 material 。可以这样做吗?

是的,我以为我收到了一个错误,但这是由于我的原型文件中的其他内容,下面是我的原型输入层

layer {
  type: "HDF5Data"
  name: "data"
  top: "Meta" 
  hdf5_data_param {
    source: "/path/to/train.txt"
    batch_size: 50
  }
  include { phase: TRAIN }
}
layer {
  name: "data"
  type: "ImageData"
  top: "X"
  top: "Labels"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
  }
  image_data_param {
    source: "/path/to/train.txt"
    batch_size: 50
    new_height: 256
    new_width: 256
  }
}
layer {
  type: "HDF5Data"
  name: "data"
  top: "Meta" 
  hdf5_data_param {
    source: "/path/to/val.txt"
    batch_size: 50
  }
  include { phase: TEST }
}
layer {
  name: "data"
  type: "ImageData"
  top: "X"
  top: "Labels"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
  }
  image_data_param {
    source: "/path/to/val.txt"
    batch_size: 50
    new_height: 256
    new_width: 256
  }
}

我很高兴你 。但是,HDF5 文件的文件大小限制根本不是问题。在 caffe 中,"HDF5Data" 层作为输入获取一个 text 文件作为 source 列出 尽可能多的 hdf5 文件!因此,如果你遇到一个很大的hdf5文件,你可以把它拆分成几个较小的文件,然后把它们都列在文本文件中。

例如,您可能有 /path/to/hdf5_list.txt 文件列出以下文件

/path/to/not_too_large_file.h5
/path/to/split_large_file_001.h5
/path/to/split_large_file_002.h5
/path/to/split_large_file_003.h5
/path/to/split_large_file_004.h5

等等...
然后你的输入层看起来像

layer {
  name: "input"
  type: "HDF5Data"
  top: "data"
  top: "label"
  hdf5_data_param {
    source: "/path/to/hdf5_list.txt"
  }
  include { phase: TRAIN }
}