Keras war ursprünglich eine Bibliothek, die in Kombination mit dem Deep Learning-Framework Theano verwendet wurde. Mit einem kürzlich veröffentlichten Update kann TensorFlow von Google auch als Backend verwendet werden.
Keras: Deep Learning library for Theano and TensorFlow
You have just found Keras.
Keras is a minimalist, highly modular neural networks library, written in Python and capable of running either on top of either TensorFlow or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research.
Da Theano hauptsächlich den grundlegenden Teil der Tensoroperation unterstützt, ist es vernünftig, dass es einige abstraktere Bibliotheken gibt, die auf Theano basieren, aber es unterstützt einen größeren Funktionsumfang. Ich war ein wenig überrascht, dass Keras TensorFlow unterstützte. Im Folgenden habe ich die Situation untersucht, während ich einen einfachen Code erstellt habe.
(Die Programmumgebung ist Linux Ubuntu 14.04, Python 2.7.11, Theano Version 0.7.0, TensorFlow Version 0.6.0, Keras Version 0.3.0.)
Theano und ThensorFlow wurden in einer Umgebung installiert, in der die GPU zuvor verwendet werden kann. Dieses Mal wurde "Keras" hinzugefügt.
> git clone https://github.com/fchollet/keras.git
> cd keras
> python setup.py install
Mit Ausnahme des Beispielverzeichnisses steht für typische Probleme Beispielcode zur Verfügung.
> ls examples
addition_rnn.py imdb_bidirectional_lstm.py kaggle_otto_nn.py mnist_mlp.py
babi_memnn.py imdb_cnn.py lstm_text_generation.py mnist_transfer_cnn.py
babi_rnn.py imdb_cnn_lstm.py mnist_cnn.py reuters_mlp.py
cifar10_cnn.py imdb_lstm.py mnist_irnn.py
Unter ihnen war 'mnist_mlp.py' ein Beispiel für MNIST (Klassifizierungsproblem handgeschriebener Zahlen). Als ich dies ausführte, trat zunächst ein Fehler auf.
Traceback (most recent call last):
File "mnist_mlp.py", line 50, in <module>
model.compile(loss='categorical_crossentropy', optimizer=rms)
...
(Weggelassen)
...
File "build/bdist.linux-x86_64/egg/keras/activations.py", line 25, in relu
File "build/bdist.linux-x86_64/egg/keras/backend/theano_backend.py", line 463, in relu
AttributeError: 'module' object has no attribute 'relu'
Dies liegt daran, dass 'relu' als Aktivierungsfunktion in 'minist_mlp.py' angegeben wurde, aber von der Theano-Version Version 0.7.0, die ursprünglich von Anaconda installiert wurde, nicht unterstützt wurde. .. (In Thenos Dokument heißt es, dass "Relu" von Version 0.7.1 unterstützt wird.) Theano auf GitHub hat jedoch "Relu" (obwohl Version 0.7.0). Als ich dies hochfuhr, verschwand der obige Fehler.
(Weggelassen)
...
Epoch 20/20
1s - loss: 0.0092 - acc: 0.9974 - val_loss: 0.0555 - val_acc: 0.9842
Test score: 0.0554862711126
Test accuracy: 0.9842
Die Klassifizierungsgenauigkeit von Test beträgt ca. 98,4%.
Es gibt zwei Möglichkeiten, das Bankende zu ändern.
export KERAS_BACKEND=tensorflow
Allein damit kann derselbe Keras-Code mithilfe der TensorFlow-Bibliothek ausgeführt werden. (Sehr einfach!) Beim Vergleich der beiden Methoden scheint das Festlegen von Umgebungsvariablen einfacher zu sein. (Um zu theono zurückzukehren, können Sie die obige Umgebungsvariable entweder deaktivieren oder auf "theano" setzen.)
Übrigens, die Ergebnisse des Performance-Benchmark-Tests werden hier veröffentlicht, daher werde ich sie zitieren. https://github.com/fchollet/keras/wiki/Keras,-now-running-on-TensorFlow
Task | TensorFlow | Theano |
---|---|---|
mnist_mlp.py: compilation (s) | 0.6 | 5.9 |
mnist_mlp.py: runtime/epoch (s) | 7.5 | 6.3 |
imdb_lstm.py: compilation (s) | 39.3 | 38.3 |
imdb_lstm.py: runtime/epoch (s) | 283 | 123 |
mnist_cnn.py: compilation (s) | 0.8 | 11.4 |
mnist_cnn.py: runtime/epoch (s) | 190 | 3230 |
Selbst wenn Sie denselben Code für dasselbe Problem ausführen, können Sie feststellen, dass sich die erforderliche Zeit je nach Bankende erheblich ändert. (Es scheint, dass es an der CPU-Berechnung liegt.)
Ich habe versucht, den MLP-Code für die Weinklassifizierung der TensorFlow-Version / Theano-Version, der in dem kürzlich veröffentlichten Artikel behandelt wurde, in die Keras-Version zu ändern. Es ist ein kurzer Code, den ich für Tutorial geschrieben habe, aber in der Keras-Version ist er noch kompakter. (Den Originalcode finden Sie unter TensorFlow-Version, Theano-Version.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
np.random.seed(1337) # for reproducibility
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.regularizers import l2
from keras.optimizers import SGD, Adagrad
from input_winedata import load_data
if __name__ == '__main__':
WineData = '../../Data/Wine/wine.data'
train_x, train_y, test_x, test_y = load_data(WineData)
print(train_x.shape[0], 'train samples')
print(test_x.shape[0], 'test samples')
model = Sequential()
model.add(Dense(20, input_shape=(13,), W_regularizer=l2(0.001)))
model.add(Activation('sigmoid'))
model.add(Dropout(0.05))
model.add(Dense(20, W_regularizer=l2(0.001)))
model.add(Activation('sigmoid'))
model.add(Dropout(0.05))
model.add(Dense(3, W_regularizer=l2(0.001)))
model.add(Activation('softmax'))
adagrad = Adagrad(lr=0.01, epsilon=1e-08)
model.compile(loss='categorical_crossentropy', optimizer=adagrad)
batch_size = 16
nb_epoch = 1000
print('Train...')
model.fit(train_x, train_y,
batch_size=batch_size, nb_epoch=nb_epoch,
show_accuracy=False, verbose=2,
validation_data=(test_x, test_y))
score = model.evaluate(test_x, test_y,
show_accuracy=True, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
Nachfolgend werden wir die Details bestätigen.
Nach Eingabe der Daten zu Beginn wird die Definition des Netzwerkmodells (MLP) durchgeführt. Selbst in Theano und TensorFlow kann der Hauptteil der MLP-Definition, wenn Sie die Klasse der verborgenen Ebenen und die Klasse der Ausgabeebene definieren, recht kurz zusammengefasst werden. In Keras müssen Sie die Klasse jedoch nicht selbst erstellen, sondern den folgenden Code Das Netzwerk kann mit definiert werden.
model = Sequential()
model.add(Dense(20, input_shape=(13,), W_regularizer=l2(0.001)))
model.add(Activation('sigmoid'))
model.add(Dropout(0.05))
model.add(Dense(20, W_regularizer=l2(0.001)))
model.add(Activation('sigmoid'))
model.add(Dropout(0.05))
model.add(Dense(3, W_regularizer=l2(0.001)))
model.add(Activation('softmax'))
Definieren Sie ein sich vorwärts ausbreitendes Netzwerk mit dem ersten model = Sequential ()
. Danach werden von der Eingabeseite (Definition der verborgenen Schicht 1), (Definition der verborgenen Schicht 2) und (Definition der Ausgabeschicht) in dieser Reihenfolge ausgeführt. Sie können sehr klar schreiben, z. B. eine Aktivierungsfunktion auswählen, einen Rezularizer angeben und einen Dropout angeben.
Übrigens kann das Vorwärtsausbreitungsnetzwerkmodell model = Sequential ()
bis zu CNN (Convolutional Neural Network) und für RNN (Recurrent Neural Net) mit einer komplizierteren Struktur in Keras model = Graph () unterstützen. Die Struktur kann durch das Graph-Modell definiert werden, beginnend mit der Deklaration
. (Ich möchte dies in Zukunft untersuchen.)
Geben Sie in der zweiten Hälfte des MLP-Codes den Optimierer an und rufen Sie die Methode model.fit ()
auf.
adagrad = Adagrad(lr=0.01, epsilon=1e-08)
model.compile(loss='categorical_crossentropy', optimizer=adagrad)
batch_size = 16
nb_epoch = 1000
print('Train...')
model.fit(train_x, train_y,
batch_size=batch_size, nb_epoch=nb_epoch,
show_accuracy=False, verbose=2,
validation_data=(test_x, test_y))
Mit dem oben genannten wird das Programm bis zum Lernen ausgeführt.
Das Beste ist, dass es möglich ist, ein Netzwerk zu definieren und Berechnungen ohne ein separates Skript wie "YAML" oder "Lua" durchzuführen. Es gibt zwei Arten von Backends, "Theano" und "TensorFlow", und ich kann mir derzeit keine interessante Verwendung vorstellen, aber es besteht kein Zweifel daran, dass die Front für Benutzer erweitert wird.
Wie oft gesagt wird, gilt der Kompromiss, aufgrund der erhöhten Abstraktion an Flexibilität zu verlieren, natürlich auch für "Keras". Es scheint jedoch eine sehr nützliche Bibliothek für den Zweck "Ich möchte mein Modell sofort ausprobieren" oder "Ich möchte numerische Experimente mit Hyperparametern wiederholen" beim Prototyping zu sein. (Ich wurde sofort ein Keras-Unterstützer.)
Recommended Posts