[PYTHON] Keras als Wrapper von Theano & TensorFlow

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

Von der Installation bis zur Ausführung von 'mnist_mlp.py'

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

Geändertes Backend von 'Theano'to'TensorFlow'

Es gibt zwei Möglichkeiten, das Bankende zu ändern.

  1. Ändern Sie die Umgebungsdatei ("$ HOME / .keras / keras.json") im Ausgangsverzeichnis "keras.json" ist eine einzeilige Datei von "{" epsilon ": 1e-07," floatx ":" float32 "," backend ":" theano "}", also der letzte Begriff "theano". Ändern Sie es in "thensorfolw".
  2. Ändern Sie die Umgebungsvariable "KERAS_BACKEND". Wenn die Umgebungsvariable nicht definiert ist, wird der Wert von keras.json oben festgelegt. Wenn eine Umgebungsvariable festgelegt ist, hat diese Einstellung Vorrang.
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.)

Versuchen Sie es mit Ihrem eigenen Code

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.

Eindrücke von der Verwendung

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

Referenzen (Website)

Recommended Posts

Keras als Wrapper von Theano & TensorFlow
Garantie der Reproduzierbarkeit mit Keras (Stand 22. September 2020)
Einführung des Virtualenv-Wrappers
Tensorflows praktische Bibliothek TF-Slim
Experiment zur Optimierung der Tensorflow-Daten
Word2vec mit Theano + Keras implementiert
Ich berührte Tensorflow und Keras
[Keras] Batch-Inferenz der Bogenfläche