[PYTHON] J'ai essayé de porter le code écrit pour TensorFlow sur Theano

A l'origine, j'étudiais "Theano", un framework pour Deep Learning, mais récemment je me suis intéressé à "TensorFlow" sorti le mois dernier (novembre 2015), et récemment je l'ai principalement utilisé. En touchant TensorFlow, j'ai senti que "c'est proche de" Theano ", c'est assez différent", mais pour confirmer la différence entre les deux, j'ai porté un simple code de "TensorFlow" vers "Theano". (Habituellement, je pense que la direction est opposée.)

Résumé: "Theano" contre "TensorFlow"

Tout d'abord, nous comparons les contours des deux cadres.

article Theano TensorFlow
Entité de développement académique(University of Montreal) Compagnie(Google)
Année de publication À propos de 2010(?) 2015
Tensor operation support support
numpy 'basic'fonction de niveau support support
Différenciation automatique(Graph Transformation) support support
Arithmétique GPU support support
Graph Visualization support (Il y a pour le moment) support (Vous connaissez Tensorboard)
Optimizer not support (built-Signifie pas dans) Divers soutien
Fonctions du système de réseau neuronal support (divers) support

En termes de fonctionnalité, il existe des différences dans la dernière partie du tableau ci-dessus. Dans Theano, vous devez préparer vous-même les détails, mais dans ThensorFlow, vous avez l'impression que diverses fonctions de la bibliothèque sont préparées dès le début. (Pour ceux qui ne veulent pas programmer à partir des détails de Theano, il existe une bibliothèque haute performance basée sur Theano, telle que Pylearn2.)

Comparer par code (modélisation de Neural Network)

Ici, vous pouvez écrire du code dans "Theano" et "ThensorFlow" de la même manière. Ceci est un extrait du code MLP (Multi-layer Perceptron) qui effectue la classification multi-classes introduit dans Article précédent.

** Version TensorFlow **

# Hidden Layer
class HiddenLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
    
        w_h = tf.Variable(tf.random_normal([n_in,n_out],mean=0.0,stddev=0.05))
        b_h = tf.Variable(tf.zeros([n_out]))
     
        self.w = w_h
        self.b = b_h
        self.params = [self.w, self.b]
    
    def output(self):
        linarg = tf.matmul(self.input, self.w) + self.b
        self.output = tf.nn.relu(linarg)  # switch sigmoid() to relu()
        
        return self.output

# Read-out Layer
class ReadOutLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
        
        w_o = tf.Variable(tf.random_normal([n_in,n_out],mean=0.0,stddev=0.05))
        b_o = tf.Variable(tf.zeros([n_out]))
       
        self.w = w_o
        self.b = b_o
        self.params = [self.w, self.b]
    
    def output(self):
        linarg = tf.matmul(self.input, self.w) + self.b
        self.output = tf.nn.softmax(linarg)  

        return self.output

** Version Theano **

# Hidden Layer
class HiddenLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
    
        w_h = theano.shared(floatX(np.random.standard_normal([n_in, n_out])) 
                             * 0.05) 
        b_h = theano.shared(floatX(np.zeros(n_out)))
   
        self.w = w_h
        self.b = b_h
        self.params = [self.w, self.b]
    
    def output(self):
        linarg = T.dot(self.input, self.w) + self.b
        # self.output = T.nnet.relu(linarg)
        self.output = T.nnet.sigmoid(linarg)
        
        return self.output

# Read-out Layer
class ReadOutLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
        
        w_o = theano.shared(floatX(np.random.standard_normal([n_in,n_out]))
                             * 0.05)
        b_o = theano.shared(floatX(np.zeros(n_out)))
       
        self.w = w_o
        self.b = b_o
        self.params = [self.w, self.b]
    
    def output(self):
        linarg = T.dot(self.input, self.w) + self.b
        self.output = T.nnet.softmax(linarg)  

        return self.output

Si vous n'y regardez pas de près, la différence est que vous venez de changer "tf." En "T.". En ce qui concerne la fonction d'activation, j'ai pensé que le dernier TenfsorFlow serait plus pratique à cause de "tf.nn.relu ()" etc., mais Theano prend également en charge relu () (Rectified Linear Unit) à partir de la version 0.7.1 Il semble. (Les programmes utilisés dans cet article sont Python ver.2.7.10, TensorFlow ver.0.5.0, Theano ver.0.7.0.)

La fonction Softmax est également naturellement prise en charge par les deux.

Comparaison de code (processus d'optimisation)

Ici, il y a une différence entre les deux (Tensor Flow vs. Theano). Dans TensorFlow, la bibliothèque de classes Optimizer est étendue, tandis que dans Theano, vous devez préparer la bibliothèque de classes Optimizer vous-même.

** Version de TensorFlow (exemple d'utilisation d'Adagrad Optimzer) **

    # Train
    optimizer = tf.train.AdagradOptimizer(0.01)
    train_op = optimizer.minimize(loss)
    
    init = tf.initialize_all_variables()

    with tf.Session() as sess:
        sess.run(init)
        print('Training...')
        for i in range(10001):
            train_op.run({x: train_x, y_: train_y})
            if i % 1000 == 0:                # echo status on screen
                train_accuracy = accuracy.eval({x: train_x, y_: train_y})
                print(' step, accurary = %6d: %8.3f' % (i, train_accuracy))

Dans TensorFlow, spécifiez l'optimiseur pour exécuter Session. Le flux de fourniture de données de train sous la forme de Feed_dict dans Seesion.

** Version Theano (exemple d'implémentation d'Adagrad) ** J'avais l'intention d'écrire la méthode pour appeler la fonction aussi près que possible du code TensorFlow, mais c'est devenu comme suit.

# Optimizers - (GradientDescent), AdaGrad
class Optimizer(object):
    def __init__(self, params, learning_rate=0.01):
        self.lr = learning_rate
        self.params = params
       
    def minimize(self, loss):
        self.gradparams = [T.grad(loss, param) for param in params]
        
class AdagradOptimizer(Optimizer):
    def __init__(self, params, learning_rate=0.01, eps=1.e-6):
        super(AdagradOptimizer, self).__init__(params, learning_rate)
        self.eps = eps
        self.accugrads = [theano.shared(floatX(np.zeros(t.shape.eval())),
                          'accugrad') for t in self.params
                         ]
    def minimize(self, loss):
        super(AdagradOptimizer, self).minimize(loss)
        self.updates = OrderedDict()    # for Theano's rule

        for accugrad, param, gparam in zip(
                              self.accugrads, self.params, self.gradparams):
            agrad = accugrad + gparam * gparam
            dx = - (self.lr / T.sqrt(agrad + self.eps)) * gparam
            self.updates[param] = param + dx
            self.updates[accugrad] = agrad

        return self.updates

Utilisez-les pour exécuter le processus d'optimisation (apprentissage).

    # Train
    myoptimizer = AdagradOptimizer(params, learning_rate=0.01, eps=1.e-8)
    one_update = myoptimizer.minimize(loss)
    
    # Compile ... define theano.function
    train_model = theano.function(
        inputs=[],
        outputs=[loss, accuracy],
        updates=one_update,
        givens=[(x, strain_x), (y_, strain_y)],
        allow_input_downcast=True
    )

    n_epochs = 10001
    epoch = 0
    
    while (epoch < n_epochs):
        epoch += 1
        loss, accu = train_model()
        if epoch % 1000 == 0:
            print('epoch[%5d] : cost =%8.4f, accyracy =%8.4f' % (epoch, loss, accu))

De cette manière, dans le cadre du processus d'optimisation ** Dans TensorFlow ... ** Après avoir initialisé les variables, exécutez Session. Les données d'entraînement sont données pendant la session sous la forme de op.run ({Feed_dict}). ** Chez Theano ... ** Le flux du processus d'apprentissage (y compris la fourniture de données de formation) est défini dans la fonction ano. (). Effectuer des calculs d'apprentissage itératifs à l'aide de la fonction définie (fonction theano.), La différence est visible.

Quand j'ai commencé à apprendre "Theano", je me souviens avoir eu du mal à utiliser cette fonction theano.function (), mais en la comparant avec "TensorFlow" comme décrit ci-dessus, j'ai approfondi ma compréhension de la fonction theano.function (). C'était. (D'un point de vue différent, si vous avez une bonne compréhension de la fonction ano. (), vous pourrez bien utiliser Theano.)

Résumé et impressions

Puisqu'il s'agit d'un framework utilisé dans le même but, il existe de nombreuses similitudes. En termes de fonctionnalités, TensorFlow est plus complet, il peut donc être plus facile de porter le code Theno pour ThenorFlow. Cependant, une fois que l'optimiseur et les nouvelles fonctions sont implémentés, ils peuvent être réutilisés, donc Theano n'est pas un inconvénient. (Le code de l'ancêtre est également utile, et il existe de nombreuses bibliothèques complémentaires.)

Je n'ai pas essayé de modèles de réseau plus complexes simplement en regardant le code MLP, mais les deux semblent être des outils très potentiels. (J'ai également installé Chainer, mais je n'ai pas pu l'obtenir ...)

(Ajout) Informations sur Keras

Lorsque j'ai vérifié le site sur la bibliothèque de réseau neuronal "Keras" au moment de la rédaction de cet article, il semble qu'en plus de la bibliothèque utilisée en combinaison avec "Theano", celle utilisée en combinaison avec "TensorFlow" a été publiée. (J'aimerais le savoir plus tard.)

Keras: Deep Learning library for Theano and TensorFlow

Références (site Web)

Recommended Posts

J'ai essayé de porter le code écrit pour TensorFlow sur Theano
J'ai essayé tensorflow pour la première fois
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé le tutoriel TensorFlow 2ème
J'ai essayé de résumer le code souvent utilisé dans Pandas
mong - J'ai essayé de porter le code qui génère de manière aléatoire le nom du conteneur Docker vers Python -
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
[Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2
J'ai essayé d'exécuter le didacticiel TensorFlow avec des commentaires (_TensorFlow_2_0_Introduction pour les débutants)
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de résumer la commande umask
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai écrit le code pour l'échantillonnage Gibbs
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé Web Scraping pour analyser les paroles.
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé la programmation python pour la première fois.
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de faire de l'IA pour Smash Bra
J'ai essayé Mind Meld pour la première fois
Qiita Job J'ai essayé d'analyser le travail
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
[Introduction à AWS] J'ai essayé de porter une application de conversation et de jouer avec text2speech @ AWS ♪
J'ai essayé de refactoriser le code de Python débutant (lycéen)
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
J'ai essayé d'automatiser le travail de masquage du visage de l'image de coordination pour l'usure
J'ai essayé de déboguer.
J'ai essayé d'exécuter TensorFlow
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé Python sur Mac pour la première fois.
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé python pour la première fois avec heroku
J'ai essayé d'approcher la fonction sin en utilisant le chainer