[PYTHON] 99,78% de précision avec apprentissage en profondeur en reconnaissant les hiragana manuscrits

Avec la reconnaissance de l'hiragana manuscrite et du réseau de neurones convolutifs (apprentissage en profondeur) selon le manuel, la précision de 99,78% a été obtenue. Il semble qu'il y ait un mérite pour ceux qui lisent et écrivent que ce soit selon le manuel (ce n'est pas unique), donc je vais l'écrire en Qiita.

Code source

Le code source est https://github.com/yukoba/CnnJapaneseCharacter.

Histoire

Je discutais avec un ami de la reconnaissance manuscrite des hiragana sur Facebook, et quand j'ai cherché sur Google, j'ai trouvé ces deux-là.

Les deux ont été écrits en mars 2016, mais je pense que les étudiants de l'Université de Stanford passent en premier.

Selon un rapport d'un étudiant de l'Université de Stanford

--Hiragana: 96,50% --Katakana: 98,19%

C'était.

Selon l'analyse d'un autre ami, je m'attendais à ce que les kanji soient plus faciles car ils ont plus d'indices. Dans cet article, je parlerai d'élever le hiragana le plus inexact à 99,78%.

base de données

Pour les données, tout le monde utilise ETL8G de la "base de données de caractères ETL" d'AIST, et je l'utilise également. Si vous souhaitez voir des caractères manuscrits spécifiques, veuillez visiter http://etlcdb.db.aist.go.jp/?page_id=2461.

Les données sont de 128 x 127 px, une image en niveaux de gris 4 bits pour 160 personnes. Il existe 72 types de hiragana.

Réseau de neurones à convolution

Voir http://qiita.com/tawago/items/931bea2ff6d56e32d693 de tawago pour l'histoire de base de ce qu'est un réseau neuronal convolutif (apprentissage en profondeur). De plus, le livre d'O'Reilly Japan "Deep Learning from scratch-Theory and implementation of deep learning learn with Python" est également une bonne introduction. C'était (je suis désolé, je n'ai navigué que).

Bibliothèque

En tant que bibliothèque de réseaux de neurones, cette fois

--Couche haute: Keras https://keras.io/ja/ --Couche basse: Theano http://deeplearning.net/software/theano/

J'ai utilisé. J'ai écrit le code pour travailler avec TensorFlow en tant que couche basse.

Le langage de programmation est Python 3.

Points d'amélioration

Donc, ce qui a changé de 95,04% de tawago et 96,50% d'étudiants à l'Université de Stanford. Je ne fais que les bases.

Nombre d'itérations

Tout d'abord, étudiant à l'Université de Stanford, j'ai utilisé le GPU d'Amazon EC2 car cela semblait être fait avec du CPU et le nombre de calculs était insuffisant. Augmentation du nombre d'époques (nombre de répétitions) de 40 à 400.

L'apprentissage automatique est divisé en données d'entraînement et données d'évaluation. J'entraîne les données d'entraînement, mais la méthode de descente de gradient probabiliste utilise des nombres aléatoires, et en principe, elle augmente ou diminue finement et change en cliquetis, mais comme une histoire différente, Lorsque le résultat de l'apprentissage est appliqué aux données d'évaluation, il s'améliore souvent jusqu'à un certain point et s'aggrave à partir d'un certain point. C'est ce qu'on appelle le surapprentissage.

Idéalement, le nombre de répétitions (nombre d'époques) devrait être fait jusqu'au début du surapprentissage (fin précoce), et cette fois il semble que le surapprentissage commence à environ 300 à 400 fois (je ne l'ai pas confirmé sérieusement), donc 400 fois Il est réglé sur.

Le nombre de divisions entre les données d'entraînement et les données d'évaluation est de 8: 2. Cela faisait suite à un étudiant de l'Université de Stanford.

modèle

Le modèle utilise ce que l'on appelle communément le "style VGG". Il a été annoncé par une personne de l'Université d'Oxford en septembre 2014 sous le nom de Very Deep Convolutional Networks for Large-Scale Image Recognition. Un exemple Keras écrit sur cette base est https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py, et je le modifie. Les étudiants de l'Université de Stanford sont également de style VGG. tawago est inconnu. Est-ce le style VGG?

Le style VGG est un réseau neuronal normal qui répète "pliage-> pliage-> mise en commun maximale".

Si vous expliquez brièvement le pliage, etc., ce sera comme ça. Pour plus de détails, consultez le livre «Deep Learning from scratch».

--Convolution: prenez le voisinage de chaque point (3x3, etc.), convertissez-le en un vecteur unidimensionnel et produit-le avec le paramètre. --Max pooling: prenez le voisinage de chaque point (2x2, etc.) et la valeur maximale qu'il contient

ETL8G ne contient que des données pour 160 personnes, pas un grand ensemble de données. En général, quand il y a peu de données, utiliser un modèle complexe avec un grand nombre de paramètres ne fonctionne pas, j'ai donc utilisé le simple exemple Keras tel quel. "Pliage-> Pliage-> Mise en commun maximum" est deux fois.

Fonction bruit

Une façon d'améliorer la capacité de généralisation est d'ajouter du bruit uniquement pendant l'entraînement. Ce sont les deux que j'ai utilisés cette fois.

--Dropout (1 / p fois avec probabilité p, 0 fois avec probabilité 1-p d'effacer)

Le décrochage est également utilisé par les étudiants de l'Université de Stanford. J'ai tous p = 0,5, c'est-à-dire 50% de chances de doubler et 50% de chances de 0.

Je l'ai utilisé dans l'exemple de code de Keras, et je l'ai également utilisé pour apprendre que l'image d'entrée est tournée / zoomée en tant que caractères même si elle est pivotée / zoomée. Ceci est également très efficace. Les étudiants de l'Université de Stanford ne l'ont pas utilisé.

Le reste des détails

Conclusion

Donc, j'ai fait ce que le manuel a fait, et c'était 99,78%. Les nombres manuscrits sont rapportés à 99,77% dans l'ensemble de données MNIST, qui est à peu près le même http://yann.lecun.com/exdb/mnist/. Je ne fais pas de kanji ou quoi que ce soit d'autre, mais les étudiants de l'Université de Stanford disent 99,64%, ce qui est un peu mieux que cela.

L'apprentissage en profondeur et les caractères manuscrits peuvent être reconnus presque parfaitement!

Recommended Posts

99,78% de précision avec apprentissage en profondeur en reconnaissant les hiragana manuscrits
Classer les visages d'anime par suite / apprentissage profond avec Keras
Essayez l'apprentissage en profondeur avec TensorFlow
Apprentissage profond du noyau avec Pyro
Essayez le Deep Learning avec FPGA
Générez des Pokémon avec Deep Learning
Essayez le Deep Learning avec les concombres FPGA-Select
Identification de la race de chat avec Deep Learning
Faites de l'art ASCII avec l'apprentissage en profondeur
Essayez l'apprentissage en profondeur avec TensorFlow Partie 2
Apprentissage profond appris par l'implémentation 1 (édition de retour)
Vérifiez la forme de squat avec l'apprentissage en profondeur
Catégoriser les articles de presse grâce au Deep Learning
Prévisions des ventes de collations avec apprentissage en profondeur
Faites sourire les gens avec le Deep Learning
Apprentissage automatique avec docker (42) Programmation PyTorch pour l'apprentissage en profondeur par Ian Pointer
Deep learning 2 appris par l'implémentation (classification d'images)
Classez les visages d'anime avec l'apprentissage en profondeur avec Chainer
Essayez les prévisions de prix Bitcoin avec Deep Learning
Essayez avec Chainer Deep Q Learning - Lancement
Produisez de belles vaches de mer par apprentissage profond
Essayez l'apprentissage profond de la génomique avec Kipoi
Détection d'objets par apprentissage profond pour comprendre en profondeur par Keras
Analyse émotionnelle des tweets avec apprentissage en profondeur
L'apprentissage en profondeur
L'histoire de l'apprentissage profond avec TPU
Chainer et deep learning appris par approximation de fonction
Apprentissage profond appris par la mise en œuvre ~ Détection d'anomalies (apprentissage sans enseignant) ~
Interpolation d'images vidéo par apprentissage en profondeur, partie 1 [Python]
Apprentissage parallèle du deep learning par Keras et Kubernetes
Apprentissage profond appris par mise en œuvre (segmentation) ~ Mise en œuvre de SegNet ~
Mémorandum d'apprentissage profond
Commencer l'apprentissage en profondeur
Apprentissage en profondeur Python
Apprentissage profond × Python
Créez un "bot qui vous informe des actrices audiovisuelles aux visages similaires" grâce à l'apprentissage en profondeur
Investissement en actions par apprentissage approfondi (méthode du gradient de politique) (1)
Classer les numéros mnist par keras sans apprentissage par l'enseignant [Auto Encoder Edition]
Analyse d'images par apprentissage profond à partir de Kaggle et Keras
[Détection d'anomalies] Détecter la distorsion de l'image par apprentissage à distance
Classer les articles avec des balises spécifiées par Qiita par apprentissage non supervisé
Prédire les tags en extrayant des fonctionnalités musicales avec Deep Learning
(Deep learning) J'ai collecté des images de l'API Flickr et essayé de discriminer en transférant l'apprentissage avec VGG16
J'ai essayé de faire d'Othello AI que j'ai appris 7,2 millions de mains par apprentissage profond avec Chainer