Darkflow: Ajout de la précision de la formation et de la validation au processus de formation

Créé le 30 mai 2017  ·  37Commentaires  ·  Source: thtrieu/darkflow

Pendant la formation :
step1 - perte 240.92623901367188 - perte moyenne mobile 240.92623901367188
étape 2 - perte 241.2866668701172 - perte moyenne mobile 240.96228179931643
étape 3 - perte 239.79562377929688 - perte moyenne mobile 240.84561599731447

Comment ajouter une précision d'entraînement et une précision de validation ?

step1 - perte 240.92623901367188 - perte moyenne mobile 240.92623901367188 - train 0.221
étape 2 - perte 241.2866668701172 - perte moyenne mobile 240.96228179931643 - train 0.222
étape 3 - perte 239,79562377929688 - perte moyenne mobile 240,84561599731447 - train 0,223
Fini 1 Epoque, validation 0,210

Commentaire le plus utile

Oui pas de problème. Je vais télécharger les fichiers ici. Si vous avez des questions, posez-les simplement.

diff.zip

Tous les 37 commentaires

Il existe 2 méthodes pour le faire. Vous pouvez diviser l'ensemble de données en train et valider les ensembles à l'intérieur du code ou simplement envoyer 2 ensembles de données distincts, un pour le train et un pour valider lorsque vous appelez le module de flux.

Quoi qu'il en soit, pour ce faire, vous devez ajouter de nouveaux paramètres dans le fichier default.py, puis modifier les fonctions _batch, parse et shuffle de data.py (dossiers yolo et yolov2) et modifier la méthode train() dans flow.py file (ici, vous n'avez qu'à exécuter un autre lot (chaque itération ou une fois plusieurs itérations) en utilisant la même session tensorflow, mais sans retourner le train_op afin de ne pas modifier les poids). Vous pouvez également ajouter un autre tf.summary.FileWriter pour la validation afin de pouvoir visualiser votre graphique de perte de validation à l'aide de Tensorboard.

J'ai personnellement choisi d'envoyer 2 jeux de données différents. C'était assez simple. J'espère avoir été assez clair.

@Costyv95 Pouvez-vous partager votre code avec les paramètres ajoutés et les modifications que vous avez suggérées ?

Oui pas de problème. Je vais télécharger les fichiers ici. Si vous avez des questions, posez-les simplement.

diff.zip

@ Costyv95 L'ensemble de validation contribue-t-il à la mise à jour du gradient dans votre implémentation ?

Je l'ai compris, les échantillons de validation ne contribuent pas à la mise à jour du gradient.

Oui, la validation est uniquement pour un aperçu des résultats du modèle en dehors de l'ensemble d'apprentissage.

Salut,
Pardon. Je n'ai pas remarqué le dernier courrier. Oui, la validation est uniquement pour un aperçu des résultats du modèle en dehors de l'ensemble d'apprentissage.

Le mardi 4 juillet 2017, 15h16:24 GMT+3, yfliu [email protected] a écrit :

Je l'ai compris, les échantillons de validation ne contribuent pas à la mise à jour du gradient.

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

@ Costyv95 Je veux juste savoir comment l'exécuter après avoir modifié le code d'origine? Merci beaucoup!

@Costyv95 Je l'exécute comme ceci ./flow --model cfg/yolo.cfg --train --dataset "/home/thinkjoy/lwl/modify-darkflow-master/data/VOCdevkit/VOC2007/JPEGImages" --annotation " /home/thinkjoy/lwl/modify-darkflow-master/data/VOCdevkit/VOC2007/Annotations" --gpu 1.0
voici une erreur (modifiez le code comme vous)
Fichier "/home/thinkjoy/lwl/modify-darkflow-master/darkflow/net/flow.py", ligne 82, en train
feed_dict[self.learning_rate] = lr
AttributeError : l'objet 'TFNet' n'a pas d'attribut 'learning_rate'

Cela se produit parce que le code que je vous ai donné a quelques modifications pour le taux d'apprentissage adaptatif et il y a un autre changement que vous devez faire. Vous le trouvez ici : https://github.com/thtrieu/darkflow/pull/216/commits/124d55d32d17bdee111201fd6fe520db709a4f9c

Et vous devez ajouter --val_dataset et val_annotation aux arguments pour avoir une perte de validation.

@ Costyv95 Pouvons-nous contrôler le nombre d'étapes à valider une fois, je pense juste qu'une étape une val est une petite perte de temps pour la formation ? Merci!

@ Costyv95 Et avez-vous réussi à ajouter la précision lorsque val?

@dream-will Pour une validation une fois en N étapes, vous pouvez facilement ajouter un argument (val_steps) dans defaults.py et dans la méthode train dans flow.py, vous exécutez simplement le code qui est après le "#validation time" dans une instruction if comme ça:

` #heure de validation

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))`

Dans le fichier defaults.py, ajoutez simplement cette ligne :

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

Je ne comprends pas tout à fait la deuxième question sur l'ajout de la précision.

@ Costyv95 Merci pour votre réponse, la deuxième question signifie simplement que lors de la validation, nous obtenons non seulement la perte de validation, mais également la précision de la validation ?

@dream-will Pour cela, vous devez implémenter vous-même une méthode de précision personnalisée qui compare les bbox GT et les bbox prédites (pour obtenir les bbox prédites, voir le code utilisé dans la prédiction), mais je ne vois pas de raison à cela car la perte suffit. Sachez que la validation que vous voyez concerne uniquement un mini-lot aléatoire de l'ensemble de validation, mais cela représente très bien la perte de test sur un ensemble de données de validation suffisamment volumineux.

@Costyv95 ok, merci

Salut @Costyv95 . J'ai un problème pour sortir les valeurs de perte de valeur. J'ai modifié tous les fichiers en suivant vos instructions et codes. Il s'agit des erreurs suivantes
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

Pouvez-vous imprimer la valeur de la variable de fichier ?

@ Costyv95 non, je ne peux pas. C'est ce que je lance :
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

Ce que je voulais dire par le "fichier variabile" est le variabile utilisé à la ligne 36 dans misc.py, car je ne peux pas vraiment comprendre ce qui ne va pas avec votre code.
Vous n'avez pas d'argument --val_dataset ? Comment avez-vous mis en place le changement ? Vous avez divisé l'ensemble de données à l'intérieur du code ou vous avez ajouté l'argument --val_dataset ?

@ Costyv95 Salut, j'ai copié et collé vos fichiers sur diff.zip puis j'ai essayé de m'entraîner avec la commande

"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

Mais il y a toujours une erreur
`
[ nkhanh@localhost khanh]$ ./run_coke.sh

Analyse ./coke/yolo-coke-2c.cfg
Aucun chargement...
Fini en 0.0001392364501953125s
Traceback (appel le plus récent en dernier) :
Fichier "/usr/local/bin/flow", ligne 6, dans
cliHandler(sys.argv)
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/cli.py", ligne 26, dans cliHandler
tfnet = TFNet(DRAPEAU)
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/net/build.py", ligne 64, dans __init__
self.framework = create_framework(*args)
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", ligne 59, dans create_framework
retourner ceci (méta, DRAPEAUX)
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", ligne 15, dans __init__
self.constructor(méta, DRAPEAUX)
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/__init__.py", ligne 20, dans le constructeur
misc.labels(meta, FLAGS) #Nous ne chargeons pas à partir d'un fichier .pb, nous devons donc charger les étiquettes
Fichier "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/misc.py", ligne 36, dans les étiquettes
avec open(file, 'r') comme f :
TypeError : objet str, bytes ou os.PathLike attendu, pas NoneType
`

@khanh1412
dans misc.py line29
remplacez-le par votre fichier d'étiquettes personnalisées.
fichier = 'étiquettes.txt'

PS C'est une solution temporaire.

@Costyv95
comment comprendre supprimer '[' et ']' ?

Entrez en formation...
Traceback (appel le plus récent en dernier) :
Fichier "flow", ligne 6, dans
cliHandler(sys.argv)
Fichier "/Users/sisyphus/darkflow/darkflow/cli.py", ligne 33, dans cliHandler
print('Entrer formation...'); tfnet.train()
Fichier "/Users/sisyphus/darkflow/darkflow/net/flow.py", ligne 54, en train
arg_steps = self.FLAGS.steps[1:-1] # supprimer '[' et ']'
TypeError : l'objet 'NoneType' n'est pas inscriptible

salut @Costyv95

où dois-je ajouter tf.summary.FileWriter pour la validation afin de visualiser le graphique de perte de validation à l'aide de tensorboard.

Merci

@ Costyv95 J'ai essayé votre fichier zip, diff.zip. Mais le terminal me dit que --val_dataset est un argument invalide. Dois-je modifier d'autres fichiers ?

@ Costyv95 J'ai essayé votre fichier zip, diff.zip. Mais le terminal me dit que --val_dataset est un argument invalide. Dois-je modifier d'autres fichiers ?

Vous devez remplacer tous les fichiers, y compris ceux de yolo-data et yolov2-data. vous devez simplement copier et coller respectivement dans les dossiers associés en modifiant leurs noms simplement par "données" pour simplement modifier le fichier qu'ils contiennent.

@khanhhh
ajoutez un code "self.define('labels', 'labels.txt', 'path to labels file')" au "def setDefaults(self):" dans "darkflow\defaults.py", alors vous pouvez utiliser " --labels xxx.txt" comme ancien.

Merci beaucoup!!!!!!!!

Le 25 mai 2019, à 03h11, Jack [email protected] a écrit :

@KhanhHH https://github.com/KhanhHH
ajoutez un code "self.define('labels', 'labels.txt', 'path to labels file')" au "def setDefaults(self):" dans "darkflow\defaults.py", alors vous pouvez utiliser " --labels xxx.txt" comme ancien.

-
Vous recevez ceci parce que vous avez commenté.
Répondre à cet e - mail directement, voir sur GitHub https://github.com/thtrieu/darkflow/issues/264?email_source=notifications&email_token=AEIP7DOZYIFBYZHV22RVIADPXD7ELA5CNFSM4DNH2ANKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWHLNQQ#issuecomment-495892162 , ou couper le fil https://github.com/notifications/ unsubscribe-auth/AEIP7DPOGFQ2EYSSZFPZSL3PXD7ELANCNFSM4DNH2ANA .

@Costyv95
Bonjour, je veux savoir comment définir le chemin "gs://bucket_hand_detection_2" dans "darkflow\defaults.py" ? mon python (3.7) ne peut pas trouver ce chemin, il génère une erreur ; et quelle dose représente le « seau » ?

@Costyv95
Bonjour, je veux savoir comment définir le chemin "gs://bucket_hand_detection_2" dans "darkflow\defaults.py" ? mon python (3.7) ne peut pas trouver ce chemin, il génère une erreur ; et quelle dose représente le « seau » ?

Même erreur mais les points de contrôle sont enregistrés normalement, donc je ne sais pas quelle est cette erreur @ Costyv95

merci @Costyv95 !

Salut, @Costyv95 Yolo entraîne et génère une perte de validation, mais après 1000 étapes, une erreur est

Erreur:
error

@akmeraki bonjour j'ai rencontré le même problème, avez-vous trouvé une solution à cette erreur ?

@ zhe0503 @akmeraki J'espère qu'il n'est pas trop tard mais tout ce que j'ai fait a été de taper "pip install gsutil" et cela a résolu le problème !!

Salut les gars.
Que dois-je faire si je veux obtenir la précision de l'ensemble du modèle formé ?
Par exemple, j'entraîne mon modèle et j'arrête l'entraînement à un moment donné. J'ai maintenant le dernier point de contrôle enregistré et je veux calculer la précision jusqu'au dernier point de contrôle.
Les fichiers dans le dossier cpkt sont nommés comme,

point de contrôle
yolo-nouveau-50.data-00000-of-0001
yolo-nouveau-50.index
yolo-nouveau-50.meta
yolo-nouveau-50.profile

J'apprécierais l'aide les gars.

@Costyv95
J'ai suivi attentivement vos aimables instructions, mais il semble que train.py ne reconnaisse pas les arguments --val_.... Pourriez vous m'aider s'il vous plait? L'erreur est comme ci-dessous :
ERREUR - Argument non valide : --val_dataset

Cela se produit parce que le code que je vous ai donné a quelques modifications pour le taux d'apprentissage adaptatif et il y a un autre changement que vous devez faire. Vous le trouvez ici : 124d55d

Et vous devez ajouter --val_dataset et val_annotation aux arguments pour avoir une perte de validation.

Cela ne fonctionne pas pour moi. J'obtiens une erreur comme ci-dessous :
ERREUR - Argument non valide : --val_dataset

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

ma3252788 picture ma3252788  ·  3Commentaires

borasy picture borasy  ·  3Commentaires

ShawnDing1994 picture ShawnDing1994  ·  4Commentaires

hrshovon picture hrshovon  ·  5Commentaires

eugtanchik picture eugtanchik  ·  4Commentaires