1

这个问题是指这里回答的一个问题。
公认的答案建议即时创建标签。我有一个非常相似的问题,但需要使用 HDF5。


这是我的prototxt:

name: "StereoNet"
layer {
    name: "layer_data_left"
    type: "HDF5Data"
    top: "data_left"
    top: "labels_left"
    include {
        phase: TRAIN
    }
    hdf5_data_param {
        source: "/home/ubuntu/trainLeftPatches.txt"
        batch_size: 128
    }
}
layer {
    name: "layer_data_right"
    type: "HDF5Data"
    top: "data_right"
    top: "labels_right"
    include {
        phase: TRAIN
    }
    hdf5_data_param {
        source: "/home/ubuntu/trainRightPatches.txt"
        batch_size: 128
    }
}
...  etc.

如您所愿,我创建了两个单独的数据 HDF5 数据文件。它们由正样本和负样本组成,在同一索引上具有左图像和右图像,它们组合起来是正样本或负样本。labels_left 和 labels_right 是相同的 1 和 0 的 matlab 数组。我之前尝试使用单个标签数组,但 caffe 出现错误,这似乎表明两个进程发生冲突。当更改为标签数组的副本时,可以开始训练。

这是我现在使用的 Matlab 数据创建文件的一部分,数据是 KITTI 数据:

h5create('trainLeftPatches.h5','/data_left',[9 9 1 numberOfTrainingPatches],'Datatype','double');
h5create('trainLeftPatches.h5','/labels_left',[1 numberOfTrainingPatches],'Datatype','double');

h5create('trainRightPatches.h5','/data_right',[9 9 1 numberOfTrainingPatches],'Datatype','double');
h5create('trainRightPatches.h5','/labels_right',[1 numberOfTrainingPatches],'Datatype','double');

h5create('valLeftPatches.h5','/data_left',[9 9 1 numberOfValidatePatches],'Datatype','double');
h5create('valLeftPatches.h5','/labels_left',[1 numberOfValidatePatches],'Datatype','double');

h5create('valRightPatches.h5','/data_right',[9 9 1 numberOfValidatePatches],'Datatype','double');
h5create('valRightPatches.h5','/labels_right',[1 numberOfValidatePatches],'Datatype','double');

h5write('trainLeftPatches.h5','/data_left', dataLeft_permutated(:, :, :, 1:numberOfTrainingPatches));
h5write('trainLeftPatches.h5','/labels_left', labels_permutated(:, 1:numberOfTrainingPatches));

h5write('trainRightPatches.h5','/data_right', dataRight_permutated(:, :, :, 1:numberOfTrainingPatches));
h5write('trainRightPatches.h5','/labels_right', labels_permutated(:, 1:numberOfTrainingPatches));

h5write('valLeftPatches.h5','/data_left', dataLeft_permutated(:, :, :, numberOfTrainingPatches+1:end));
h5write('valLeftPatches.h5','/labels_left', labels_permutated(:, numberOfTrainingPatches+1:end));

h5write('valRightPatches.h5','/data_right', dataRight_permutated(:, :, :, numberOfTrainingPatches+1:end));
h5write('valRightPatches.h5','/labels_right', labels_permutated(:, numberOfTrainingPatches+1:end));

toc;

最后小批量的损失是可以接受的,但在测试中仍然太高

请指教。(它可能不起作用)。如果有错误,那可能是非常微妙的。

4

1 回答 1

0

您应该考虑的几点:

  1. 您的网络不是连体网络:它包含左右两条路径,但这些路径共享相同的过滤器。请参阅本教程如何构建跨层共享过滤器的连体网络。

  2. "HDF5Data"layer 不限于两个输出(“top”),它可以有任意多的输出。因此,您可以使用单层进行训练,使用单层进行测试:

    layer {
      name: "data"
      type: "HDF5Data"
      top: "data_left"
      top: "data_right"
      top: "labels"
      hdf5_data_param { ... }
      include { phase: TRAIN }
    }
    

    相应的 hdf5 文件应该为h5write命令指定三个数据集(而不是代码中只有两个)。

  3. 您是否考虑过使用minibatch loss而不是 pair loss?

于 2016-06-14T06:23:34.373 回答