[PYTHON] Theanos Grundnotizen

Als Fortsetzung von Blog Post möchte ich etwas mehr über die Details von Theano zusammenfassen, die ich nicht auf die Folie schreiben konnte.

Zunächst einmal ist Theano-Kommentar ein prägnanter Ausdruck der Theano-Funktionen. Ich empfehle Ihnen daher, ihn zu lesen.

Wie es hier geschrieben steht, ist das Merkmal von Theano

Und so weiter.

Theanos super vereinfachtes Tutorial

http://deeplearning.net/software/theano/tutorial/index.html#tutorial Eine grobe Zusammenfassung von.

Importieren Sie immer zuerst 3

import numpy
import theano
import theano.tensor as T

Diese drei sind Versprechen.

Alles was Sie wissen müssen ist

Wenn Sie ein allgemeines Verständnis für Folgendes haben, sollten Sie in der Lage sein, die Deep Learning-Implementierung zu lesen und zu verstehen und Änderungen vorzunehmen.

Die Geschichte der Variablen (Symbole)

Die von Theano behandelten Variablen werden vom Konzept des "Tensors" behandelt. Die Typen und Operationen um den Tensor sind unter theano.tensor (als T) grob definiert.

Ich verstehe Tensol nicht wirklich, aber vorerst "** T. * Nachfolgend sind die Arten von Variablen und die wichtigsten mathematischen Allzweckfunktionen (exp, log, sin usw.) aufgeführt. **" darüber.

Hier ist "** Variablentyp **"

es gibt. Diese werden kombiniert, um den Variablentyp (Tensortyp) darzustellen.

Als Name,

Und

Und so weiter (es gibt andere).

Kombinieren Sie diese,

Und so weiter. Zum Beispiel:

x = T.lscalar("x")
m = T.dmatrix()

Diese x und m sind "Symbole" und haben keine tatsächlichen Werte. Dies unterscheidet sich ein wenig von normalen Python-Variablen.

Weitere Informationen zur Variablengenerierung finden Sie weiter unten. http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-basic-tensor

Das Berechnungsergebnis des Symbols ist ein Symbol

Zum Beispiel

x = T.lscalar("x")
y = x*2
z = T.exp(x)

Und ausführen. Da x ein Symbol ist, das keinen Wert hat, hat y keinen Wert, und y ist auch ein Symbol, das "x * 2" bedeutet. z ist auch ein Symbol für exp (x). (Eigentlich Python-Objekt)

Die Berechnungen, aus denen das neuronale Netzwerk besteht, werden auch als eine Masse von Operationen (kurz ein Ausdruck) zwischen diesen Symbolen behandelt, bis tatsächlich ein Wert angegeben wird. Da es als Ausdruck behandelt wird, ist es für den Menschen leicht zu verstehen, und ich denke, dass es möglich sein wird, eine automatische Differenzierung durchzuführen, die später beschrieben wird, und sie zur Laufzeit zu optimieren.

Funktion: um die Funktion

Um die Berechnung tatsächlich durchführen zu können, muss eine "Funktion" definiert werden.

Wenn Sie beispielsweise "** f (x) = x * 2 **" machen möchten

f = theano.function([x], x*2)

Und

y = x*2
f = theano.function([x], y)

Und so weiter. f wird eine Funktion und wenn aufgerufen

>>> f(3)
array(6)

Es wird sein.

Funktion ist

Angegeben. Es scheint, dass die Funktion zu diesem Zeitpunkt kompiliert wird und sogar komplizierte Funktionen mit hoher Geschwindigkeit ausgeführt werden.

Funktion hat das Schlüsselwort ** gibt **. Wie der Name schon sagt, hat givens die Funktion, "ein Symbol in einem Ausdruck durch ein anderes Symbol oder einen anderen Wert zu ersetzen".

Zum Beispiel

>>> x = T.dscalar()
>>> y = T.dscalar()
>>> c = T.dscalar()
>>> ff = theano.function([c], x*2+y, givens=[(x, c*10), (y,5)])
>>> ff(2)
array(45)

Das kannst du sagen. Ursprünglich ist der zu berechnende Wert "x * 2 + y", aber das Argument der Funktion selbst soll das Symbol "c" annehmen. Tatsächlich kann es nicht berechnet werden, wenn nicht x und y angegeben sind, aber es kann auch berechnet werden, indem die Werte von x und y in diesem angegebenen Teil angegeben werden. Dies wird in zukünftigen Tutorials verwendet, um Daten teilweise beim maschinellen Lernen zu verwenden.

T.grad: Um Differenzierung

Eines der Hauptmerkmale von Theano ist diese Differenzierungsfunktion. Sie können "die Formel analysieren, um die differenzierte Formel zu finden", die als automatische Differenzierung bezeichnet wird.

Zum Beispiel

x, y = T.dscalars ("x", "y") # * Kollektiv deklarieren z = (x+2*y)**2

Wenn Sie die Formel in Bezug auf x differenzieren, erhalten Sie dz / dx = 2 (x + 2 * y).

gx = T.grad(z, x)

Sie können den Ausdruck mit konvertieren.

Zur Differenzierung in Bezug auf y ist dz / dy = 4 (x + 2 * y), aber

gy = T.grad(z, y)

Sie können den Ausdruck mit konvertieren.

Wenn der Wert tatsächlich gefunden wird, muss er noch funktionalisiert werden.

fgy = theano.function([x,y], gy)
>>> fgy(1,2)
array(20.0)

Und so weiter.

geteilt: geteilte Variable

Variable = theano.shared (Objekt)

Sie können gemeinsam genutzte Daten, auf die in der obigen ** Funktion ** verwiesen werden kann, in Form von deklarieren. Zum Beispiel

>>> x = T.dscalar("x")
>>> b = theano.shared(numpy.array([1,2,3,4,5]))
>>> f = theano.function([x], b * x)
>>> f(2)
array([  2.,   4.,   6.,   8.,  10.])

Sie können es mit verwenden. Referenzieren oder Festlegen des Werts einer gemeinsam genutzten Variablen

>>> b.get_value()
array([1,2,3,4,5])
>>> b.set_value([10,11,12])

Und so weiter. Dies spiegelt sich sofort in der zuvor definierten Funktion wider. Wenn Sie ** f (2) ** erneut ausführen, können Sie feststellen, dass sich das Ergebnis geändert hat.

>>> f(2)
array([ 20.,  22.,  24.])

T.grad und gemeinsam genutzte Variablen und Aktualisierungen: typisches Implementierungsmuster für Gradientenmethoden

Die Funktion verfügt über ein Schlüsselwortargument namens ** updates **, mit dem Sie gemeinsam genutzte Variablen aktualisieren können.

Um beispielsweise c als gemeinsam genutzte Variable festzulegen und bei jeder Ausführung der Funktion f um 1 zu erhöhen, schreiben Sie wie folgt.

c = theano.shared(0)
f = theano.function([], c, updates= {c: c+1})

Der Teil ** aktualisiert = {c: c + 1} ** repräsentiert die Aktualisierung des in der Programmiersprache bekannten Werts ** c = c + 1 **. Wenn Sie dies tun, erhalten Sie:

>>> f()
array(0)
>>> f()
array(1)
>>> f()
array(2)

Diese können verwendet werden, um die Gradientenmethode zu implementieren. Suchen Sie beispielsweise für Daten ** x = [1,2,3,4,5] ** ** c **, das ** y = Summe ((xc) ^ 2) ** minimiert. Ich will. Der Code lautet beispielsweise wie folgt.

x = T.dvector("x") # input
c = theano.shared(0.) #Ich werde dies aktualisieren. Der Anfangswert ist vorerst 0.
y = T.sum((x-c)**2)  # y=Wert, den Sie minimieren möchten
gc = T.grad(y, c) #Teilweise Differenzierung von y in Bezug auf c
d2 = theano.function([x], y, updates={c: c - 0.05*gc}) #Aktualisiert c jedes Mal, wenn es ausgeführt wird, und gibt das aktuelle y zurück

Wenn Sie ** d2 () ** mehrmals ** [1,2,3,4,5] ** geben,

>>> d2([1,2,3,4,5])
array(55.0)
>>> c.get_value()
1.5
>>> d2([1,2,3,4,5])
array(21.25)
>>> c.get_value()
2.25
>>> d2([1,2,3,4,5])
array(12.8125)
>>> c.get_value()
2.625

Es wird sein. Sie können sehen, dass y allmählich abnimmt und c sich allmählich "3" nähert.

Implementierung der logistischen Regression

Wenn Sie diesen Bereich verstehen, werden Sie im folgenden Lernprogramm verstehen, wie die logistische Regression funktioniert.

http://deeplearning.net/software/theano/tutorial/examples.html#a-real-example-logistic-regression

(Nun, weißt du von Anfang an? ^^;)

Recommended Posts

Theanos Grundnotizen
Grundlegende Syntaxhinweise für Shell-Skripte
JetBrains_learning notes_003
Numpy [Basic]
SQLAlchemy note
pyenv Notizen
SQL-Notizen
Pandas Notizen
Sphinx-Memo
Django Memo
Grundlegende Befehle
Jupyter_Lernen Notizen_000
Theanos Faltung
Django Memo
Leicht verständliche C # -Notizen für Pythonisten (nur einfache)