Darkflow: Hinzufügen von Trainings- und Validierungsgenauigkeit zum Trainingsprozess

Erstellt am 30. Mai 2017  ·  37Kommentare  ·  Quelle: thtrieu/darkflow

Während dem Training:
step1 - Verlust 240.92623901367188 - Moving Ave Verlust 240.92623901367188
Schritt 2 - Verlust 241.2866668701172 - Moving Ave Verlust 240.96228179931643
Schritt 3 - Verlust 239.79562377929688 - Moving Ave Verlust 240.84561599731447

Wie füge ich Trainingsgenauigkeit und Validierungsgenauigkeit hinzu?

Schritt 1 - Verlust 240.92623901367188 - Fahrwegverlust 240.92623901367188 - Zug 0,221
Schritt 2 - Verlust 241.2866668701172 - Moving Ave Verlust 240.96228179931643 - Zug 0.222
Schritt 3 - Verlust 239.79562377929688 - Moving Ave Verlust 240.84561599731447 - Zug 0.223
Beendete 1 Epoche, Validierung 0.210

Hilfreichster Kommentar

Ja kein Problem. Ich werde die Dateien hier hochladen. Wenn Sie Fragen haben, fragen Sie einfach.

diff.zip

Alle 37 Kommentare

Dafür gibt es 2 Methoden. Sie können den Datensatz in Train- und Validation-Sets innerhalb des Codes aufteilen oder einfach 2 separate Datensätze senden, einen für Train und einen für Validation, wenn Sie das Flow-Modul aufrufen.

Wie auch immer, um dies zu tun, sollten Sie der Datei default.py einige neue Parameter hinzufügen, dann die Funktionen _batch, parse und shuffle von data.py (sowohl yolo- als auch yolov2-Ordner) ändern und die Methode train() in flow.py ändern file (hier müssen Sie nur einen weiteren Batch (jede Iteration oder einmal eine Anzahl von Iterationen) mit derselben Tensorflow-Sitzung ausführen, jedoch ohne train_op zurückzugeben, damit Sie die Gewichtungen nicht ändern). Sie können auch einen weiteren tf.summary.FileWriter zur Validierung hinzufügen, damit Sie Ihr Validierungsverlustdiagramm mit Tensorboard visualisieren können.

Ich persönlich habe mich dafür entschieden, 2 verschiedene Datensätze zu senden. Es war ziemlich direkt. Ich hoffe, ich war klar genug.

@ Costyv95 Können Sie Ihren Code mit den hinzugefügten Parametern und den von Ihnen vorgeschlagenen Änderungen teilen?

Ja kein Problem. Ich werde die Dateien hier hochladen. Wenn Sie Fragen haben, fragen Sie einfach.

diff.zip

@ Costyv95 Trägt der Validierungssatz zur Gradientenaktualisierung in Ihrer Implementierung bei?

Ich habe es verstanden, Validierungsproben tragen nicht zur Gradientenaktualisierung bei.

Ja, die Validierung dient nur einer Vorschau der Modellergebnisse außerhalb des Trainingssatzes.

Hallo,
Verzeihung. Die letzte Mail habe ich nicht bemerkt. Ja, die Validierung dient nur einer Vorschau der Modellergebnisse außerhalb des Trainingssatzes.

Am Dienstag, den 4. Juli 2017, 15:16:24 GMT+3 schrieb yfliu [email protected] :

Ich habe es verstanden, Validierungsproben tragen nicht zur Gradientenaktualisierung bei.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

@ Costyv95 Ich möchte nur wissen, wie es ausgeführt wird, nachdem der Originalcode geändert wurde? Vielen Dank!

@ Costyv95 Ich
Hier ist ein Fehler (ändern Sie den Code so wie Sie)
Datei "/home/thinkjoy/lwl/modify-darkflow-master/darkflow/net/flow.py", Zeile 82, im Zug
feed_dict[self.learning_rate] = lr
AttributeError: 'TFNet'-Objekt hat kein Attribut 'learning_rate'

Dies geschieht , weil der Code , den ich Ihnen gegeben habe , einige Modifikationen für die adaptive Lernrate enthält und Sie noch eine Änderung vornehmen müssen . Du findest es hier: https://github.com/thtrieu/darkflow/pull/216/commits/124d55d32d17bdee111201fd6fe520db709a4f9c

Und Sie sollten --val_dataset und val_annotation zu Argumenten für einen Validierungsverlust hinzufügen.

@ Costyv95 Können wir kontrollieren, wie viele Schritte einmal validiert werden müssen, ich denke nur, dass ein Schritt ein Wert ein wenig Zeitverschwendung für das Training ist? Danke!

@ Costyv95 Und haben Sie es geschafft, die Genauigkeit beim

@dream-will Für die Validierung einmal in N Schritten können Sie einfach ein Argument (val_steps) in defaults.py hinzufügen und in der train-Methode in flow.py führen Sie einfach den Code aus, der nach der "#validation time" in einer if-Anweisung steht so was:

` #validierungszeit

if i % self.FLAGS.val_steps == 0:
    (x_batch, datum) = next(val_batches)
    feed_dict = {
        loss_ph[key]: datum[key] 
            for key in loss_ph }
    feed_dict[self.inp] = x_batch
    feed_dict.update(self.feed)
    feed_dict[self.learning_rate] = lr

    fetches = [loss_op, self.summary_op] 
    fetched = self.sess.run(fetches, feed_dict)
    loss = fetched[0]

    if loss_mva_valid is None: loss_mva_valid = loss
    loss_mva_valid = .9 * loss_mva_valid + .1 * loss

    self.val_writer.add_summary(fetched[1], step_now)

    form = 'VALIDATION step {} - loss {} - moving ave loss {}'
    self.say(form.format(step_now, loss, loss_mva_valid))`

Fügen Sie in der defaults.py einfach diese Zeile hinzu:

self.define('val_steps', '1', 'evaluate validation loss every #val_steps iterations')

Ich verstehe die zweite Frage zum Hinzufügen der Genauigkeit nicht ganz.

@ Costyv95 Vielen Dank für Ihre Antwort, die zweite Frage bedeutet nur, dass wir bei der Validierung nicht nur den Validierungsverlust, sondern auch die Validierungsgenauigkeit erhalten?

@dream-will Dafür müssen Sie selbst eine benutzerdefinierte Genauigkeitsmethode implementieren, die die GT-Bboxen und die vorhergesagten Bboxen vergleicht (um die vorhergesagten Bboxen zu erhalten, sehen Sie sich den in der Vorhersage verwendeten Code an), aber ich sehe keinen Grund dafür, weil der verlust reicht. Beachten Sie, dass sich die angezeigte Validierung nur auf einen zufälligen Minibatch aus dem Validierungssatz bezieht, dies jedoch sehr gut den Testverlust bei einem ausreichend großen Validierungsdatensatz darstellt.

@ Costyv95 ok, danke

Hallo @Costyv95 . Ich habe ein Problem mit der Ausgabe von Werten für den Wertverlust. Ich habe alle Dateien geändert, indem ich Ihren Anweisungen und Codes gefolgt bin. Dies sind die folgenden Fehler
File "flow", line 6, in <module> cliHandler(sys.argv) File "/home/alxe/ML/darkflow/darkflow/cli.py", line 26, in cliHandler tfnet = TFNet(FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/build.py", line 64, in __init__ self.framework = create_framework(*args) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 59, in create_framework return this(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 15, in __init__ self.constructor(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/yolo/__init__.py", line 20, in constructor misc.labels(meta, FLAGS) #We're not loading from a .pb so we do need to load the labels File "/home/alxe/ML/darkflow/darkflow/net/yolo/misc.py", line 36, in labels with open(file, 'r') as f: TypeError: coercing to Unicode: need string or buffer, NoneType found

Können Sie den Wert der Dateivariablen ausgeben?

@ Costyv95 nein, ich kann nicht. Das betreibe ich:
python flow --model cfg/tiny-yolo-voc-1c.cfg --train --dataset train/images --annotation train/annotations --load bin/yolo.weights --gpu 1.0 --epoch 300

Was ich mit "Dateivariabile" meinte, ist die Variable, die in Zeile 36 in misc.py verwendet wird, weil ich nicht wirklich verstehen kann, was mit Ihrem Code nicht stimmt.
Sie haben kein Argument --val_dataset? Wie haben Sie die Änderung umgesetzt? Sie haben den Datensatz innerhalb des Codes aufgeteilt oder das Argument --val_dataset hinzugefügt?

@ Costyv95 Hallo, ich habe deine Dateien auf diff.zip kopiert und eingefügt, dann habe ich versucht, mit dem Befehl zu trainieren

"flow --train --model ./coke/yolo-coke-2c.cfg --annotation ./coke/train/annotations --dataset ./coke/train/images --gpu 1.0 --batch 8 --save 1000 --val_dataset ./coke/validation/images --val_annotation ./coke/validation/annotations

Aber es ist immer noch ein Fehler aufgetreten
`
[ nkhanh@localhost khanh]$ ./run_coke.sh

Parsing ./coke/yolo-coke-2c.cfg
Laden Keine ...
Fertig in 0,0001392364501953125s
Traceback (letzter Anruf zuletzt):
Datei "/usr/local/bin/flow", Zeile 6, in
cliHandler(sys.argv)
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/cli.py", Zeile 26, in cliHandler
tfnet = TFNet(FLAGS)
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/net/build.py", Zeile 64, in __init__
self.framework = create_framework(*args)
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", Zeile 59, in create_framework
zurückgeben (Meta, FLAGS)
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", Zeile 15, in __init__
self.constructor(meta, FLAGS)
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/__init__.py", Zeile 20, im Konstruktor
misc.labels(meta, FLAGS) #Wir laden nicht von einer .pb, also müssen wir die Labels laden
Datei "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/misc.py", Zeile 36, in Labels
mit open(file, 'r') als f:
TypeError: erwartete str, bytes oder os.PathLike-Objekt, nicht NoneType
`

@khanh1412
in misc.py line29
ändern Sie es in Ihre benutzerdefinierte Etikettendatei.
Datei = 'labels.txt'

PS Es ist eine vorübergehende Lösung.

@Costyv95
wie versteht man '[' und ']' entfernen?

Ausbildung betreten...
Traceback (letzter Anruf zuletzt):
Datei "flow", Zeile 6, in
cliHandler(sys.argv)
Datei "/Users/sisyphus/darkflow/darkflow/cli.py", Zeile 33, in cliHandler
print('Training eingeben ...'); tfnet.train()
Datei "/Users/sisyphus/darkflow/darkflow/net/flow.py", Zeile 54, in train
arg_steps = self.FLAGS.steps[1:-1] # '[' und ']' entfernen
TypeError: 'NoneType'-Objekt ist nicht subskriptierbar

Hallo @Costyv95

Wo sollte ich tf.summary.FileWriter für die Validierung hinzufügen, um das Validierungsverlustdiagramm mit Tensorboard zu visualisieren.

Danke

@ Costyv95 Ich habe Ihre Zip-Datei diff.zip ausprobiert. Aber das Terminal sagt mir, dass --val_dataset ein ungültiges Argument ist. Muss ich andere Dateien ändern?

@ Costyv95 Ich habe Ihre Zip-Datei diff.zip ausprobiert. Aber das Terminal sagt mir, dass --val_dataset ein ungültiges Argument ist. Muss ich andere Dateien ändern?

Sie sollten alle Dateien ersetzen, einschließlich yolo-data und yolov2-data. Sie sollten einfach kopieren und in die entsprechenden Ordner einfügen, indem Sie deren Namen einfach durch "Daten" ändern, um einfach die Datei darin zu ändern.

@khanhhh
fügen Sie einen Code "self.define('labels', 'labels.txt', 'path to labels file')" zu "def setDefaults(self):" in "darkflow\defaults.py" hinzu, dann können Sie " --labels xxx.txt" wie früher.

Ich danke dir sehr!!!!!!!!

Am 25. Mai 2019 um 3:11 Uhr schrieb Jack [email protected] :

@KhanhHH https://github.com/KhanhHH
fügen Sie einen Code "self.define('labels', 'labels.txt', 'path to labels file')" zu "def setDefaults(self):" in "darkflow\defaults.py" hinzu, dann können Sie " --labels xxx.txt" wie früher.


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie auf diese E - Mail direkt, sehen sie auf GitHub https://github.com/thtrieu/darkflow/issues/264?email_source=notifications&email_token=AEIP7DOZYIFBYZHV22RVIADPXD7ELA5CNFSM4DNH2ANKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWHLNQQ#issuecomment-495892162 , oder schalten Sie den Faden https://github.com/notifications/ unsubscribe-auth/AEIP7DPOGFQ2EYSSZFPZSL3PXD7ELANCNFSM4DNH2ANA .

@Costyv95
Hallo, ich möchte wissen, wie man den Pfad "gs://bucket_hand_detection_2" in "darkflow\defaults.py" festlegt? mein Python (3.7) kann diesen Pfad nicht finden, es wird ein Fehler ausgegeben; und welche Dosis stellt der "Eimer" dar?

@Costyv95
Hallo, ich möchte wissen, wie man den Pfad "gs://bucket_hand_detection_2" in "darkflow\defaults.py" festlegt? mein Python (3.7) kann diesen Pfad nicht finden, es wird ein Fehler ausgegeben; und welche Dosis stellt der "Eimer" dar?

Gleicher Fehler, aber Checkpoints werden normal gespeichert, daher weiß ich nicht, was dieser Fehler ist @ Costyv95

danke @Costyv95!

Hallo, @ Costyv95 Yolo trainiert und gibt Validierungsverlust aus, aber nach 1000 Schritten wird ein Fehler

Fehler:
error

@akmeraki hallo ich gestoßen , hast du eine lösung für diesen fehler gefunden?

@zhe0503 @akmeraki Ich hoffe, es ist nicht zu spät, aber ich habe nur "pip install gsutil" eingegeben und das Problem wurde gelöst !!

Hallo Leute.
Was müsste ich tun, wenn ich die Genauigkeit des gesamten trainierten Modells erhalten möchte?
Ich trainiere zum Beispiel mein Modell und höre irgendwann mit dem Training auf. Jetzt habe ich den letzten gespeicherten Kontrollpunkt und möchte die Genauigkeit bis zum letzten Kontrollpunkt berechnen.
Die Dateien im Ordner cpkt heißen wie

Kontrollpunkt
yolo-new-50.data-00000-of-00001
yolo-new-50.index
yolo-new-50.meta
yolo-new-50.profile

Ich würde mich über die Hilfe freuen, Jungs.

@Costyv95
Ich habe Ihre freundlichen Anweisungen sorgfältig befolgt, aber train.py scheint die Argumente --val_... nicht zu erkennen. Würden Sie mir bitte helfen? Fehler ist wie folgt:
FEHLER - Ungültiges Argument: --val_dataset

Dies geschieht , weil der Code , den ich Ihnen gegeben habe , einige Modifikationen für die adaptive Lernrate enthält und Sie noch eine Änderung vornehmen müssen . Sie finden es hier: 124d55d

Und Sie sollten --val_dataset und val_annotation zu Argumenten für einen Validierungsverlust hinzufügen.

Bei mir funktioniert es nicht. Ich erhalte eine Fehlermeldung wie folgt:
FEHLER - Ungültiges Argument: --val_dataset

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen