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.
http://deeplearning.net/software/theano/tutorial/index.html#tutorial Eine grobe Zusammenfassung von.
import numpy
import theano
import theano.tensor as T
Diese drei sind Versprechen.
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 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
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.
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.
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.
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.])
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.
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