Apprendre en profondeur à l'expérience avec Python Chapitre 2 (Matériel pour une conférence ronde)

Utilisé dans Do2dle 9th Study Session (1st Deep Learning Experience with Python) Apprendre en profondeur à l'expérience de Python Ceci est un matériel pour la table ronde du chapitre 2. Je fais un supplément, mais j'essaie de comprendre cette partie.


Le développement a commencé en 1980 par Guido van Rossum. Python est un langage de programmation simple et cohérent. La lisibilité et la cohérence sont importantes dans la communauté Python.

2.2 Python2 ou Python3

Les séries Python2 et Python3 ne sont pas compatibles. Si vous souhaitez redémarrer Python, le système Python3 convient parfaitement. Cependant, le code Python2 demeure. Dans le sens de l'héritage du passé, le système Python 2 ne peut être ignoré. Dans ce livre, il est décrit sur l'hypothèse du système Python2.

(Début des commentaires du présentateur)

Série Python2

La dernière version (2.7) de la série Python2 a été abandonnée. Il n'y aura pas de corrections majeures. Cependant, le support 2.7 a été prolongé jusqu'en 2020, Il semble que la situation dans laquelle les séries Python 2 et Python 3 sont mélangées continuera.

Série Python3

La série Python 3 est sortie en 2008. Actuellement, la série Python 3 est activement développée. On peut dire que les principales bibliothèques sont compatibles avec Python 3 et n'ont pratiquement aucun problème.

(Fin du commentaire du présentateur)

2.4 Style de codage

Il vaut la peine de laisser un style de codage et une documentation cohérents pour améliorer la lisibilité et la facilité de maintenance.

PEP8 est célèbre pour son style de codage.

(Début des commentaires du présentateur)

Devenez la norme de facto. Lisons PEP8.

Traduction japonaise PEP8 http://pep8-ja.readthedocs.io/ja/latest/

Utiliser l'outil de vérification PEP8 Il peut être installé avec pip install pep8. Vérifions automatiquement à l'aide de l'outil de vérification.

(Fin du commentaire du présentateur)

2.5 Abréviation Python et NumPy

2.5.2 Conteneur

Python a une implémentation standard de conteneurs tels que des listes, des dictionnaires, des ensembles et des taples. Lors de la combinaison de plusieurs éléments en un seul, les listes sont entre crochets [], les dictionnaires et les ensembles sont entre crochets {} et les taples sont entre crochets normaux. La distinction entre un dictionnaire et un ensemble est un dictionnaire si chaque élément est une clé et la paire valeur d'attribut est composée de deux points;.

(Début des commentaires du présentateur)

(Fin du commentaire du présentateur)

2.5.5 NumPy NumPy est la bibliothèque principale de calculs scientifiques et technologiques en Python. Il se compose d'un objet tableau multidimensionnel et d'un outil de traitement de tableau. Comme cela sera décrit plus loin, la manipulation de matrice flexible est essentielle pour traiter les réseaux de neurones convolutifs.

(Début des commentaires du présentateur)

Pourquoi utiliser NumPy?

  1. Le calcul numérique nécessite beaucoup de traitement, mais NumPy peut être utilisé pour accélérer le temps d'exécution. (Le calcul à l'aide d'une boucle for est plus lent que l'utilisation d'une liste Python, il est donc préférable de la fermer autant que possible dans NumPy.)
  2. Il est possible de calculer entre des tableaux de différentes tailles (diffusion) Cela permet d'effectuer facilement des calculs compliqués.

[5] Diffusion

La diffusion est un mécanisme qui permet des calculs entre des tableaux de différentes tailles.

Par exemple, dans l'exemple 1 suivant, en ajoutant 1, il sera automatiquement développé et traité comme np.array ([1, 2]) + np.array ([1, 1]).

#Exemple 1
>>> import numpy as np
>>> np.array([1, 2]) + 1
array([2, 3])

Dans l'exemple 2 ci-dessous, en ajoutant 5, il est automatiquement développé np.array ([[1, 2], [3, 4]]) + np.array ([[5, 5], [5 ,, Elle est traitée comme si 5]]) avait été effectuée.

#Exemple 2
>>> import numpy as np
>>> np.array([[1, 2], [3, 4]]) + 5
array([[6, 7],
       [8, 9]])

Dans l'exemple 3 ci-dessous, en ajoutant np.array ([2, 3]), il est automatiquement développé np.array ([[1, 2], [3, 4]]) + np.array ([ Elle est traitée comme si [2, 3], [2, 3]]) était réalisée.

#Exemple 3
>>> import numpy as np
>>> np.array([[1, 2], [3, 4]]) + np.array([2, 3])
array([[3, 5],
       [5, 7]])

(Fin du commentaire du présentateur)

2.6 Framework d'apprentissage profond avec Python

2.6.1 Caffe Caffe est un système de traitement d'apprentissage en profondeur écrit en C ++ et CUDA. Disponible depuis Python, C ++ et MATLAB.

Caffe fournit des modèles entraînés et la communauté Caffe partage les fichiers de paramètres entraînés avec le modèle de zoo (Model Zoo). Des modèles d'apprentissage tels qu'AlexNet, GoogLeNet, VGG, SPP sont disponibles. Vous pouvez tester les résultats de l'apprentissage en profondeur en utilisant le modèle appris caffe (l'extension de nom de fichier du modèle zoo est le modèle .caffe).

[1] Procédure de fonctionnement

  1. Collectez des données.
  2. Calculez et enregistrez la moyenne des données
  3. Classez les images.
  4. Surveillez le processus d'apprentissage au besoin.

2.6.2 Theano Cette section décrit les points clés pour comprendre le code de Theano. Les packages basés sur Theano incluent Blocks, deepy, Keras, Lasagne, Nolearn, Pylearn2.

(Début des commentaires du présentateur)

Theano est une bibliothèque de calcul numérique en Python qui fournit des fonctions pour effectuer des opérations matricielles, etc., et peut être considérée comme un package alternatif à numpy / scipy.

La grande caractéristique est

  1. Génération et compilation de code C ++ à l'exécution
  2. Prise en charge du GPU
  3. Prise en charge de la différenciation analytique (la différenciation x ^ 2 = 2x est effectuée automatiquement)

Cela se traduit par des benchmarks exécutant Multilayer Perceptron que> Theano est 1,8 fois plus rapide que numpy et 1,6 fois plus rapide que Matlab.> (Bien sûr, la différence de vitesse est au cas par cas). Extrait de http://d.hatena.ne.jp/saket/20121207/1354867911

La lecture est Theano.

(Fin du commentaire du présentateur)

[1] Procédure de traitement Theano

  1. Définissez une matrice de coefficients de couplage comme une variable partagée de Theano.
  2. Décrivez la fonction de conversion pour chaque couche.
  3. Définissez le dégradé avec la fonction de différenciation automatique.
  4. Exprimez la dépendance de chaque variable avec la fonction thano.

(Début des commentaires du présentateur)

[2] Variable Tensol

Les variables Tensol définissent le type de variable en combinant l'ordre (dimension) et le type de l'élément.

Voir ci-dessous pour les détails de type

http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-basic-tensor

(Fin du commentaire du présentateur)

Le nombre de types de variables tensorielles est défini jusqu'au 4ème ordre. En considérant le traitement d'image, une image est un tableau tridimensionnel (image bidimensionnelle à pixels verticaux et horizontaux et canal de couleur cubique). Plusieurs images de formation sont nécessaires pour la reconnaissance d'image. Compte tenu du nombre d'images utilisées dans ce cas comme une dimension, un tableau à quatre dimensions est nécessaire. Le traitement inter-couches dans l'apprentissage profond équivaut à convertir un tableau à 4 dimensions dans chaque couche pour obtenir la reconnaissance finale. Par conséquent, on peut dire que le flux de chaque couche en apprentissage profond consiste à traiter la variable tenseur pour chaque couche. Pour cette raison, Google a probablement nommé son package d'apprentissage automatique TensorFlow.

[3] Fonction theeano.function

La fonction Theano., la fonction dans Theano, est différente de la fonction dans le langage classique. Les fonctions fréquemment utilisées sont également disponibles dans Theano. Ces fonctions et la fonction ano sont différentes. thano.function fait référence à une opération qui compile la relation entre la variable d'entrée spécifiée par le premier argument et la variable de sortie spécifiée par le deuxième argument à partir des variables définies et des relations de connexion du graphique.

Lorsque la fonction ano.est évaluée, il y a un léger retard dans l'exécution de la fonction ano. En effet, l'instruction de la fonction ano.est convertie en code C et compilée.

[4] Différenciation automatique theano.grad

(Début des commentaires du présentateur)

L'une des principales caractéristiques de Theano est cette fonction de différenciation. Vous pouvez "analyser la formule pour trouver la formule différenciée" appelée différenciation automatique. Par exemple

x, y = T.dscalars("x", "y") #Comment écrire pour déclarer tous ensemble
z = (x+2*y)**2

Si vous différenciez la formule par rapport à x, vous obtenez dz / dx = 2 (x + 2 * y).

gx = T.grad(z, x)

Vous pouvez convertir l'expression avec. Pour la différenciation par rapport à y, dz / dy = 4 (x + 2 * y), mais gy = T.grad(z, y) Vous pouvez convertir l'expression avec. Lors de la recherche effective de la valeur, elle doit encore être fonctionnalisée.

fgy = theano.function([x,y], gy)
>>> fgy(1,2)
array(20.0)

Etc. Extrait de http://qiita.com/mokemokechicken/items/3fbf6af714c1f66f99e9

(Fin du commentaire du présentateur)

2.6.3 Chainer On peut voir que Chainer a une excellente lisibilité du code source et la capacité du créateur est élevée. Les manuels et les didacticiels sont également concis et clairs.

(Début des commentaires du présentateur)

Pourquoi maintenant un nouveau cadre?

Caffe, Theano / Pylearn2 et Torch7 sont trois frameworks d'apprentissage profond populaires. Ceux-ci sont développés dans le but de base d'écrire un réseau feedforward. Cependant, avec les progrès récents du Deep Learning, il est de plus en plus nécessaire de pouvoir écrire de manière flexible des réseaux plus complexes. Par conséquent, de nombreux nouveaux cadres sont recherchés basés sur Theano, qui a le plus haut degré de liberté (par exemple Blocks, Keras, Lasagne, deepy, etc.).

La plupart des implémentations existantes, y compris ces frameworks, adoptent une approche consistant à étendre une fois la structure de l'ensemble du réseau neuronal en mémoire, à examiner le traitement dans l'ordre et à effectuer la propagation avant et arrière telle qu'elle est. Je suis. C'est comme implémenter un interprète pour votre propre mini-langage. Par exemple, dans le cas de Caffe, le schéma défini dans Protocol Buffer correspond au mini langage. Dans le cas de Torch7, un module spécial appelé conteneur fait office de structure de contrôle. Theano est plus flexible à définir, mais utilise une fonction spéciale appelée scan pour écrire des boucles. Si vous souhaitez prendre en charge un flux de calcul plus complexe dans cette approche, vous devez essentiellement développer ce mini-langage, et le coût d'apprentissage et le coût d'écriture augmenteront. Fondamentalement, étant donné que la structure du réseau neuronal deviendra plus compliquée à l'avenir, ce développement n'est pas préférable.

Chainer adopte une approche différente. Il est basé sur Python, mais n'utilise pas Theano. Toutes les structures de contrôle peuvent être utilisées telles quelles en Python. Chainer se souvient uniquement du traitement réellement appliqué au tableau d'entrée à l'aide du code Python et l'utilise pour effectuer une rétropropagation d'erreur. Nous pensons que cette approche est nécessaire pour que la vitesse de recherche et de développement de l'apprentissage profond devienne plus complexe, et c'est pourquoi nous nous sommes lancés dans le développement d'un nouveau cadre.

Extrait de https://research.preferred.jp/2015/06/deep-learning-chainer/

(Fin du commentaire du présentateur)

[1] Vue d'ensemble du traitement Chainer

  1. Définissez la chaîne à l'aide de Link.
  2. Réglez Chain sur Optimizer
  3. Définissez la fonction de transfert
  4. Lisez l'ensemble de données et séparez-le pour la formation et l'évaluation.
  5. Tournez la boucle d'entraînement.
  6. Exécutez la boucle d'évaluation à une fréquence raisonnable.

Par conséquent, on considère que l'apprentissage du réseau neuronal standard est mis en œuvre de manière obéissante.

Il existe une variable Chainer.Variable dédiée à Chainer. En comparaison avec Theano

>>> import chainer
>>> import theano
>>> import numpy as np
>>> X = np.ndarray((3, 5))
>>> x_chainer = chainer.Variable(X)
>>> x_theano = theano.tensor.dmatrix()

>>> print(x_chainer.label)
(3, 5), float32
>>> print(x_theano.type)
TensorType(float3, matrix)

L'exemple ci-dessus est à titre de comparaison, et il n'est pas pratique d'utiliser Chainer et Theano en même temps.

[3] Lien et chaîne

(Début des commentaires du présentateur)

De nombreuses structures de réseau neuronal contiennent plusieurs liens. Par exemple, un perceptron multicouche se compose de plusieurs couches linéaires. En combinant plusieurs liens, cette procédure complexe peut être décrite par des paramètres.

l1 = L.Linear(4, 3)
l2 = L.Linear(3, 2)
def my_forward(x):
    h = l1(x)
    return l2(h)

Où L est le module chainer.links. Si la procédure de traitement est définie par des paramètres de cette manière, elle est difficile à réutiliser. Une manière plus semblable à Python consiste à regrouper les liens et les procédures en classes:

 class MyProc(object):
     def __init__(self):
         self.l1 = L.Linear(4, 3)
         self.l2 = L.Linear(3, 2)

     def forward(self, x):
         h = self.l1(x)
         return self.l2(h)

Pour faciliter la réutilisation, nous voulons des fonctionnalités telles que la gestion des paramètres, la prise en charge de la migration CPU / GPU et une sauvegarde / chargement robuste et flexible. Toutes ces fonctionnalités sont prises en charge par la classe Chain de Chainer. Pour tirer parti des fonctionnalités de la classe Chain, définissez simplement la classe ci-dessus comme une sous-classe de la classe Chain:

 class MyChain(Chain):
     def __init__(self):
         super(MyChain, self).__init__(
             l1=L.Linear(4, 3),
             l2=L.Linear(3, 2),
         )

     def __call__(self, x):
         h = self.l1(x)
         return self.l2(h)

Indique si des connexions plus complexes sont créées avec des liens plus simples. Les liens comme l1 et l2 sont appelés liens enfants de MyChain. La chaîne elle-même hérite de Link. Cela signifie que vous pouvez définir des connexions plus complexes avec l'objet MyChain en tant que lien enfant.

L'optimisation est effectuée par la classe Optimizer pour obtenir de bonnes valeurs de paramètres. Optimizer exécute l'algorithme d'optimisation numérique donné à Link. De nombreux algorithmes sont implémentés dans le module des optimiseurs. Utilisons la plus simple ici, la méthode de descente de gradient stochastique:

 model = MyChain()
 optimizer = optimizers.SGD()
 optimizer.setup(model)

Extrait de http://www.iandprogram.net/entry/chainer_japanese

(Fin du commentaire du présentateur)

2.6.5 Tensorflow Les points sont la gestion de session (points de contrôle, etc.) et le tensorboard.

Dans TensorFlow, la plage de stockage que le réseau neuronal doit estimer est appelée une variable (tensorflow.Variable), et la plage de stockage qui n'a pas besoin d'être estimée est appelée un espace réservé (tensorflow.placeholder). Par conséquent, l'image d'entrée est un espace réservé. En revanche, le coefficient de couplage (matrice) et le biais (vecteur) sont des variables. Dans le manuel de Theano, les espaces réservés et les variables étaient utilisés sans distinction. La définition et la gestion des variables sont courantes avec Theano et Chainer.

2.6.7 scikit-learn Contrairement aux autres frameworks abordés dans ce livre, il existe scikit-learn en tant qu'implémentation Python de l'évaluation des machines. Il semble que scikit-learn possède également un perceptron multicouche. Cependant, l'introduction du perceptron multicouche est scikit-learn 0.18. Il n'est pas inclus dans la version stable 0.17 à partir de février 2016.

(Début des commentaires du présentateur)

0.18.0 a été publié en septembre 2016 et comprend un perceptron multicouche.

http://scikit-learn.org/stable/modules/neural_networks_supervised.html#multilayer-perceptron

(Fin du commentaire du présentateur)

L'utilisation de scikit-learn facilite la comparaison avec les algorithmes d'apprentissage automatique existants, et pas seulement avec les réseaux de neurones.

(Début des commentaires du présentateur)

Ce que je veux dire ci-dessus, c'est que dans scicit-learn, l'interface est organisée quel que soit l'algorithme, comme indiqué dans le code ci-dessous. C'est ce qu'a fait scicit-learn, ce qui signifie que la description suivante peut être faite facilement et que les algorithmes peuvent être facilement comparés.

for name, estimator in ESTIMATORS.items():
    estimator.fit(X_train, y_train)
    y_test_predict[name] = estimator.predict(X_test)

Extrait de http://scikit-learn.org/stable/auto_examples/plot_multioutput_face_completion.html (Fin du commentaire du présentateur)

Vous devez créer votre propre ajustement (X, y) et prédire (X) pour comparer votre propre algorithme avec ceux disponibles sur scicit-learn.


référence Expérience d'apprentissage en profondeur avec Python Chapitre 1 (Matériel pour la conférence ronde) http://qiita.com/taki_tflare/items/c1bfd976155d89104e3d

Recommended Posts

Apprendre en profondeur à l'expérience avec Python Chapitre 2 (Matériel pour une conférence ronde)
Matériel pédagogique Web pour apprendre Python
Apprentissage en profondeur Python
Apprentissage profond × Python
Python: apprentissage profond du traitement du langage naturel: principes de base
[Implémentation pour l'apprentissage] Implémentation de l'échantillonnage stratifié en Python (1)
Premier apprentissage profond en C # -Imitation de l'implémentation en Python-
Python: pratique du Deep Learning
Python: réglage du Deep Learning
Créez un environnement interactif pour l'apprentissage automatique avec Python
Flux d'apprentissage pour les débutants en Python
Plan d'apprentissage Python pour l'apprentissage de l'IA
Techniques de tri en Python
Python pour l'analyse des données Chapitre 2
La recommandation de Checkio pour apprendre Python
À propos de "for _ in range ():" de python
Python pour l'analyse des données Chapitre 3
Conseils pour gérer les entrées de longueur variable dans le cadre d'apprentissage en profondeur
Traduction japonaise du matériel pédagogique public du diplôme nano d'apprentissage profond
Un amateur a trébuché dans le Deep Learning à partir de zéro Note: Chapitre 3
Un amateur a trébuché dans le Deep Learning à partir de zéro Note: Chapitre 7
Un amateur a trébuché dans le Deep Learning à partir de zéro Note: Chapitre 5
Un amateur a trébuché dans le Deep Learning à partir de zéro.
Un amateur a trébuché dans le Deep Learning à partir de zéro Note: Chapitre 2
Mettre en œuvre l'apprentissage de l'empilement en Python [Kaggle]
Deep learning / Deep learning from scratch 2 Chapitre 4 Mémo
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 5 ~
Deep learning / Deep learning made from scratch Chapitre 3 Mémo
Rechercher des commandes externes avec python
Historique d'apprentissage pour participer au développement d'applications d'équipe en Python ~ Page d'index ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 4 ~
Que diriez-vous d'Anaconda pour créer un environnement d'apprentissage automatique avec Python?
100 Language Processing Knock Chapitre 1 en Python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 10 Introduction à Cupy
Aide-mémoire Python (pour les expérimentés C ++)
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 6 ~
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 7 Mémo
Python: prétraitement dans l'apprentissage automatique: présentation
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 8 Mémo
Perceptron multi-couches pour le Deep Learning (Deep Learning avec Python; Série MPS Yokohama Deep Learning)
Implémentation des règles d'apprentissage Perceptron en Python
Deep learning / Deep learning made from scratch Chapitre 5 Mémo
Deep learning / Deep learning made from scratch Chapitre 4 Mémo
Deep learning / Deep learning from scratch 2 Chapitre 3 Mémo
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 9 Introduction à scikit-learn
Exécutez unittest en Python (pour les débutants)
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 6 Mémo
[AI] Apprentissage en profondeur pour le débruitage d'image
(python) Principes de base du chaînage de la bibliothèque d'apprentissage en profondeur
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 13 Formation sur les réseaux neuronaux ~ Chainer terminé
Traitement de l'erreur Python "Erreur d'attribut: le module'scipy.misc 'n'a pas d'attribut" dimensionnement "" dans l'apprentissage en profondeur
Python vs Ruby «Deep Learning from scratch» Chapitre 2 Circuit logique par Perceptron
Créez rapidement un environnement python pour le Deep Learning / Data Science (Windows)
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 13 Bases du réseau neuronal
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Apprentissage profond à partir de zéro - Conseils du chapitre 4 pour la théorie de l'apprentissage profond et la mise en œuvre apprise en Python
Python vs Ruby "Deep Learning from scratch" Chapitre 4 Implémentation de la fonction de perte
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)