Allein das Schreiben hat mich am Samstag und Sonntag zwei Tage lang niedergeschlagen. Es stimmt mit dem überein, was Sie gelernt haben. Wenn Sie es also durchlesen, werden Sie über Code sprechen. Ich möchte Tensorflow berühren / ausprobieren, aber ich verstehe immer noch nicht verschiedene Dinge! Ich habe es für diejenigen geschrieben, die sagten.
** * Hinzugefügt am 4. Oktober 2018 ** Da es sich um einen sehr alten Artikel handelt, besteht eine hohe Wahrscheinlichkeit, dass der Link unterbrochen wird oder das offizielle Dokument geändert wurde. Ich habe das Gefühl, dass Tensorflow in diesem Artikel ungefähr ver0.4 ~ 0.7 war, also scheint es, dass es ver2.0 ~ sein wird. Nun wissen Sie vielleicht nicht, worauf sich die meisten Sätze beziehen.
Es scheint, dass Experten darauf hinweisen werden, aber der Punkt ist, dass es sich um eine Black Box handelt, die eine Regressionsanalyse durchführt. Nur das Wort "Rückkehr" bringt "?" Lassen Sie die Maschine den "Wert" berechnen, den Sie finden möchten, und den Wert, der so nahe wie möglich daran liegt. Also, ist es nicht okay? zB Ich möchte eine richtige Funktion wissen
Ich möchte ein geeignetes "Gesicht" aus einer Reihe von Pixeln kennen Dann gibt es viele Dinge, die ich gerne wissen würde! Ich denke, es gibt viele Leute, die das sagen. Ich möchte nur aufnehmen, wenn das Video des Idols ein wirklich verrücktes Gesicht (Wert) hat! Oder [Qiita: - Versuchen Sie anhand von Deep Learning (es funktioniert oder subtil) festzustellen, ob es groß ist oder nicht (http://qiita.com/summer4an/items/db0124eee8103c1d3b85). Es scheint, dass es immer große Vorfahren gibt. Beginnen wir also mit Deep Learning! ist geworden.
Zuallererst die Menge an Informationen ** Anfangs wusste ich nicht, was Tensorflow ist und was die Funktionen tun, also habe ich oft darüber nachgedacht, zu Theano zu wechseln, aber im Moment sind die meisten Fragen bereits in Stackoverflow (auf Englisch) oder Github. In der Ausgabe sind verschiedene Dinge geschrieben, daher ist die Namenskraft von Google erstaunlich. Der Code des Hauptteils von Tensorflow kann auch gefunden werden, indem Sie in Google nach dem Funktionsnamen suchen, damit Sie Ihr Verständnis des Hauptteils während der Verwendung vertiefen können. Bevor Sie anfangen zu berühren ** Was können Sie tun und was können Sie nicht tun? Ich wusste es nicht einmal **, also las ich die Blogs von Leuten, die verschiedene Experimente mit dem Deep Learning Framework durchführen. Ist es "Tensorflow> Theano> Chainer" für die Klarheit des Dokuments?
-Tensorflow Kivantium-Aktivitätstagebuch: - Identifizieren Sie die Produktionsfirma von Anime Yuruyuri mit TensorFlow Sugyan Memo: - Identifizieren Sie das Gesicht eines Idols durch tiefes Lernen mit TensorFlow -Theano Ein Durchbruch bei der künstlichen Intelligenz: - Implementierung eines Faltungsnetzwerks durch Theano (1) StatsFragments: - Tiefes Lernen mit Theano <3>: Convolutional Neural Network -Chainer Sekairabo: -Ich habe einen Bot erstellt, der natürlich mit LSTM antworten kann Oriental Robotics: - Lernen mit RNN zur Ausgabe von literarischem Text (auch bekannt als DeepDazai) Bevorzugte Forschung: - Roboterkontrolle mit verteiltem Tiefenverstärkungslernen
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ist Rang 2 Der Punkt ist die Anzahl der Dimensionen von Tensor selbst.
Rank | Mathematische Einheiten th> | Python example |
---|---|---|
0 | Skalar (nur tatsächliche Menge) td> | s = 483 |
1 | Vektor (Menge und Richtung) td> | v = [1.1, 2.2, 3.3] |
2 | Matrix (gemeinsame Tabelle) td> | m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3-Tensor (dreidimensional) td> | t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]] |
n | n-Tensor (n-dimensional) td> | .... |
Shape
T = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Form ist 3D x 3D, also [3, 3]
Rank | Shape | Dimension number | Example |
---|---|---|---|
0 | [] | 0-D | A 0-D tensor. A scalar. |
1 | [D0] | 1-D | A 1-D tensor with shape [5]. |
2 | [D0, D1] | 2-D | A 2-D tensor with shape [3, 4]. |
3 | [D0, D1, D2] | 3-D | A 3-D tensor with shape [1, 4, 3]. |
n | [D0, D1, ... Dn-1] | n-D | A tensor with shape [D0, D1, ... Dn-1]. |
Type Dies ist ein Int oder Float, daher brauche ich nicht viel Erklärung.
Im Beispiel von MNIST werden 55.000 Bilddaten (Bilder) Tensor und Bildantwort (Etiketten) Tensor angezeigt.
Images Tensor ist Shape [55000, 784]
, Rank2
, dtype = tf.float32
Labels Tensor ist Shape [55000, 10]
, Rank2
, dtype = tf.float32
Im Tutorial wird es zuerst mit "tf.placeholder" eingefügt. (Es ist möglicherweise einfacher zu verstehen, wenn Sie "sicherer Tensor" sagen.)
input_Tensoren
x = tf.placeholder(tf.float32, [None, 784]) #images
y_ = tf.placeholder(tf.float32, [None, 10]) #labels
#Der Teil Keine enthält die Anzahl der Chargen
Beachten Sie, dass "tf.placeholder ()" für jede Trainingsausführung Daten mit dem Argument "feed_dict" erhalten muss. Im Fall des Tutorials beginnt die Lernausführung gegen Ende:
Startcode für die Ausführung der letzten Lernausführung
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
In Wirklichkeit verarbeiten Tensoren also alle 100 Bilder von x: Shape [100, 784]
y_: Shape [100, 10]
.
Die Bilddaten sind ursprünglich 28 x 28 Pixel Graustufen = 1 Kanal, aber im Anfänger-Tutorial werden sie zur einfachen Betrachtung flach in einen 784-dimensionalen Vektor konvertiert (oder besser gesagt, es wurde bereits durchgeführt).
28281 = 784-Dimension
** - Sie können es in der Abbildung sehen - **
Es ist so, als würden alle Zahlen vertikal und horizontal horizontal ausgerichtet.
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000.6.7.7.50000000000.81111111.9.30000000.4.4.4.7111000000000000.1.10000000000000000000000000000000000000000000000000000000000
Für diejenigen, die es sehen können, scheint es "1" zu sein.
Übrigens, im Fall von "[55000, 28, 28, 1]", das das Bild nicht abflacht, Rang 4
Selbst im Fall eines Farbbildes ändert es sich nur auf 3 Kanäle, also [55000, 28, 28, 3]
Rank4
Sobald Tensor es verstanden hat, kann die maschinelle Lernverarbeitung von Tensorflow verfolgt werden.
Ich habe Image Tensorx: [batch_num, 784]
vorbereitet, aber wie leitet man die richtige Antwort aus den 10 richtigen Antworten aus dem 784-dimensionalen Vektor ab?
Hier verstehen wir die Existenz von ** Matrixoperationen und "Gewichten", "Bias" und Softmax-Regression **.
Matrixoperationen sind eine einfache Sache. Wenn Sie eine Matrixoperation von "[784, 10]" für "x: [batch_num, 784]" ausführen, wird eine Matrix von "[batch_num, 10]" erstellt, sodass 10 mögliche Antworten vorliegen. Wenn Sie sich auf das Bild auf Wikipedia beziehen; "A: [4,2]" und "B: [2,3]" sind jetzt "[4,3]". In Tensorflow
Matrix Operation matmul
tf.matmul(A,B) # A is [4,2] and B is [2,3]. output would be [4,3]
'''
x: [batch_num, 784]
W: [784, 10]
matmul: [batch_num, 10]
'''
matmul = tf.matmul(x,W)
In diesem B[2,3]
ist MNIST,W: [784, 10]
ein wichtiges ** Gewicht **.
Die Gewichte "W: [784, 10]" sind jetzt verfügbar. Der Teil im Code ist
Gewicht W.
W = tf.Variable(tf.zeros([784, 10]))
tf.Variable ()
ist In-Memory-Puffer </ i> Es ist eine Variable, die Tensor enthält und die Parameter beibehält, die Sie zum Lernen verwenden möchten.
tf.zeros ()
erstellt einen Tensor, dessen Inhalt mit 0
gefüllt ist.
Das Füllen mit "0" ist nur ein "0" -Start, da es von Zeit zu Zeit während des Lernprozesses aktualisiert wird. Es gibt auch ein tf.random_normal ()
, das eine Zufallszahl eingibt.
Der Inhalt von "W: [784, 10]" sind die numerischen Werte des Bildes in 1-Pixel-Einheiten, die Möglichkeit von 0 ist 0.XXX, die Möglichkeit von 1 ist -0.0.XXX, die Möglichkeit von 2 ist 0.0XX ... Ich komme, um die Zahlen so zu multiplizieren.
Beispielsweise ist im Fall des vorherigen "1" -Bildes für das allererste obere linke Pixel das tatsächlich trainierte Gewicht "W [0]" "[0.0.0.0.0.0.0.0". 0. 0. 0. 0.] Oft. Der Grund ist klar: Alle Zahlen von 0 bis 9 machen im oberen linken Pixel keinen Sinn. Betrachtet man das Gewicht
W [380]in der Mitte:
[-0.23017341 0.03032022 0.02670325 -0.06415708 0.07344861 -0.05119878 0.03592584 -0.00460929 0.09520938 0.08853132]`
Es ist geworden. Die Tatsache, dass das Gewicht von 0 "-0,23017341" negativ ist, bedeutet, dass ** es unwahrscheinlich ist, "0" zu sein, wenn das mittlere Pixel schwarz ist. Ich verstehe das **.
Ich denke, es ist eher die Faltungsschicht des Experten-Tutorials, aber ** Ich persönlich bin der Meinung, dass der Wortfilter angemessener ist als das Gewicht. ** ** **
Wenn dieses Gewicht in Images Tensor matrixberechnet wird
Nach der Matrixberechnung
matmul = tf.matmul(x,W)
print "matmul:", matmul[0] #Erstes Bild(Die Antwort ist 7)
matmul: [ 1.43326855 -10.14613152 2.10967159 6.07900429 -3.25419664
-1.93730605 -8.57098293 10.21759605 1.16319525 2.90590048]
Wird zurückgegeben. Nun, ich bin mir immer noch nicht sicher.
Bias kann unangemessen sein, weil es großartig klingt,
y = x(sin(2+(x^1+exp(0.01)+exp(0.5)))+x^(2+tan(10)))+x(x/2x+x^3x)+0.12
Ist es so etwas wie das letzte "0.12", wenn es eine solche Funktion gibt?
Einfacher gesagt, b
? Von y = xa + b
?
Oh, deshalb ist es Voreingenommenheit.
Im Fall des Tutorials änderte sich die Genauigkeit der Antwort jedoch auch ohne Verzerrung nicht wesentlich.
Wenn der wahre Wert der Vorspannung "b = 1e-10" ist, bedeutet dies möglicherweise nicht viel.
Im Code werden wir es auf die gleiche Weise wie das Gewicht erstellen, aber da der Bild-Tensor und das Gewicht bereits matrixgesteuert wurden, ist die später hinzuzufügende Vorspannung "Form [10]" von "Rang1".
vorspannen
b = tf.Variable(tf.zeros([10]))
print "b:",b #Voreingenommenheit nach dem Lernen
b: [-0.98651898 0.82111627 0.23709664 -0.55601585 0.00611385 2.46202803
-0.34819031 1.39600098 -2.53770232 -0.49392569]
Ich bin mir nicht sicher, ob dies eine einzelne Einheit ist.
Der ursprüngliche Bildtensor x: [batch_num, 784]
ist
Matrixoperation mit "x" Gewicht "W: [784, 10]"
Nach dem Werden von =
matmul: [batch_num, 10]
+
Biasb: [10]
wird hinzugefügt.
Ich verstehe die Bedeutung dieser Zahlen jedoch immer noch nicht.
Übergeben Sie diese daher an "tf.nn.softmax ()", damit sie vom Menschen verstanden werden können.
softmax
y = tf.nn.softmax(tf.matmul(x, W) + b)
print "y", y[0] #Erstes Bild(Die Antwort ist 7)
y [ 2.04339485e-05 6.08732953e-10 5.19737077e-05 2.63350527e-03
2.94665284e-07 2.85405549e-05 2.29651920e-09 9.96997833e-01
1.14465665e-05 2.55984633e-04]
Betrachtet man es, ist die 7. Zahl die höchste. Anscheinend ist die Wahrscheinlichkeit von "7" hoch. Wenn Sie einfach die Antworten und nicht die Wahrscheinlichkeiten im Array abgleichen möchten
Bitte gib mir eine Antwort
x_answer = tf.argmax(y,1)
y_answer = tf.argmax(y_,1)
print "x",x_answer[0:10] #Die Antwort der ersten 10 Bilder, die Tensorflow denkt
print "y",y_answer[0:10] #10 Die wahre Antwort des Bildes
x [7 2 1 0 4 1 4 9 6 9]
y [7 2 1 0 4 1 4 9 5 9]
Ich möchte die Genauigkeit wissen
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print "accuracy:", accuracy
accuracy: 0.9128
Jetzt verstehen Sie, wie Tensorflow die Antwort von MNIST gibt. Aber wie läuft das Lernen der Gewichte "W" und "Bias" b "ab? Es wird sein. Der Hinweis befindet sich in dem Teil, in dem die Lernausführung von Tensorflow wiederholt wird.
Startcode für die Ausführung der letzten Lernausführung
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
Dieser train_step
scheint zu trainieren. Der Inhalt ist
Lernmethode
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
'''
y: [batch_num, 10] y is a list of processed numbers of x(images)
y_: [batch_num, 10] y_ is labels
0.01 is a learning rate
'''
Aber lass uns noch ein bisschen kauen
tf.log ()
berechnet das Protokoll auf leicht verständliche Weise. Es gibt keine Änderung in Tensor selbst, daher ist es "log-y: [batch_num, 10]".
Und ich multipliziere es mit der Antwort Tensory_
, aber da y_
alle Nullen außer der Antwort enthält, wird beim Multiplizieren der Wert von index
außer der Antwort zu 0
.
Im multiplizierten Tensor ist "Form" "[batch_num, 10]", aber es ist möglicherweise einfacher zu verstehen, dass die tatsächliche Dimension "[batch_num, 1]" ist, da sie mit Ausnahme des Antwortteils "0" ist.
log-y = tf.log(y)
print log-y[0]
[ -1.06416254e+01 -2.04846172e+01 -8.92418385e+00 -5.71210337e+00
-1.47629070e+01 -1.18935766e+01 -1.92577553e+01 -3.63449310e-03
-1.08472376e+01 -8.88469982e+00]
y_times_log-y = y_*tf.log(y)
print y_times_log-y[0] #Es bleibt nur der Wert 7 übrig.
[-0. -0. -0. -0. -0. -0.
-0. -0.00181153 -0. -0. ]
tf.reduce_sum ()
addiert sich über alle Dimensionen und wird zu einemRank0
Tensor (Skalar) ohne das zweite Argument und die Option keep_dims = True
. Im Fall von MNIST ist dies die Summe aller Werte, die von "[batch_num]" gehalten werden.
Beispiel tf.reduce_sum()
# 'x' is [[1, 1, 1]
# [1, 1, 1]]
tf.reduce_sum(x) ==> 6
tf.reduce_sum(x, 0) ==> [2, 2, 2]
tf.reduce_sum(x, 1) ==> [3, 3]
tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]]
tf.reduce_sum(x, [0, 1]) ==> 6
------
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
print "cross_entropy:", cross_entropy #y_*tf.log(y)Die Gesamtzahl der Inhalte
cross_entropy 23026.0 #Zahlenwert nach dem ersten Lernen
.
.
.
cross_entropy: 3089.6 #Zahlenwert nach dem letzten Lernen
Dieser Artikel ist sehr hilfreich für die Kreuzentropie. Neuronales Netz und tiefes Lernen: - Kostenlose Online-Bücher - Kapitel 3 http://nnadl-ja.github.io/nnadl_site_ja/chap3.html Kurz gesagt, es ist ein Indikator dafür, wie viel Sie lernen. Es scheint, dass das Lernen erfolgreich ist, wenn Sie ** Gewicht ** und ** Voreingenommenheit ** optimieren, während Sie sich darauf beziehen. Es ist "tf.train.GradientDescentOptimizer ()", das tatsächlich optimiert, aber es gibt andere Möglichkeiten "Klasse tf.train.Optimizer", also macht es Spaß, einen Blick darauf zu werfen. Tensorflow/api_docs - Optimizers: https://www.tensorflow.org/versions/r0.7/api_docs/python/train.html#optimizers Wenn Sie zusätzlich ".minimize ()" aufrufen, werden die Gradientenberechnung und die Anwendung auf "tf.Variables" zusammen durchgeführt. Umgekehrt können Sie durch Aufrufen von ".compute_gradients ()" den Wert für die Aktualisierung des ** Gewichts ** "W" und des ** Bias ** "b" zum Zeitpunkt der Optimierung anzeigen, dh den Fehlerwert / Korrekturwert. tun können. Tatsächlich scheint es, dass es mit ± einer großen Zahl beginnt und konvergiert, während es zwischen den Orten hin und her geht.
Gradient_values
#Frühes Lernen
cross_entropy 23026.0
grad W[0] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
grad W[380] [ 511.78765869 59.3368187 -34.74549103 -163.8828125 -103.32589722
181.61528015 17.56824303 -60.38471603 -175.52197266 -232.44744873]
grad b [ 19.99900627 -135.00904846 -32.00152588 -9.99949074 18.00206184
107.99274445 41.992836 -27.99754715 26.00336075 -8.99738121]
#Letztes Lernen
cross_entropy 2870.42
grad W[0] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
grad W[380] [ 6.80800724 1.27235568 -6.85943699 -22.70822525 -17.48428154
13.11752224 19.7425499 -32.00106812 -41.48160553 79.59416199]
grad b [ 19.52701187 3.17797041 -20.07606125 -48.88145447 -28.05920601
37.52313232 40.22808456 -34.04494858 -74.16973114 104.77211761]
In Bezug auf das Gewicht "W" scheint das erste Pixel völlig ignoriert zu werden ... lol Ich denke, es ist besser, diese Zahlen der Maschine zu überlassen und langsam mit Tee zu trinken.
Eigentlich habe ich noch nicht realisiert, was ich tun möchte ... Ich war völlig fasziniert von der Tatsache, dass maschinelles Lernen den "Fertigungsgeist" super stimuliert. Je tiefer Ihr Verständnis ist, desto mehr Ideen werden Sie einbringen: "Lass uns das machen" und "Lass uns das machen". Es funktioniert nicht, aber es macht Spaß. Ich frage mich ... dieses nostalgische Gefühl. Als nächstes möchte ich die MNIST-Expertenausgabe des Tutorials erläutern. Ich möchte es allen empfehlen, die nicht wissen, wie man faltet und bündelt. Aktien, Tweets, Likes, Hass, Kommentare usw. sind alle ermutigend, also bitte.