Używam sieci neuronowych do rozwiązywania różnych problemów związanych z uczeniem maszynowym. Używam Pythona i Pybrain, ale ta biblioteka jest prawie wycofana. Czy istnieją inne dobre alternatywy w Pythonie?
Używam sieci neuronowych do rozwiązywania różnych problemów związanych z uczeniem maszynowym. Używam Pythona i Pybrain, ale ta biblioteka jest prawie wycofana. Czy istnieją inne dobre alternatywy w Pythonie?
Odpowiedzi:
AKTUALIZACJA: krajobraz nieco się zmienił, odkąd odpowiedziałem na to pytanie w lipcu '14, a niektórzy nowi gracze weszli w kosmos. W szczególności polecam sprawdzenie:
Każdy z nich ma swoje mocne i słabe strony, więc daj im szansę i sprawdź, który najlepiej pasuje do Twojego przypadku użycia. Chociaż rok temu poleciłbym korzystanie z PyLearn2, społeczność nie jest już aktywna, więc polecam szukać gdzie indziej. Moja pierwotna odpowiedź na odpowiedź znajduje się poniżej, ale w tym momencie jest w dużej mierze nieistotna.
PyLearn2 jest ogólnie uważany za bibliotekę z wyboru dla sieci neuronowych i głębokiego uczenia się w pythonie. Został zaprojektowany z myślą o łatwym eksperymentowaniu naukowym, a nie łatwości użytkowania, więc krzywa uczenia się jest dość stroma, ale jeśli nie spiesz się i postępuj zgodnie z samouczkami, myślę, że będziesz zadowolony z funkcjonalności, którą zapewnia. Zapewnione jest wszystko, od standardowych wielowarstwowych perceptronów po ograniczone maszyny Boltzmanna, sieci konwekcyjne i autokodery. Jest świetna obsługa GPU i wszystko jest oparte na Theano, więc wydajność jest zazwyczaj całkiem dobra. Źródło PyLearn2 jest dostępne na github .
Należy pamiętać, że PyLearn2 ma obecnie odwrotny problem z PyBrain - zamiast zostać porzuconym, PyLearn2 jest w fazie rozwoju i podlega częstym zmianom.
Tensor Flow ( docs ) od Google to kolejna fajna struktura, która ma automatyczne różnicowanie. Kilka krótkich przemyśleń na temat Google Tensor Flow zapisałem na moim blogu wraz z przykładem MNIST, który mają w swoim samouczku.
Zobacz także: Mój samouczek Tensorflow XOR
Lasagne ( docs ) jest bardzo fajny, ponieważ korzysta z theano (→ możesz użyć GPU) i sprawia, że jest łatwiejszy w użyciu. O ile mi wiadomo, autor lasagne wygrał wyzwanie Kaggle Galaxy. To miłe z nolearn . Oto przykładowa sieć MNIST:
#!/usr/bin/env python
import lasagne
from lasagne import layers
from lasagne.updates import nesterov_momentum
from nolearn.lasagne import NeuralNet
import sys
import os
import gzip
import pickle
import numpy
PY2 = sys.version_info[0] == 2
if PY2:
from urllib import urlretrieve
def pickle_load(f, encoding):
return pickle.load(f)
else:
from urllib.request import urlretrieve
def pickle_load(f, encoding):
return pickle.load(f, encoding=encoding)
DATA_URL = 'http://deeplearning.net/data/mnist/mnist.pkl.gz'
DATA_FILENAME = 'mnist.pkl.gz'
def _load_data(url=DATA_URL, filename=DATA_FILENAME):
"""Load data from `url` and store the result in `filename`."""
if not os.path.exists(filename):
print("Downloading MNIST dataset")
urlretrieve(url, filename)
with gzip.open(filename, 'rb') as f:
return pickle_load(f, encoding='latin-1')
def load_data():
"""Get data with labels, split into training, validation and test set."""
data = _load_data()
X_train, y_train = data[0]
X_valid, y_valid = data[1]
X_test, y_test = data[2]
y_train = numpy.asarray(y_train, dtype=numpy.int32)
y_valid = numpy.asarray(y_valid, dtype=numpy.int32)
y_test = numpy.asarray(y_test, dtype=numpy.int32)
return dict(
X_train=X_train,
y_train=y_train,
X_valid=X_valid,
y_valid=y_valid,
X_test=X_test,
y_test=y_test,
num_examples_train=X_train.shape[0],
num_examples_valid=X_valid.shape[0],
num_examples_test=X_test.shape[0],
input_dim=X_train.shape[1],
output_dim=10,
)
def nn_example(data):
net1 = NeuralNet(
layers=[('input', layers.InputLayer),
('hidden', layers.DenseLayer),
('output', layers.DenseLayer),
],
# layer parameters:
input_shape=(None, 28*28),
hidden_num_units=100, # number of units in 'hidden' layer
output_nonlinearity=lasagne.nonlinearities.softmax,
output_num_units=10, # 10 target values for the digits 0, 1, 2, ..., 9
# optimization method:
update=nesterov_momentum,
update_learning_rate=0.01,
update_momentum=0.9,
max_epochs=10,
verbose=1,
)
# Train the network
net1.fit(data['X_train'], data['y_train'])
# Try the network on new data
print("Feature vector (100-110): %s" % data['X_test'][0][100:110])
print("Label: %s" % str(data['y_test'][0]))
print("Predicted: %s" % str(net1.predict([data['X_test'][0]])))
def main():
data = load_data()
print("Got %i testing datasets." % len(data['X_train']))
nn_example(data)
if __name__ == '__main__':
main()
Caffe to biblioteka C ++, ale ma powiązania w języku Python. Możesz zrobić większość rzeczy za pomocą plików konfiguracyjnych (prototxt). Ma wiele opcji i może również korzystać z GPU.
Pylearn opiera się na Theano i jak wspomniano w innej odpowiedzi, korzystanie z biblioteki jest dość skomplikowane, dopóki go nie opanujesz.
W międzyczasie sugerowałbym użycie Theanets . Jest również zbudowany na szczycie Theano, ale jest o wiele łatwiejszy w obsłudze. Może to prawda, że nie ma wszystkich cech Pylearn, ale do podstawowej pracy wystarczy.
Jest to również oprogramowanie typu open source, dzięki czemu można dodawać niestandardowe sieci w locie, jeśli się odważy. :)
EDYCJA: grudzień 2015. Ostatnio zacząłem używać Keras . Jest to nieco niższy poziom niż Theanets, ale o wiele potężniejszy. Do podstawowych testów Theanets jest odpowiedni. Ale jeśli chcesz przeprowadzić badania w zakresie ANN Keras, jest znacznie bardziej elastyczny. Ponadto Keras może wykorzystywać Tensorflow jako backend.
TensorFlow (Google, wydany 09.11.2015) wygląda obiecująco.
FYI:
Pylearn2 wydaje się być biblioteką z wyboru, jednak uważam, że ich pliki konfiguracyjne YAML są odrażające.
Sam Python został zaprojektowany aby być łatwym językiem do prototypowania, dlaczego byś nie używać go do definiowania samych właściwości sieci? Mamy świetne edytory z funkcją autouzupełniania, które znacznie ułatwią Ci życie, a Python nie przypomina C ++, w którym musisz czekać na zakończenie długich kompilacji, zanim będziesz mógł uruchomić swój kod.
Z drugiej strony pliki YAML należy edytować przy użyciu standardowego edytora tekstu bez żadnej pomocy, co sprawia, że krzywa uczenia się jest jeszcze bardziej stroma.
Być może brakuje mi dużego obrazu, ale nadal nie rozumiem, o czym oni myśleli, nie sądzę, że prototypowanie w kodzie byłoby znacznie wolniejsze. Z tego powodu rozważam Theanets lub używam bezpośrednio Theano.
Lubię Bloki , które są również zbudowane na Theano. O wiele bardziej przystępny niż PyLearn2 i bardziej bogaty w funkcje niż Lasagne. Również starannie napisane.
Zaktualizowano styczeń 2016:
W chwili pisania Keras miał zdecydowanie największy impet. Jest bardzo modułowy i może działać zarówno na Theano, jak i Tensorflow, co daje mu ogromne możliwości.
MXNet :
Z tego, co słyszałem, Pylearn2 może być obecnie biblioteką z wyboru dla większości ludzi. Przypomina mi to niedawny post na blogu sprzed kilku miesięcy, w którym wymieniono wszystkie różne biblioteki uczenia maszynowego z krótkim wyjaśnieniem
https://www.cbinsights.com/blog/python-tools-machine-learning
Część, która może Cię tu zainteresować, to „Głębokie uczenie się”. O Pylearn2 pisze
PyLearn2
Istnieje kolejna biblioteka zbudowana na Theano, o nazwie PyLearn2, która zapewnia modułowość i konfigurowalność w Theano, w której można stworzyć sieć neuronową za pomocą różnych plików konfiguracyjnych, aby łatwiej było eksperymentować z różnymi parametrami. Zapewne zapewnia większą modułowość, oddzielając parametry i właściwości sieci neuronowej od pliku konfiguracyjnego.
Napisałem ten post, szczegółowo opisując niektóre z moich ulubionych:
Najlepsze biblioteki uczenia maszynowego w języku Python
Ponieważ wspomniano o ponad 30 różnych bibliotekach, nie opublikuję ich wszystkich tutaj, ale należą one do najpopularniejszych:
(Przepraszamy, nie mogę połączyć się z repozytoriami Github, ponieważ moje repozytorium wciąż ma <10 ...)
Edycja: Dodano linki do repozytoriów Github.
neon :
Aby dodać więcej zasobów. Ostatnio opublikowano artykuł analizujący różnice między kilkoma pakietami sieci neuronowych a głębokimi sieciami neuronowymi.
Tutaj możesz znaleźć informacje . Wygląda na to, że Torch i TensorFlow są zwycięzcami.
Uwaga: nie wszystkie z nich są w języku python. Jednak opublikowałem go, aby otworzyć dyskusję.
Microsoft Cognition Toolkit (wcześniej znany jako CNTK) ma interfejs API języka Python . Między innymi powinien być dobry dla wielu procesorów graficznych :
Przykłady i samouczki można znaleźć na https://github.com/Microsoft/CNTK/tree/master/bindings/python
DyNet: zestaw narzędzi dynamicznej sieci neuronowej. Od 1}:
Opisujemy DyNet, zestaw narzędzi do wdrażania modeli sieci neuronowych opartych na dynamicznej deklaracji struktury sieci. W strategii deklaracji statycznej stosowanej w zestawach narzędzi takich jak Theano, CNTK i TensorFlow, użytkownik najpierw definiuje wykres obliczeniowy (symboliczna reprezentacja obliczeń), a następnie przykłady wprowadza się do silnika, który wykonuje to obliczenie i oblicza jego pochodne . W strategii dynamicznej deklaracji DyNet konstrukcja wykresu obliczeniowego jest w większości transparentna, ponieważ jest domyślnie konstruowana przez wykonanie kodu proceduralnego, który oblicza wyjścia sieciowe, a użytkownik może swobodnie korzystać z różnych struktur sieciowych dla każdego wejścia. Deklaracja dynamiczna ułatwia zatem wdrażanie bardziej skomplikowanych architektur sieciowych, a DyNet został specjalnie zaprojektowany, aby umożliwić użytkownikom wdrażanie ich modeli w sposób idiomatyczny w preferowanym języku programowania (C ++ lub Python). Jednym z wyzwań związanych z deklaracją dynamiczną jest to, że ponieważ wykres obliczeń symbolicznych jest definiowany na nowo dla każdego przykładu szkolenia, jego konstrukcja musi mieć niski narzut. Aby to osiągnąć, DyNet ma zoptymalizowany backend C ++ i lekką reprezentację grafu. Eksperymenty pokazują, że prędkości DyNet są szybsze lub porównywalne z zestawami narzędzi do deklaracji statycznej i znacznie szybsze niż Chainer, kolejny zestaw narzędzi do deklaracji dynamicznej. DyNet jest wydany jako oprogramowanie typu open source na licencji Apache 2.0 i jest dostępny pod adresem Jednym z wyzwań związanych z deklaracją dynamiczną jest to, że ponieważ wykres obliczeń symbolicznych jest definiowany na nowo dla każdego przykładu szkolenia, jego konstrukcja musi mieć niski narzut. Aby to osiągnąć, DyNet ma zoptymalizowany backend C ++ i lekką reprezentację grafu. Eksperymenty pokazują, że prędkości DyNet są szybsze lub porównywalne z zestawami narzędzi do deklaracji statycznej i znacznie szybsze niż Chainer, kolejny zestaw narzędzi do deklaracji dynamicznej. DyNet jest wydany jako oprogramowanie typu open source na licencji Apache 2.0 i jest dostępny pod adresem Jednym z wyzwań związanych z deklaracją dynamiczną jest to, że ponieważ wykres obliczeń symbolicznych jest definiowany na nowo dla każdego przykładu szkolenia, jego konstrukcja musi mieć niski narzut. Aby to osiągnąć, DyNet ma zoptymalizowany backend C ++ i lekką reprezentację grafu. Eksperymenty pokazują, że prędkości DyNet są szybsze lub porównywalne z zestawami narzędzi do deklaracji statycznej i znacznie szybsze niż Chainer, kolejny zestaw narzędzi do deklaracji dynamicznej. DyNet jest wydany jako oprogramowanie typu open source na licencji Apache 2.0 i jest dostępny pod adresemten adres URL http
Wcześniej był znany jako cnn (którego wiązanie w Pythonie nosiło nazwę pycnn).
Bibliografia:
Polecam stosowanie tensorflow, który jest w fazie rozwoju i wspiera głębokie uczenie się. Możesz użyć wysokopoziomowego interfejsu API sieci neuronowych Keras, który działa na tensorflow i jest bardzo prosty w użyciu, po prostu wypróbuj samouczek i pokochasz go.
Zyskuje duże poparcie ze względu na łatwość użycia i podobieństwo do podstawowego języka Python.
Działa „linia po linii” (za pomocą dynamicznych wykresów), podobnie jak normalny Python i można go łatwo debugować - nawet przy użyciu standardowych instrukcji drukowania. Bardzo dobrze integruje się również z NumPy i innymi znanymi bibliotekami Python, takimi jak Scikit Learn.
Ponieważ ułatwia modelowanie, świetnie nadaje się do prototypowania i odkrywania nowych pomysłów w ogóle.
Obsługuje wiele procesorów graficznych i robi to w naprawdę łatwy sposób.
Sprawdź więcej funkcji tutaj .
Chociaż wiele z powyższych korzyści sprawia, że PyTorch jest o wiele przyjemniejszy w użyciu niż inne powszechnie używane biblioteki, warto wspomnieć, że nadchodzące główne wydanie Tensorflow domyślnie będzie również wykorzystywać dynamiczne tworzenie wykresów (inaczej tryb chętny ). Dzięki temu będzie porównywalny z PyTorch w użyciu.
Jeśli interesują Cię porównania wydajności, Soumith Chintala utrzymuje zestaw testów porównawczych konwergencji, które obejmują kilka wspomnianych już platform Pythona ( TensorFlow , chainer , neon , Theano ):