以 HDF5 格式准备任意数据
除了图像分类数据集 ,Caffe 还有任意输入的 HDF5Data
层。该层要求将所有培训/验证数据存储在 hdf5格式文件中。
此示例显示如何使用 python h5py
模块构造此类 hdf5 文件以及如何设置 caffe HDF5Data
层以读取该文件。
构建 hdf5 二进制文件
假设你有一个文本文件'train.txt'
,每行包含一个图像文件名和一个浮点数作为回归目标。
import h5py, os
import caffe
import numpy as np
SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' )
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
sp = l.split(' ')
img = caffe.io.load_image( sp[0] )
img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
# you may apply other input transformations here...
# Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
X[i] = img
y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
L.write( 'train.h5' ) # list all h5 files you are going to use
配置 HDF5Data
层
一旦你拥有所有 h5
文件和列出它们的相应测试文件,你就可以为你的 train_val.prototxt
添加一个 HDF5 输入层:
layer {
type: "HDF5Data"
top: "X" # same name as given in create_dataset!
top: "y"
hdf5_data_param {
source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
batch_size: 32
}
include { phase:TRAIN }
}
如上所示,我们将 CaF 列入 HDF5 文件列表。这是因为在当前版本中,单个 HDF5 数据文件的大小限制为 2GB。因此,如果训练数据超过 2GB,我们需要将其拆分为单独的文件。
如果单个 HDF5 数据文件超过 2GB,我们会收到类似的错误消息
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
如果数据总量小于 2GB,我们是否应将数据拆分为单独的文件?
根据 Caffe 的源代码中的一条评论,单个文件会更好,
如果 shuffle == true,则对 HDF5 文件的排序进行混洗,并且对任何给定 HDF5 文件中的数据排序进行混洗,但不交错不同文件之间的数据。