[PYTHON] Ich bin weder Programmierer noch Datenwissenschaftler, aber ich habe Tensorflow einen Monat lang berührt, daher ist es sehr einfach zu verstehen.

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.

1: Was macht Deep Learning überhaupt?

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 Non-Linear-Regression.gif

K-Means-Clustering-Gif.gif Ich möchte ein geeignetes "Gesicht" aus einer Reihe von Pixeln kennen Screen Shot 2016-03-06 at 4.44.13 PM.png 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.

2: Wählen Sie ein Framework - die guten Dinge über Tensorflow

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?

Liste der Blogs, die ich gelesen habe

-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

3: Hallo, World! MNIST Anfängerausgabe

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 Python example
0 Skalar (nur tatsächliche Menge) s = 483
1 Vektor (Menge und Richtung) v = [1.1, 2.2, 3.3]
2 Matrix (gemeinsame Tabelle) m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3 3-Tensor (dreidimensional) t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]
n n-Tensor (n-dimensional) ....

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.

Siehe diese Tensoren in MNIST

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].

** Nebenbei: Über die Anzahl der Abmessungen des Bildes **

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. mnist.jpg 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000.6.7.7.50000000000.81111111.9.30000000.4.4.4.7111000000000000.1.10000000000000000000000000000000000000000000000000000000000 mnist1.jpg 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

4: Tensorflow-Verarbeitung: --Was Sie im Anfänger-Tutorial tun

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 **.

Matrixbetrieb

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]". Matrix_multiplication_diagram_2.png 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 **.

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.

Die Rolle der Gewichte

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 **. mnist.jpg 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.

vorspannen

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? graph.jpg 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.

Softmax-Funktion - passende Antworten -

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
  • Hinzugefügt am 19.05.2016 Die Softmax-Funktion ist eine Funktion, die eine Menge beliebiger reeller Werte in "Bereich (0, 1)" zerlegt. Zuerst habe ich es als Softmax-Regression geschrieben, aber um genau zu sein, wird es "logistische Regression" genannt, weil es eine Regression der Wahrscheinlichkeit durchführt. Softmax ist eine Funktion, die die Ausgabe zurückgibt, wenn Sie sie eingeben. Da MNIST ein Problem bei der Klassifizierung von Bildern als eine Reihe von Verarbeitungen darstellt, "Ich möchte die Wahrscheinlichkeit jedes Etiketts für dieses Bild wissen" → "Logistische Regression (Softmax)" → "Die Antwort ist die mit der höchsten Wahrscheinlichkeit (Argmax)". Daher werden Sie softmax wahrscheinlich nicht für die Regressionsanalyse verwenden, bei der Sie reelle Zahlen finden möchten.

5: Wann lernst du?

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.

6: Nächstes Mal werde ich die Experten im Detail erklären!

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.

  • Hinzugefügt 2016.3.29 Ich habe einen Kommentar für die Expertenausgabe geschrieben.

Recommended Posts

Ich bin weder Programmierer noch Datenwissenschaftler, aber ich habe Tensorflow einen Monat lang berührt, daher ist es sehr einfach zu verstehen.
Ich bin ein Windows-Benutzer, möchte aber Tensorflow ausführen