1

Ich habe ein einzelnes Label-Regressionsproblem in Caffe gemacht. Die Eingabe enthält 5 hdf5-Dateien, die ich unabhängig voneinander mit verschiedenen Bildern erstellt habe. Ich testete zuerst mein Netzwerk mit einer einzelnen hdf5-Datei und führte 10000 Iterationen mit ungefähr 800 Trainingsbildern durch (Losgröße 64). Schließlich, wenn ich Vorhersage auf den gleichen Trainingsbilder tat, bekam ich das Ergebnis wie folgt:Regression in Caffe: Vorhersage ist sehr fehlerhaft

enter image description here

Aber auf den Testbildern war es:

enter image description here

die so weit wie ich Das liegt an der geringeren Menge an Trainingsdaten und daran, dass die Testdaten den Trainingsdaten nicht sehr ähnlich sind.

Also habe ich versucht, die Trainingsdaten auf etwa 5500 Bilder zu erhöhen und sie in 5 hdf5-Dateien aufzuteilen. Und die Vorhersage Ausgabe auf den Trainingsdaten eines Modells mit 14.000 Iterationen erstellt ist:

enter image description here

Ich verstehe nicht, warum die Vorhersage schlimmer ist? Wie wählt Caffe eine Charge aus? (Meine Batch-Größe ist 64) Wird aus den 5 hdf5-Dateien zufällig ein Batch ausgewählt? Was könnte der Grund für meine schlechte Vorhersage sein? Und was kann ich tun, um mein Modell effektiv zu trainieren? Sollte ich mehr Faltungsschichten hinzufügen? Alle Vorschläge werden äußerst lebensrettend sein. Dies ist mein erster Versuch in neuronalen Netzen und Caffe. Mein Netzwerk ist:

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

Ich bin nicht so vertraut mit Caffe und der Netzwerk-Darstellung. Aber die einzige Art von Regulierung, die ich sehe, ist von den Dropout-Layern. Vielleicht fügen Sie Ihren Gewichten etwas l1/l2 Regulierung hinzu. Ich hoffe, dass Ihnen das Konzept der Regulierung klar ist, da es in ML sehr wichtig ist. (Ohne Regulierung wird ein Netzwerk, das mächtig/groß genug ist, Ihnen nahezu perfekte Trainingswerte geben, aber es speichert die Daten und es gibt keine Garantie, was mit anderen Daten wie Ihren Testdaten passieren wird.) – sascha

+0

@sascha Danke für Ihre Antwort. In meinem Fall ist das Ergebnis nicht überanstrengt, die Vorhersage der Trainingsdaten selbst ist nicht gut genug. Tatsächlich habe ich Zweifel an der Menge an Trainingsdaten, die ich verwende oder an der Art, wie meine Daten verwendet werden und ob die Netzwerkstruktur mit nur einer einzigen Faltungsschicht gut genug ist. Auch wie caffe mit den mehreren hdfs-Dateien umgeht und wie sie daraus einen Stapel auswählt. Ich möchte wissen, ob ich meine Datenmenge im selben Netzwerk erhöhen oder mein Netzwerk zuerst verbessern sollte, bevor ich meine Daten erhöhe. – magneto

Antwort

1

Versuchen Hinzufügen Faltungsschichten, und entfernen Sie die Dropout (dann können Sie es verwenden, wenn Sie eine Überanpassung Probleme haben). Außerdem müssen Sie den Verlust überprüfen, der von Caffe während des Trainings gedruckt wird; basierend darauf müssen Sie möglicherweise auch die Lernrate usw. in der Solver-Datei ändern.

Verwandte Themen