[PYTHON] Keras comme wrapper de Theano et TensorFlow

Keras était à l'origine une bibliothèque utilisée en combinaison avec le framework Deep Learning Theano, mais avec une mise à jour récente, TensorFlow de Google peut également être utilisé comme backend.

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.

Étant donné que Theano prend principalement en charge la partie de base du fonctionnement des tenseurs, il est raisonnable qu'il existe des bibliothèques plus abstraites basées sur Theano, mais il prend en charge un plus large éventail de fonctions. J'ai été un peu surpris que Keras prenne en charge TensorFlow. Ci-dessous, j'ai étudié la situation en créant un code simple.

(L'environnement du programme est Linux Ubuntu 14.04, Python 2.7.11, Theano ver.0.7.0, TensorFlow ver.0.6.0, Keras ver.0.3.0.)

De l'installation à l'exécution de "mnist_mlp.py"

Theano et ThensorFlow ont été installés dans un environnement où le GPU peut être utilisé auparavant. Cette fois, "Keras" a été ajouté.

> git clone https://github.com/fchollet/keras.git
> cd keras
> python setup.py install

À l'exception du répertoire des exemples, un exemple de code est fourni pour les problèmes typiques.

> 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

Parmi eux, 'mnist_mlp.py' était un exemple de MNIST (problème de classification des nombres manuscrits), donc quand j'ai exécuté ceci, une erreur s'est produite au début.

Traceback (most recent call last):
  File "mnist_mlp.py", line 50, in <module>
    model.compile(loss='categorical_crossentropy', optimizer=rms)
...
(Omis)
...
  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'

Ceci est dû au fait que "relu" était spécifié comme fonction d'activation dans "minist_mlp.py", mais il n'était pas pris en charge par la version Theano ver.0.7.0, qui était à l'origine installée par Anaconda. .. (Le document de Theno indique que "Relu" est pris en charge à partir de la version 0.7.1.) Cependant, Theano sur GitHub a "Relu" (bien que la version 0.7.0). Ainsi, lorsque j'ai amélioré cela, l'erreur ci-dessus a disparu.

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

La précision de classification de Test est d'environ 98,4%.

Le backend est passé de "Theano" à "TensorFlow"

Il existe deux façons de changer la fin de la banque.

  1. Modifiez le fichier d'environnement ("$ HOME / .keras / keras.json") dans le répertoire personnel "keras.json" est un fichier d'une ligne de {" epsilon ": 1e-07," floatx ":" float32 "," backend ":" theano "}, donc le dernier terme, "theano" Changez-le en "thensorfolw".
  2. Modifiez la variable d'environnement "KERAS_BACKEND". Si la variable d'environnement n'est pas définie, la valeur de keras.json ci-dessus est définie. Si une variable d'environnement est définie, ce paramètre a la priorité.
export KERAS_BACKEND=tensorflow

Avec cela seul, le même code Keras peut être exécuté à l'aide de la bibliothèque TensorFlow. (Très facile!) En comparant les deux méthodes, la définition des variables d'environnement semble être plus facile. (Bien sûr, pour revenir à theono, vous pouvez soit définir la variable d'environnement ci-dessus sur ʻunset`, soit la définir sur'theano '.)

En passant, les résultats du test de performance sont affichés ici, je vais donc les citer. 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

Même si vous exécutez le même code pour le même problème, vous pouvez voir que le temps requis change considérablement en fonction de la fin de la banque. (Il semble que cela soit dû au calcul du processeur.)

Essayez-le avec votre propre code

J'ai essayé de changer le code MLP de classification Wine de la version TensorFlow / version Theano, qui a été traité dans l'article récemment publié, vers la version Keras. C'est un code court que j'ai écrit pour Tutorial, mais il est encore plus compact dans la version Keras. (Pour le code d'origine, reportez-vous à la version TensorFlow, version Theano.

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

Ci-dessous, nous confirmerons les détails.

Après avoir saisi les données au début, la définition du modèle de réseau (MLP) est effectuée. Même dans Theano et TensorFlow, si vous définissez la couche de couche masquée Classe et la couche de couche de sortie Classe, la partie de définition MLP principale peut être résumée de manière assez concise, mais dans Keras, vous n'avez pas à créer la classe vous-même, le code suivant Le réseau peut être défini avec.

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

Choisissez de définir un réseau à propagation directe avec le premier model = Sequential (). Ensuite, du côté de l'entrée (définition de la couche cachée 1), (définition de la couche cachée 2) et (définition de la couche de sortie) sont effectuées dans cet ordre. Vous pouvez écrire très clairement, par exemple en sélectionnant une fonction d'activation, en spécifiant un Rezularizer et en spécifiant un abandon.

À propos, le modèle de réseau de propagation avant model = Sequential () peut prendre en charge jusqu'à CNN (Convolutional Neural Network), et pour RNN (Recurrent Neural Net) etc. avec une structure plus compliquée, dans Keras, model = Graph () La structure peut être définie par le modèle Graph en commençant par la déclaration . (Je voudrais étudier cela à l'avenir.)

Dans la seconde moitié du code MLP, spécifiez l'optimiseur et appelez la méthode de model.fit ().

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

Avec ce qui précède, le programme est exécuté jusqu'à l'apprentissage.

Impressions d'utilisation

Mieux encore, c'est formidable de pouvoir définir un réseau et effectuer des calculs sans script séparé tel que "YAML" ou "Lua". Avec les deux types de backends, "Theano" et "TensorFlow", je ne vois aucune utilisation intéressante à ce stade, mais il ne fait aucun doute que la façade pour les utilisateurs va s'étendre.

De plus, comme on le dit souvent, le compromis entre la perte de flexibilité due à une abstraction accrue s'applique naturellement aussi à "Keras". Cependant, cela semble être une bibliothèque très utile dans le but de «Je veux essayer mon modèle immédiatement» ou «Je veux répéter des expériences numériques d'hyperparamètres» en prototypage. (Je suis devenu un partisan de Keras à la fois.)

Références (site Web)

Recommended Posts

Keras comme wrapper de Theano et TensorFlow
Garantie de reproductibilité avec les keras (à partir du 22 septembre 2020)
Introduction du wrapper Virtualenv
Bibliothèque pratique TF-Slim de Tensorflow
Expérience de réglage des données Tensorflow
Implémentation de word2vec avec Theano + Keras
J'ai touché Tensorflow et keras
[Keras] inférence par lots d'arcface