Najlepsza biblioteka python dla sieci neuronowych

130

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?

marcodena
źródło
5
A teraz jest nowy pretendent - Scikit Neuralnetwork : Czy ktoś miał już z tym doświadczenie? Jak wypada w porównaniu z Pylearn2 lub Theano?
Rafael_Espericueta
1
@Emre: Skalowalne różni się od wysokiej wydajności. Zazwyczaj oznacza to, że możesz rozwiązać większe problemy, dodając więcej zasobów tego samego typu, co już masz. Skalowalność wciąż wygrywa, gdy masz do dyspozycji 100 maszyn, nawet jeśli twoje oprogramowanie jest 20 razy wolniejsze na każdym z nich. . . (chociaż wolałbym płacić cenę za 5 komputerów i mieć korzyści zarówno z GPU, jak i ze skalą wielu urządzeń).
Neil Slater,
2
Więc używaj wielu GPU ... nikt nie używa procesorów do poważnej pracy w sieciach neuronowych. Jeśli możesz uzyskać wydajność na poziomie Google z dobrego GPU lub dwóch, tylko co zamierzasz zrobić z tysiącem procesorów?
Emre,
4
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ jest to plakatowy przykład tego, dlaczego rekomendacje i „najlepsze” pytania nie działają w tym formacie. Przyjęta odpowiedź jest w rzeczywistości niedokładna po 12 miesiącach (PyLearn2 przeszedł w tym czasie z „aktywnego rozwoju” do „akceptowania łat”)
Neil Slater,

Odpowiedzi:

116

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.

Madison May
źródło
Zauważ, że nolearn to opakowanie, które sprawia, że ​​inne biblioteki są łatwiejsze w użyciu i kompatybilne ze sklearn. Sam w sobie nie jest biblioteką sieci neuronowych, ale mimo to jest polecany. W chwili pisania tego tekstu jest to głównie dla Lasagne, ale jest trochę kodu Caffe i może inne.
Mark
Nie jestem pewien, czy jest taki sam, jak komentarz Marksa na temat nolearn, ale github.com/aigamedev/scikit-neuralnetwork jest również jakąś formą opakowania wielu takich rzeczy.
onaclov2000,
5
FYI: Pylearn2 nie ma już programisty.
Franck Dernoncourt
Wow, to jest dość przestarzałe po mniej niż dwóch latach
Martin Thoma
1
Dlaczego pomijać PyTorch?
Francesco Pegoraro
37

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.

Martin Thoma
źródło
22

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.

jnovacho
źródło
19

TensorFlow (Google, wydany 09.11.2015) wygląda obiecująco.

  • open source (licencja Apache 2.0) ( GitHub )
  • Python (backend w C ++)
  • CPU / GPU
  • Automatyczne różnicowanie
  • Przenośny (działa nawet na urządzeniach mobilnych)

wprowadź opis zdjęcia tutaj

FYI:

rev Franck Dernoncourt
źródło
3
Aargh! Pobiłeś mnie do tego :) Rzeczywiście, TensorFlow jest super dobry. Ma lepszy czas kompilacji niż duże działa, takie jak Theano, Pochodnia itp.
Dawny33
@ Dawny33 Co rozumiesz przez „czas kompilacji”? Theano, Pochodnia i przez większość czasu również TensorFlow są używane w interpretowany sposób.
Martin Thoma,
@moose W Theano przynajmniej część kodu jest skompilowana w C ++ lub CUDA.
Franck Dernoncourt,
@FranckDernoncourt Ok, ale czy ten czas naprawdę ma znaczenie? Kiedy trening trwa około 20 minut, czy nie zajmuje tylko kilka sekund czas potrzebny do wygenerowania kodu CUDA? (Jak to zmierzyć?)
Martin Thoma,
2
@moose In Theano generowanie kodu CUDA / C ++ zajmuje około 30 sekund do jednej minuty dla modelu o rozsądnej wielkości. To sprawia, że ​​debugowanie jest dość uciążliwe. Aby zmierzyć czas generowania kodu CUDA / C ++, możesz zmierzyć czas przed / po skompilowaniu funkcji Theano.
Franck Dernoncourt,
8

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.

Royalstream
źródło
1
Początkowo byłem także trochę zaskoczony plikami YAML, ale od tego czasu pokochałem czystą separację między konfiguracją a kodem. Możesz wybrać użycie Pylearn2 bez plików YAML, chociaż ta opcja nie jest dobrze udokumentowana.
Madison May
Krótko mówiąc, nie odrzuciłbym biblioteki z powodu tej prostej decyzji projektowej.
Madison May
Jak może Madison, wspominał o rozdzielaniu konfiguracji i kodu. Byłoby dobrze, gdybyś prowadził jedną sieć i znał wszystkie parametry, ale tak nie jest. dzieląc konfigurację i kod, możesz uruchomić wiele sieci - różne ukryte neurony itp., a kontrola źródła jest prosta (w jaki sposób możesz śledzić konfigurację, którą wypróbowałeś, jeśli trzymasz ją w kodzie).
seanv507
8

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.

Def_Os
źródło
Tak, obecnie poleciłbym dziś bloki zamiast pylearn2, jeśli masz dość czasu, aby zrozumieć Theano.
Madison,
Wielka biblioteka zbudowana przez wspaniałych ludzi.
Madison,
6

MXNet :

  • napisany w C ++, ale ma interfejs API w języku Python (i kilka innych języków programowania, takich jak R, Julia i Go)
  • Skaluje do wielu procesorów graficznych i ustawień rozproszonych z automatyczną równoległością.
  • Automatyczne różnicowanie
  • Przyzwoite występy:

wprowadź opis zdjęcia tutaj

Franck Dernoncourt
źródło
5

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.

użytkownik2556
źródło
5

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.

srobinson
źródło
Czy możesz tutaj skomentować link pod moim komentarzem?
Zmienię
Teraz, kiedy moja odpowiedź została oceniona, mam wymaganego przedstawiciela i mogłem dodać linki. W każdym razie dzięki!
srobinson
Czy na pewno scikit-learn to pakiet DN?
SmallChess
4

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ę.

hoaphumanoid
źródło
2

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:

  • {1} Graham Neubig, Chris Dyer, Yoav Goldberg, Austin Matthews, Waleed Ammar, Antonios Anastasopoulos, Miguel Ballesteros, David Chiang, Daniel Clothiaux, Trevor Cohn, Kevin Duh, Manaal Faruqui, Cynthia Gan, Dan Garrette, Yangfeng Ji, Lingpeng Ji , Adhiguna Kuncoro, Gaurav Kumar, Chaitanya Malaviya, Paul Michel, Yusuke Oda, Matthew Richardson, Naomi Saphra, Swabha Swayamdipta, Pengcheng Yin. DyNet: zestaw narzędzi dynamicznej sieci neuronowej. https://arxiv.org/abs/1701.03980
Franck Dernoncourt
źródło
2

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.

Federico Caccia
źródło
2

PyTorch

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.

n1k31t4
źródło
1

NeuPy to biblioteka Pythona dla sztucznych sieci neuronowych. NeuPy obsługuje wiele różnych typów sieci neuronowych, od prostego perceptronu po modele głębokiego uczenia.

itdxer
źródło