Beachten Sie, dass ich bei der Verwendung von Maxout + CNN (Convolutional Neural Network) mit Pylearn2 stecken geblieben bin. GPU ist erforderlich.
Im Folgenden sind die Einstellungen und Änderungen aufgeführt, die in der Windows-Umgebung erforderlich sind. Es wird unter Linux oder Mac möglicherweise nicht benötigt, aber ich habe es nicht bestätigt.
Da pthread in pylearn2 verwendet wird, installieren Sie es. Ohne pthread wird beim Lernen die folgende Fehlermeldung ausgegeben.
pylearn2 \ sandbox \ cuda_convnet \ nvmatrix.cuh (39) Schwerwiegender Fehler C1083: Include-Datei kann nicht geöffnet werden. 'pthread.h': Keine solche Datei oder kein solches Verzeichnis
Dieses Mal habe ich die Bibliothek von der folgenden Site heruntergeladen. https://sourceware.org/pthreads-win32/
Legen Sie den Pfad zur pthread-Bibliothek in pylearn2 / sandbox / cuda_convnet / pthreads.py fest. Ein Beispiel ist unten angegeben.
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"))
Platzieren Sie die im POSIX-Thread enthaltene pthreadVC2.dll im folgenden Verzeichnis. pylearn2/scripts/papers/maxout
Wenn Sie pthreadVC2.dll nicht bereitstellen, tritt der folgende Fehler auf. Dies ist ein Fehler, der auftritt, weil die in der pyd-Datei referenzierte DLL nicht gefunden werden kann.
DLL load failed:
Wenn Sie einen ähnlichen Fehler erhalten, können Sie den Dependency Walker auf der folgenden Site verwenden, um die Abhängigkeiten Ihres Pyds zu überprüfen. http://www.dependencywalker.com/
Ich kompiliere eine cu-Datei, wenn ich mit Pylearn2 lerne, aber ein Linkfehler tritt auf. Ändern Sie die folgende Datei, um die Bibliothek cuda_ndarray laden zu können.
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']
Ich habe mnist.yaml in pylearn2 / scripts / papers / maxout von Pylearn2 verwendet. Die in dieser Datei verwendete Datei pylearn2.models.maxout.MaxoutConvC01B ist die Modellklasse Maxout + CNN. Für die Verwendung von MaxoutConvC01B ist eine GPU erforderlich. Nachdem Sie zu pylearn2 / scripts / papers / maxout navigiert haben, lernen Sie mit dem folgenden Befehl.
python ..\..\train.py mnist.yaml
Das trainierte Modell wird in mnist_best.pkl gespeichert.
Erstellen Sie die folgende Datei und python mnist_result.py mnist_best.pkl Sie können das Erkennungsergebnis für die Testdaten durch Ausführen überprüfen. Es war 9940/10000 in meiner Umgebung.
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)
Wenn Sie nach dem Lernen mit mnist.yaml mit mnist_continued.yaml trainieren, werden Sie anscheinend mehr über mnist_best.pkl erfahren. Das trainierte Modell wird in mnist_continued.pkl gespeichert.
Recommended Posts