1

私はCaffeで単一のラベル回帰問題を行っています。入力には、別々の画像を使用して独自に生成した5つのhdf5ファイルが含まれています。最初に私のネットワークを単一のhdf5ファイルでテストし、約800のトレーニング画像(バッチサイズ64)で10000回の繰り返しを実行しました。最後に、私は同じトレーニング画像に予測をしたとき、次のように、私は結果を得た:Caffeの回帰:予測は非常に誤りです

enter image description here

をしかし、テスト画像にそれがあった。

限り私として

enter image description here

トレーニングデータの量が少なく、テストデータがトレーニングデータに似ていないことが理解できます。

私は訓練データを約5500枚の画像に5枚のhdf5ファイルに分割してみました。そして、14,000回の反復を使用して作成したモデルを使用したトレーニングデータの予測出力は次のとおりです。予測が悪化している理由

enter image description here

は、私は理解していませんか? caffeはどのようにバッチを選択しますか? (私のバッチサイズは64です)5 hdf5ファイルからバッチをランダムに選択していますか?私の悪い予言の背後にある理由は何でしょうか?私のモデルを効果的に訓練するために私は何ができますか?畳み込みレイヤーを追加する必要がありますか?どんな提案も非常に人命を救うでしょう。これはニューラルネットワークとcaffeの私の最初の試みです。畳み込み層を追加すること

name: "Regression" 
layer{ 
    name: "data" 
    type: "HDF5Data" 
    top: "data" 
    top: "label" 
    hdf5_data_param { 
    source: "train_hdf5file.txt" 
    batch_size: 64 
    shuffle: true 
    } 
    include: { phase: TRAIN } 
} 
layer{ 
    name: "data" 
    type: "HDF5Data" 
    top: "data" 
    top: "label" 
    hdf5_data_param { 
    source: "test_hdf5file.txt" 
    batch_size: 30 
    } 
    include: { phase: TEST } 
} 
layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1" 
    param { lr_mult: 1 } 
    param { lr_mult: 2 } 
    convolution_param { 
    num_output: 20 
    kernel_size: 5 
    stride: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "conv1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "dropout1" 
    type: "Dropout" 
    bottom: "pool1" 
    top: "pool1" 
    dropout_param { 
    dropout_ratio: 0.1 
    } 
} 

layer{ 
    name: "fc1" 
    type: "InnerProduct" 
    bottom: "pool1" 
    top: "fc1" 
    param { lr_mult: 1 decay_mult: 1 } 
    param { lr_mult: 2 decay_mult: 0 } 
    inner_product_param { 
    num_output: 500 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "dropout2" 
    type: "Dropout" 
    bottom: "fc1" 
    top: "fc1" 
    dropout_param { 
    dropout_ratio: 0.5 
    } 
} 
layer{ 
    name: "fc2" 
    type: "InnerProduct" 
    bottom: "fc1" 
    top: "fc2" 
    param { lr_mult: 1 decay_mult: 1 } 
    param { lr_mult: 2 decay_mult: 0 } 
    inner_product_param { 
    num_output: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
} 
} 
layer{ 
    name: "loss" 
    type: "EuclideanLoss" 
    bottom: "fc2" 
    bottom: "label" 
    top: "loss" 
} 
+1

私は、カフェやネットワーク表現に精通していません。しかし、私が見るレギュレーションの唯一の種類は、ドロップアウト層からです。多分あなたの体重にいくつかのl1/l2のレギュレーションを加えてください。私はMLで非常に重要なので、レギュレーションの概念はあなたには明らかであることを願っています。 (レギュレーションなしでは、パワフルで十分なネットワークがあなたに完璧なトレーニングスコアを与えますが、ほとんどの場合、データを記憶しているので、テストデータのような他のデータで何が起きるかは保証されません)。 – sascha

+0

@サシャあなたの返事に感謝します。私の場合、その結果は過大ではなく、トレーニングデータ自体の予測は十分ではありません。実際には、私が使用しているトレーニングデータの量やデータの使用方法に疑問を抱いています。また、ネットワーク構造が単なる畳み込みレイヤーで十分であるかどうかは疑問です。また、caffeが複数のhdfsファイルを処理する方法と、複数のhdfsファイルからバッチを選択する方法についても説明します。データを増やす前に、同じネットワーク上でデータ量を増やすか、ネットワークを改善する必要があるかどうかを知りたい。 – magneto

答えて

1

てみてください、と(あなたが過学習の問題を抱えているならば、あなたはそれを使用することができます)、ドロップアウトを削除:マイネットワークです。さらに、トレーニング中にCaffeが印刷した損失を確認する必要があります。それに基づいてソルバーファイルの学習率なども変更する必要があるかもしれません。

関連する問題