Notez que je suis resté bloqué lors de l'utilisation de Maxout + CNN (Convolutional Neural Network) avec Pylearn2. GPU est requis.
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é.
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 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"))
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/
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']
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.
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)
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