0

在图像分类和回归任务上,我很难使用 HDF5 使用 caffe,由于某种原因,在 HDF5 上的训练总是会在一开始就失败,测试和训练损失可能很快就会下降到接近于零。在尝试了降低学习率、添加 RELU、dropout 等所有技巧之后,什么都没有开始工作,所以我开始怀疑我提供给 caffe 的 HDF5 数据是错误的。

所以目前我正在研究通用数据集(牛津 102 类别花卉数据集,它也有公共代码),首先我尝试 ImageData 和 LMDB 层进行分类,它们都运行得很好。最后我使用 HDF5 数据层进行微调,training_prototxt 不会改变,除非在使用 HDF5 的数据层上。再一次,在学习开始时,在第 60 次迭代时,损失从 5 下降到 0.14,在第 100 次迭代时下降到 0.00146,这似乎证明了 HDF5 数据不正确。

我在github上有两个 HDF5 片段的图像和标签,它们似乎都生成了 HD​​F5 数据集,但由于某种原因,这些数据集似乎不适用于 caffe

我想知道这些数据有什么问题,或者让这个示例在 HDF5 中运行的任何问题,或者您是否有一些用于分类或回归的 HDF5 示例,这对我很有帮助。

一个片段显示为

def generateHDF5FromText2(label_num):
    print '\nplease wait...'

    HDF5_FILE = ['hdf5_train.h5', 'hdf5_test1.h5']
        #store the training and testing data path and labels
    LIST_FILE = ['train.txt','test.txt']
    for kk, list_file in enumerate(LIST_FILE):

    #reading the training.txt or testing.txt to extract the all the image path and labels, store into the array
    path_list = []
    label_list = []
    with open(list_file, buffering=1) as hosts_file:
        for line in hosts_file:
            line = line.rstrip()
            array = line.split(' ')
            lab = int(array[1])
            label_list.append(lab)
            path_list.append(array[0])  

        print len(path_list), len(label_list)

                # init the temp data and labels storage for HDF5
        datas = np.zeros((len(path_list),3,227,227),dtype='f4') 
        labels = np.zeros((len(path_list), 1),dtype="f4")

        for ii, _file in enumerate(path_list):
                    # feed the image and label data to the TEMP data
            img = caffe.io.load_image( _file )
            img = caffe.io.resize( img, (227, 227, 3) ) # resize to fixed size
            img = np.transpose( img , (2,0,1))
            datas[ii] = img
            labels[ii] = int(label_list[ii])

            # store the temp data and label into the HDF5
        with h5py.File("/data2/"+HDF5_FILE[kk], 'w') as f:
            f['data'] = datas
            f['label'] = labels
            f.close()
4

1 回答 1

2

一种输入转换似乎发生在原始网络中,并且在平均减法中从您的 HDF5 创建中丢失。
您应该获取平均文件(看起来像"imagenet_mean.binaryproto"您的示例),将其读入 python 并从每个图像中减去它。

顺便说一句,平均文件可以为您提供有关输入图像比例的线索(如果像素值应在 [0..1] 范围内或 [0..255] 内)。

您可能会发现caffe.io将 binaryproto 转换为 numpy 数组很有用。

于 2015-11-18T08:12:05.047 回答