[PYTHON] Utilisez Maxout + CNN avec Pylearn2

Notez que je suis resté bloqué lors de l'utilisation de Maxout + CNN (Convolutional Neural Network) avec Pylearn2. GPU est requis.

environnement

Préparation (pour Windows)

Voici les paramètres et les modifications nécessaires dans l'environnement Windows. Cela n'est peut-être pas nécessaire sur Linux ou Mac, mais je ne l'ai pas confirmé.

Installez la bibliothèque pthread

Puisque pthread est utilisé dans pylearn2, installez-le. Sans pthread, le message d'erreur suivant sera affiché pendant l'apprentissage.

pylearn2 \ sandbox \ cuda_convnet \ nvmatrix.cuh (39) erreur fatale C1083: impossible d'ouvrir le fichier d'inclusion. 'pthread.h': aucun fichier ou répertoire de ce type

Cette fois, j'ai téléchargé la bibliothèque à partir du site suivant. https://sourceware.org/pthreads-win32/

Définissez le chemin d'accès à la bibliothèque pthread

Définissez le chemin d'accès à la bibliothèque pthread dans pylearn2 / sandbox / cuda_convnet / pthreads.py. Un exemple est donné ci-dessous.

pthreads.py


from theano.configparser import AddConfigVar, StrParam

AddConfigVar('pthreads.inc_dir',
        "location of pthread.h",
        StrParam("C:\\lib\\pthreads-w32-2-9-1-release\\Pre-built.2\\include"))

AddConfigVar('pthreads.lib_dir',
        "location of library implementing pthreads",
        StrParam("C:\\lib\\pthreads-w32-2-9-1-release\\Pre-built.2\\lib\\x64"))

AddConfigVar('pthreads.lib',
        'name of the library that implements pthreads (e.g. "pthreadVC2" if using pthreadVC2.dll/.lib from pthreads-win32)',
        StrParam("pthreadVC2"))

Mettez pthreadVC2.dll dans le répertoire d'exécution

Placez pthreadVC2.dll inclus dans le thread POSIX dans le répertoire suivant. pylearn2/scripts/papers/maxout

Si vous ne déployez pas pthreadVC2.dll, l'erreur suivante se produit. Il s'agit d'une erreur qui se produit car la dll référencée dans le fichier pyd est introuvable.

DLL load failed:

Si vous obtenez une erreur similaire, vous pouvez utiliser Dependency Walker sur le site suivant pour vérifier les dépendances de votre pyd. http://www.dependencywalker.com/

Passez le chemin vers la bibliothèque cuda_ndarray

Je compile un fichier cu lors de l'apprentissage avec Pylearn2, mais une erreur de lien se produit. Modifiez le fichier suivant pour pouvoir charger la bibliothèque cuda_ndarray.

pylearn2/sandbox/cuda_convnet/convnet_compile.py


                    compiler.compile_str('cuda_convnet',
                            code,
                            location = cuda_convnet_loc,
                            include_dirs = [this_dir, config.pthreads.inc_dir] if config.pthreads.inc_dir else [this_dir],
                            lib_dirs = nvcc_compiler.rpath_defaults + [cuda_convnet_loc] + ([config.pthreads.lib_dir] if config.pthreads.lib_dir else []),
-                            libs = ['cublas', config.pthreads.lib] if config.pthreads.lib else ['cublas'],
+                            libs = ['cublas', 'cuda_ndarray', config.pthreads.lib] if config.pthreads.lib else ['cublas', 'cuda_ndarray'],
                            preargs = ['-O3'] + args,
                            py_module=False)

pylearn2/sandbox/cuda_convnet/base_acts.py


     def c_libraries(self):
         if config.pthreads.lib:
-            return ['cuda_convnet', config.pthreads.lib]
+            return ['cuda_convnet', 'cuda_ndarray', config.pthreads.lib]
         else:
-            return ['cuda_convnet']
+            return ['cuda_convnet', 'cuda_ndarray']

Apprentissage

J'ai utilisé mnist.yaml dans pylearn2 / scripts / papers / maxout de Pylearn2. Le pylearn2.models.maxout.MaxoutConvC01B utilisé dans ce fichier est la classe de modèle Maxout + CNN. Un GPU est requis pour utiliser MaxoutConvC01B. Après avoir accédé à pylearn2 / scripts / papers / maxout, apprenez avec la commande suivante.

python ..\..\train.py mnist.yaml

Le modèle entraîné est enregistré dans mnist_best.pkl.

Vérifiez le résultat

Créez le fichier suivant et python mnist_result.py mnist_best.pkl Vous pouvez vérifier le résultat de la reconnaissance des données de test en exécutant. C'était 9940/10000 dans mon environnement.

mnist_result.py


import numpy as np
import pickle
import sys
import theano
import pylearn2.datasets.mnist as mnist
from pylearn2.space import VectorSpace


def simulate(inputs, model):
    space = VectorSpace(inputs.shape[1])
    X = space.get_theano_batch()
    Y = model.fprop(space.format_as(X, model.get_input_space()))
    f = theano.function([X], Y)
    result = []
    for x in xrange(0, len(inputs), 100):
      result.extend(f(inputs[x:x + 100]))
    return result

def countCorrectResults(outputs, labels):
    correct = 0;
    for output, label in zip(outputs, labels):
        if np.argmax(output) == label:
            correct += 1
    return correct
 
def score(dataset, model):
    outputs = simulate(dataset.X, model)
    correct = countCorrectResults(outputs, dataset.y)

    return {
        'correct': correct,
        'total': len(dataset.X)
    }

model = pickle.load(open(sys.argv[1]))
test_data = mnist.MNIST(which_set='test')
print '%(correct)d / %(total)d' % score(test_data, model)

Apprendre encore plus

Après avoir appris avec mnist.yaml, si vous vous entraînez avec mnist_continued.yaml, il semble que vous en apprendrez plus sur mnist_best.pkl. Le modèle entraîné est enregistré dans mnist_continued.pkl.

Recommended Posts

Utilisez Maxout + CNN avec Pylearn2
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utiliser l'indicateur avec pd.merge
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser python avec docker
Utiliser TypeScript avec django-compresseur
Utilisez LESS avec Django
Utiliser MySQL avec Django
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
Utiliser l'API Trello avec python
Utiliser la mémoire partagée avec une bibliothèque partagée
Utiliser des balises personnalisées avec PyYAML
Utiliser des graphiques directionnels avec networkx
Utiliser TensorFlow avec Intellij IDEA
Implémentation CNN avec juste numpy
Utiliser l'API Twitter avec Python
Utiliser pip avec Jupyter Notebook
Utilisez sqlite3 avec NAO (Pepper)
Essayez d'exécuter CNN avec ChainerRL
Utilisez les load_extensions de sqlite avec Pyramid
Utiliser les polices Windows 10 avec WSL
Utilisation du chainer avec Jetson TK1
Utiliser SSL avec Celery + Redis
Utiliser Cython avec Jupyter Notebook
Créez facilement des CNN avec Keras
Utilisez WDC-433SU2M2 avec Manjaro Linux
Utilisez OpenBLAS avec numpy, scipy
Survivez à Noël avec CNN au niveau du personnage
Utiliser l'API subsonique avec python3
Utilisation de Sonicwall NetExtener avec Systemd
Utilisez prefetch_related commodément avec Django
Utiliser l'interpréteur AWS avec Pycharm
Utilisation de Bokeh avec IPython Notebook
Utiliser une plage de type Python avec Rust
Utiliser MLflow avec Databricks ④ --Call model -
Utiliser pyright avec CentOS7, emacs lsp-mode
Python: comment utiliser async avec
Utilisation de la base de données SQL d'Azure avec SQL Alchemy
Utiliser la caméra Point Grey avec Python (PyCapture2)
Utilisez vl53l0x avec RaspberryPi (python)
Utilisez la fonction de prévisualisation avec aws-cli
Utiliser Markdown avec le notebook Jupyter (avec raccourci)
Utiliser Python mis en pyenv avec NeoVim
Utilisez Tensorflow 2.1.0 avec Anaconda sur Windows 10!
Utiliser la synthèse vocale Windows 10 avec Python
Utiliser la bibliothèque curl / jq avec Go
Je ne peux pas utiliser le japonais avec pyperclip
Utiliser le fichier d'étalonnage de la caméra avec OpenCvSharp4