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.
Le code source est https://github.com/yukoba/CnnJapaneseCharacter.
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%.
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.
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).
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.
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.
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.
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.
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é.
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