[PYTHON] J'ai essayé d'apprendre PredNet

caltech_montage_1.gif (La figure ci-dessus est tirée du site de la source de recherche et développement)

PredNet? https://coxlab.github.io/prednet/ Bill Lotter, Gabriel Kreiman, and David Cox (2016)

Un modèle d'apprentissage en profondeur qui prédit les futures images de la vidéo. Il existe différentes démos dans CoxLab (lien ci-dessus), qui est la source de recherche et développement, donc si vous regardez, vous obtiendrez une image.

C'est une histoire qui s'est enthousiasmée vers le milieu de 2016, donc il peut y avoir des sentiments maintenant, mais Je vais résumer ce que j'ai appris en apprenant réellement. (Plutôt que d'expliquer les algorithmes et les concepts, nous parlerons principalement de l'apprentissage et de l'environnement.)

Jusqu'à ce que tu apprennes

Le code étant accessible au public (https://github.com/coxlab/prednet), il est possible de former le modèle sans lire l'article.

À propos de l'environnement

Afin d'exécuter le code d'origine tel quel, il est nécessaire de préparer l'environnement de Python2 + Keras1. Veuillez noter que la dernière version est Python3 + Keras2, donc c'est un peu vieux. J'ai essayé de le porter sur Keras2, mais l'apprentissage a échoué, alors j'ai décidé de le faire avec Keras1. Je ne l'ai pas fait, mais je pense qu'il est possible de le porter sur Python3.

Préparation des données

La principale référence dans l'article est Image de la caméra embarquée par KITTI [^ 1]. Il y a process_kitti.py dans le script qui a étégit clone, donc si vous l'exécutez,

--Téléchargement des données

Le fera automatiquement. Mais c'est ** très ** lent. Dans l'environnement que j'ai utilisé, il m'a fallu trois jours complets pour télécharger les données. Il peut ou non être proche de 100 Go au total, mais je pense toujours qu'il est trop tard.

Apprentissage

Une fois que les données sont prêtes, exécutez kitti_train.py pour commencer à apprendre. Ici aussi, il y a quelques mises en garde.

Temps d'étude

C'est difficile à dire car cela dépend de l'environnement, mais dans l'environnement que j'ai utilisé (GeForce GTX TITAN 6082MiB), cela prenait environ 5 minutes par époque. Le réglage par défaut est de former 150 époques, donc cela prend un peu plus de 12 heures au total. Je pense que c'est un temps d'apprentissage assez raisonnable pour un modèle qui intègre LSTM.

État de l'apprentissage

Voici la courbe d'apprentissage: image.png On peut dire que les paramètres sont suffisamment stables. Si rien n'est falsifié, le taux d'apprentissage sera réduit à 1/10 lorsque epoch = 75, mais à ce moment, la perte diminuera fortement. La perte d'entraînement (ligne bleue) a diminué, mais la perte de validation (ligne orange) a toujours tendance à diminuer, vous voudrez peut-être en savoir un peu plus.

Une autre chose à noter est que la perte (MAE) mesurée pendant l'apprentissage est ** mesurée différemment ** de la MAE rapportée dans l'article. Il est rapporté dans l'article que le MAE a finalement atteint 3,13e-3 (= 0,00313), mais ce MAE mesure "l'erreur de pixel entre la trame prédite et la trame réelle". Par contre, la perte rapportée par Keras lors de l'entraînement est la même au sens de MAE, mais il s'agit d'une mesure de "l'erreur entre la sortie de l'unité d'erreur E et la matrice zéro" [^ 2]. En fait, l'erreur finale du modèle entraîné cette fois (axe vertical dans le graphique ci-dessus) était de 1,780e-2 (= 0,01780) pour l'entraînement et de 2,36e-2 (= 0,0236) pour la validation. L'ordre est différent.

Résultat de la prédiction

Lorsque le modèle a été effectivement appliqué aux données de test, le MAE dans le cadre (le même que la méthode de mesure dans l'article) était de 3,927e-3, ce qui était légèrement inférieur à la précision rapportée dans l'article, mais il semble être proche de l'exactitude rapportée dans l'article. est.

L'image résultante est montrée ci-dessous, mais je vais d'abord expliquer comment lire l'image résultante. Cette vidéo est de 10 Hz (10 ips, c'est-à-dire que 1 seconde contient 10 images), et la prédiction est de 10 images, soit 1 seconde. Même s'il s'agit d'une prédiction de 10 trames, on peut dire qu'il s'agit en fait d'une prédiction une trame d'avance car la prédiction est faite après avoir reçu la trame précédente en entrée. Si vous dessinez un diagramme de quelle image vous prédisez à partir de quelle image, il ressemble à ce qui suit. image.png ** (Notez que la structure RNN existe dans le modèle, donc vous vous «souvenez» de l'entrée jusqu'à présent et utilisez également ces informations.) **

Il est également mentionné dans l'article (également inclus dans le code) qu'il fait vraiment des prédictions quelques images à l'avance (appelées extrapolation), auquel cas la figure suivante Sera: image.png Les premières images réchauffent le modèle avec l'image précédente pour intégrer l'état dans le RNN. Après cela, sans passer aucune image correcte, je pense que ma sortie est correcte et commence l'extrapolation. Veuillez noter que tous les résultats de prédiction affichés ci-dessous ne sont pas extrapolés.

Les résultats de la prédiction sont les suivants (extrait): plot_000.png plot_001.png plot_005.png plot_011.png plot_041.png plot_043.png plot_081.png

Comme indiqué dans l'article, nous pouvons prédire correctement les lignes blanches et les ombres sur les routes. Mouvements étranges à propos de la voiture (je ne peux pas apprendre car il n'y a pas beaucoup de données à déplacer latéralement vers moi? Par exemple, dans la cinquième image, la voiture traverse devant moi et la prédiction est étrange) À moins que ce ne soit le cas, c'est tout à fait prévisible. L'action de tourner la poignée (6ème image) semble bien gérée.

[^ 1]: Institut de technologie de Karlsruhe (KIT) et Institut technologique de Toyota à Chicago (TTI-C), en collaboration avec KITTI. TOYOTA publie également l'ensemble de données vidéo de la caméra embarquée. [^ 2]: L'unité d'erreur E divise la différence entre la trame prédite et la trame réelle en "partie positive" et "partie négative" et applique ReLU, qui est les "pixels de la trame prédite et de la trame réelle". C'est différent de «erreur».

Recommended Posts

J'ai essayé d'apprendre PredNet
J'ai essayé de déboguer.
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de laisser VAE apprendre les animations
J'ai essayé d'organiser SVM.
J'ai essayé d'implémenter PCANet
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de créer l'API Quip
J'ai essayé de toucher Python (installation)
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé d'expliquer l'ensemble de données de Pytorch
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai touché l'API de Tesla
Je veux gratter des images et les former
J'ai essayé de m'organiser à propos de MCMC.
J'ai essayé d'implémenter Realness GAN
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de résumer la commande umask
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de gratter
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de commencer avec Hy
J'ai essayé PyQ
J'ai essayé d'implémenter PLSA dans Python 2
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé AutoKeras
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'ajouter un post-incrément à l'implémentation CPython
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé de laisser optuna résoudre le nombre
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'implémenter PPO en Python
J'ai essayé le moulin à papier
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de toucher Python (syntaxe de base)
J'ai essayé django-slack
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
J'ai fait de mon mieux pour retourner au Lasso