[PYTHON] Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren

Ursprünglich habe ich "Theano" studiert, ein Framework für Deep Learning, aber kürzlich interessierte ich mich für "TensorFlow", das letzten Monat (November 2015) veröffentlicht wurde, und kürzlich habe ich es hauptsächlich verwendet. Während ich TensorFlow berührte, hatte ich das Gefühl, dass "dies in der Nähe von" Theano "ist, dies ist ganz anders", aber um den Unterschied zwischen den beiden zu bestätigen, habe ich einen einfachen Code von "TensorFlow" nach "Theano" portiert. (Normalerweise denke ich, dass die Richtung entgegengesetzt ist.)

Zusammenfassung: "Theano" vs. "TensorFlow"

Zunächst vergleichen wir die Umrisse der beiden Frameworks.

Artikel Theano TensorFlow
Entwicklungseinheit akademisch(University of Montreal) Unternehmen(Google)
Erscheinungsjahr Über 2010(?) 2015
Tensor operation support support
numpy 'basic'Level-Funktion support support
Automatische Differenzierung(Graph Transformation) support support
GPU-Arithmetik support support
Graph Visualization support (Es gibt vorerst) support (Sie kennen Tensorboard)
Optimizer not support (built-Bedeutet nicht in) Verschiedene Unterstützung
Systemfunktionen des neuronalen Netzwerks support (verschiedene) support

In Bezug auf die Funktionalität gibt es Unterschiede im letzten Teil der obigen Tabelle. In Theano müssen Sie die Details selbst vorbereiten, in ThensorFlow haben Sie jedoch den Eindruck, dass verschiedene Bibliotheksfunktionen von Anfang an vorbereitet sind. (Für diejenigen, die nicht anhand der Details in Theano programmieren möchten, gibt es eine auf Theano basierende Hochleistungsbibliothek wie Pylearn2.)

Vergleiche nach Code (Modellierung des neuronalen Netzes)

Hier können Sie Code in "Theano" und "ThensorFlow" auf die gleiche Weise schreiben. Dies ist ein Auszug aus dem MLP-Code (Multi-Layer Perceptron), der eine in Vorheriger Artikel eingeführte Klassifizierung mehrerer Klassen durchführt.

** TensorFlow-Version **

# 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

** Theano Version **

# 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

Wenn Sie nicht genau hinschauen, ist der Unterschied "nur geändert" tf. "Zu" T. "". In Bezug auf die Aktivierungsfunktion dachte ich, dass der spätere TenfsorFlow aufgrund von "tf.nn.relu ()" usw. bequemer wäre, aber Theano unterstützt auch relu () (Rectified Linear Unit) ab Version 0.7.1 Es scheint. (Die in diesem Artikel verwendeten Programme sind Python Version 2.7.10, TensorFlow Version 0.5.0, Theano Version 0.7.0.)

Die Softmax-Funktion wird natürlich auch von beiden unterstützt.

Codevergleich (Optimierungsprozess)

Hier gibt es einen Unterschied zwischen den beiden (Tensor Flow vs. Theano). In TensorFlow ist die Optimizer-Klassenbibliothek umfangreich, während Sie in Theano die Optimizer-Klassenbibliothek selbst vorbereiten müssen.

** TensorFlow-Version (Verwendungsbeispiel für 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))

Geben Sie in TensorFlow das Optimierungsprogramm an, um die Sitzung auszuführen. Der Fluss der Bereitstellung von Zugdaten in Form von Feed_dict in Seesion.

** Theano-Version (Beispiel für die Implementierung von Adagrad) ** Ich wollte schreiben, wie man die Funktion so nah wie möglich am TensorFlow-Code aufruft, aber es wurde wie folgt.

# 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

Verwenden Sie diese, um den Optimierungsprozess (Lernen) auszuführen.

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

Auf diese Weise im Teil des Optimierungsprozesses ** In TensorFlow ... ** Führen Sie nach dem Initialisieren der Variablen Session aus. Trainingsdaten werden während der Sitzung in Form von op.run ({Feed_dict}) angegeben. ** Bei Theano ... ** Der Ablauf des Lernprozesses (einschließlich der Bereitstellung von Trainingsdaten) wird in theano.function () definiert. Führen Sie iterative Lernberechnungen mit der definierten Funktion (theano.function) durch. Der Unterschied ist zu sehen.

Als ich anfing, "Theano" zu lernen, erinnere ich mich, dass ich Probleme hatte, diese theano.function () zu verwenden, aber durch den Vergleich mit "TensorFlow" wie oben beschrieben, vertiefte ich mein Verständnis von theano.function (). Es war. (Unter einem anderen Gesichtspunkt können Sie Theano gut verwenden, wenn Sie ein gutes Verständnis von theano.function () haben.)

Zusammenfassung und Eindrücke

Da es sich um ein Framework handelt, das für denselben Zweck verwendet wird, gibt es viele Ähnlichkeiten. In Bezug auf die Funktionalität ist TensorFlow vollständiger, sodass es möglicherweise einfacher ist, den Theno-Code für ThenorFlow zu portieren. Sobald der Optimierer und neue Funktionen implementiert sind, können sie jedoch wiederverwendet werden, sodass Theano kein Nachteil ist. (Der Code des Vorfahren ist ebenfalls hilfreich, und es gibt viele Zusatzbibliotheken.)

Ich habe komplexere Netzwerkmodelle nicht nur anhand des MLP-Codes ausprobiert, aber beide scheinen sehr potenzielle Werkzeuge zu sein. (Ich habe auch Chainer installiert, aber ich konnte es nicht bekommen ...)

(Ergänzung) Informationen zu Keras

Als ich zum Zeitpunkt des Schreibens dieses Artikels die Website über die neuronale Netzwerkbibliothek "Keras" überprüft habe, scheint es, dass zusätzlich zu der in Kombination mit "Theano" verwendeten Bibliothek die in Kombination mit "TensorFlow" verwendete Bibliothek veröffentlicht wurde. (Ich würde es gerne später herausfinden.)

Keras: Deep Learning library for Theano and TensorFlow

Referenzen (Website)

Recommended Posts

Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
mong - Ich habe versucht, den Code, der zufällig den Containernamen von Docker generiert, nach Python zu portieren. -
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
[Für diejenigen, die TPU verwenden möchten] Ich habe versucht, die Tensorflow Object Detection API 2 zu verwenden
Ich habe versucht, das TensorFlow-Tutorial mit Kommentaren auszuführen (_TensorFlow_2_0_Einführung für Anfänger).
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe den Code für Gibbs Sampling geschrieben
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe Web Scraping versucht, um die Texte zu analysieren.
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, KI für Smash Bra zu machen
Ich habe Mind Meld zum ersten Mal ausprobiert
Qiita Job Ich habe versucht, den Job zu analysieren
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Ich habe versucht zu debuggen.
Ich habe versucht, TensorFlow auszuführen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren