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.

ご理解いただけると思いますが、2 つの別個のデータ HDF5 データ ファイルを作成します。それらは、正または負のサンプルである左と右の画像を同じインデックス上に持つことにより、正と負のサンプルで構成されます。labels_left と labels_right は、1 と 0 の同一の matlab 配列です。以前は単一のラベル配列を使用しようとしましたが、caffe でエラーが発生しました。これは、2 つのプロセスが衝突していることを示しているようです。ラベル配列のコピーに変更すると、トレーニングが開始される可能性があります。

以下は、私が現在使用している 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 つのパスが含まれていますが、これらのパスは同じフィルターを共有していません。レイヤー間でフィルターを共有するシャム ネットワークを構築する方法については、このチュートリアルを参照してください。

  2. "HDF5Data"レイヤーは 2 つの出力 (「トップ」) に制限されず、必要な数だけ持つことができます。したがって、トレーニング用に 1 つのレイヤーとテスト用に 1 つのレイヤーを使用できます。

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

    対応する hdf5 ファイルには、h5writeコマンドに指定された 3 つのデータセットが必要です (コードで 2 つだけではなく)。

  3. ペア損失の代わりにミニバッチ損失を使用することを検討しましたか?

于 2016-06-14T06:23:34.373 に答える