J'ai une question générale concernant le réglage et l'apprentissage de transfert, qui ont été venus lorsque j'ai essayé de déterminer comment obtenir le meilleur de Yolo pour détecter mon objet personnalisé (être des mains).
Je m'excuse pour le texte long contenant éventuellement beaucoup de fausses informations. Je serais heureux que quelqu'un ait la patience de la lire et de m'aider à nettoyer ma confusion.
Après beaucoup de googles, j'ai appris que beaucoup de gens considèrent que la réglage d'une sous-classe d'apprentissage de transfert tandis que d'autres pensent qu'ils sont à des approches différentes pour former un modèle. Dans le même temps, les gens se différencient entre la ré-entraînement uniquement la dernière couche classifieur d'un modèle sur un jeu de données personnalisée vs. Re-formant également d'autres couches du modèle (et éventuellement ajouté un classificateur tout neuf au lieu de la reconversion?). Les deux approches utilisent des modèles pré-formés.
My Final Confinien se trouve ici: J'ai suivi ces instructions: https://github.com/thtrieu/darkflow Pour former minuscule Yolo via Darkflow, à l'aide de la commande:
# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU: flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0
Mais que se passe-t-il ici? Je suppose que je ne recèle que le classificateur car les instructions disent de modifier le nombre de classes dans le dernier calque du fichier de configuration. Mais là encore, il est également nécessaire de modifier le nombre de filtres dans la deuxième dernière couche, une couche convolutionnelle.
Enfin, les instructions fournissent un exemple d'une formation alternative: # Completely initialize yolo-new and train it with ADAM optimizer flow --model cfg/yolo-new.cfg --train --trainer adam
Et je ne comprends pas du tout comment cela se rapporte aux différentes manières de l'apprentissage de transfert.
Si vous utilisez Alexeyab's DarkNet Repo (Not Dark Darkflow), il suggère de faire la fin du réglage au lieu de transférer l'apprentissage en définissant ce paramètre dans le fichier CFG: stopbackward=1
.
Puis entrée ./darknet partial yourConfigFile.cfg yourWeightsFile.weights outPutName.LastLayer# LastLayer#
tel que :
./darknet partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81
Cela créera yolov3.conv.81
et gelera la couche inférieure, puis vous pouvez vous entraîner en utilisant des poids de poids yolov3.conv.81
au lieu d'original darknet53.conv.74
.
Références: https://github.com/alexeyab/darknet#how-a-improve-Object-detection , https://groups.google.com/forum/#!Topic/sombre/mkkqrjulpd
Je n'ai pas travaillé sur Yolo, mais je vois vos problèmes, je pense que je peux aider. Le réglage fin, la ré-entraînement, la post-réglage sont tous des termes quelque peu ambiguës souvent utilisés de manière interchangeable. Il s'agit de combien vous voulez changer les poids pré-entraînés. Puisque vous chargez les poids dans le premier cas avec --load
, les poids préparés sont chargés ici - cela pourrait signifier que vous ajustez un peu les poids avec un faible taux d'apprentissage ou peut-être ne pas les changer du tout. Dans le second cas, cependant, vous ne chargez aucun poids, vous vous entraînez-vous probablement à partir de zéro.
Il y aurait des moyens séparés dans lesquels vous pouvez geler des couches éventuellement.