Ich kam zum ersten Mal mit Deep Learning in Kontakt, als ich in meinem dritten Jahr der Grundschule war, und es scheint, dass es in meinen Grundschulklassen nur wenige Vorlesungen über Deep Learning gab. Es gibt viele Dinge, die ich selbst im Bereich Deep Learning erforscht habe, aber ich habe die Schritte aufgegriffen, die ich unternommen habe, um die interne Struktur des Deep Learning zu verstehen und umzusetzen, und sie in meinem Blog veröffentlicht. Zieh es an. Außerdem schreibe ich zum ersten Mal einen Blog und es ist ein Übungsartikel, daher scheint es schwierig zu sein, ihn zu lesen. Bitte entschuldigen Sie.
Zunächst werde ich erklären, was Deep Learning vor der Implementierung bewirkt. Deep Learning ist kurz gesagt Funktionsoptimierung. Wenn Sie eine Funktion optimieren, die ein Bild als Eingabe verwendet und die Wahrscheinlichkeit angibt, dass es sich bei dem Bild um eine Katze handelt, wird es zu einem Klassifikator, der das Bild in Katzen und andere klassifiziert, und zu einer Funktion, die $ x $ als Eingabe verwendet und $ sin (x) $ ausgibt. Wenn Sie optimieren, spricht man von einem Regressionsmodell. Zunächst werden wir eine Regression implementieren, um zu erkennen, dass Deep Learning eine Funktionsoptimierung ist.
Wenn Sie einen PC und eine Internetumgebung haben, haben Sie alles, was Sie für tiefes Lernen benötigen. Wenn Sie das von Google bereitgestellte Google Colaboratory verwenden, verfügen Sie über alle erforderlichen Bibliotheken. Verwenden Sie diese (es ist zu einer praktischen Welt geworden). Google Cola Boratory kann durch Drücken einer neuen Schaltfläche von Google Drive aus anderen ausgewählt werden. Beim Öffnen wird das Jupiter-Notizbuch geöffnet und sofort eine interaktive Umgebung konfiguriert.
Ich denke, es ist einfacher zu verstehen, wenn Sie darüber diskutieren, während Sie sich ansehen, was es implementiert und funktioniert. Implementieren Sie also zuerst das Regressionsmodell. Fügen wir zunächst den folgenden Code ein.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,20,0.1)
y = np.sin(x)
plt.plot(x,y)
Wenn ich das mache, denke ich, wird die Sinuskurve als Grafik angezeigt. Dies ist die Bibliothek, mit der matplotlib Tabellen gezeichnet hat, und ich werde diese Bibliothek von nun an häufig verwenden. Bis zu diesem Zeitpunkt wurden Trainingsdaten generiert. Reelle Zahlen von 0 bis 20 in Schritten von 0,1 und ihre Sünden.
Definieren Sie als Nächstes das Modell.
from keras import layers
from keras import models
from keras import optimizers
model = models.Sequential()
model.add(layers.Dense(256,activation = "relu",input_shape=(1,)))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(256,activation = "relu"))
model.add(layers.Dense(1))
model.compile(loss = "mse",optimizer="adam")
Hier habe ich aus der Keras-Bibliothek importiert, was ich brauchte. Das Modell zeigt, wie diesmal eine Funktion erstellt wird, und obwohl es verschiedene Möglichkeiten gibt, sie zu beschreiben, wird Sequential () auf leicht verständliche Weise verwendet. Sie können hier sehen, dass wir dem Modell viele Ebenen hinzufügen. Dieses Mal verwende ich viele Ebenen. Dichte, aber ich werde erklären, was das ist.
Wie Sie in der Unterüberschrift sehen können, empfängt Layers.Dense den Vektor in der vollständig verbundenen Ebene und gibt den Vektor zurück. Ich denke, es gibt viele Dinge, die 256 als Argument nehmen, aber so viele Dimensionen sollte die Ausgabe haben. Beispielsweise ist die Eingabe n-dimensionales x, die Ausgabe ist m-dimensionales y und die vollständig verbundene Schicht wird durch die folgende Gleichung ausgedrückt.
y = Ax+b
Dabei ist A eine n * m-Matrix und b ein m-dimensionaler Vektor. Woher kommt diese Matrix und dieser Vektor? Wir haben sie alle als Variablen und optimieren sie später. Mit anderen Worten, dies ermöglicht es, jede lineare Transformation zu reproduzieren.
Es stellt sich heraus, dass das obige Modell versucht, $ y $ durch mehrmaliges Anwenden linearer Transformationen zu erhalten, aber mehrere lineare Transformationen können mit einer linearen Transformation reproduziert werden. In diesem Fall ist es sinnlos, viele vollständig verbundene Schichten zu stapeln. Was dabei herauskommt, ist eine Aktivierungsfunktion, die eine nichtlineare Abbildung ist. Es führt eine nichtlineare Abbildung auf alle Werte des Vektors durch. Indem dies zwischen den vollständig verbundenen Ebenen gebissen wird, erhöht sich die Ausdrucksfähigkeit des gesamten Modells, wenn die Ebenen gestapelt werden. Der gesamte Code verwendet Relu. Dies ist $ max (0, x) $, was sicherlich nicht linear ist. Dieses Relu wird häufig im Bereich des tiefen Lernens verwendet.
Eine große Anzahl interner Variablen ($ A und b $) wird verwendet, um beliebige lineare Transformationen in der vollständig verbundenen Schicht darzustellen. Wie diese optimiert werden, wird in model.compile beschrieben. Verlust ist ein Index, dessen Wert kleiner wird, wenn er optimal wird, und diesmal verwenden wir mse (mittlerer quadratischer Fehler). Das heißt, es ist das Quadrat der Differenz zwischen dem vorhergesagten Wert und dem korrekten Wert. Parameter können nicht einfach durch Berechnung des Verlusts des aktuellen Modells optimiert werden. Sie müssen berechnen, um wie viel Sie die Parameter in welche Richtung bewegen sollten, um den Verlust zu verringern. Grundsätzlich reicht es aus, den Gradienten des Parameters zu senken, aber unter dem Gesichtspunkt der Stabilisierung und Beschleunigung ist Adam, der die quadratische Differenzierung und den Gradienten im vorherigen Schritt anstelle des einfachen Gradienten verwendet, für tiefes Lernen ziemlich optimal. Es wird gesagt, dass es gut für die Konvertierung ist.
Lass uns tatsächlich trainieren.
hist=model.fit(x,y,steps_per_epoch=10,epochs = 10)
Im Training sind die Trainingsdaten oft sehr groß, so dass es oft nicht möglich ist, den Gradienten mit allen Trainingsdaten in einem Lernprozess zu senken (Parameteranpassung), sodass ein Stapel mit kleineren Trainingsdaten verwendet wird. Dieses Mal werden die gesamten Trainingsdaten in 10 geteilt (setps_per_epoch = 10). Mit anderen Worten, 2, die 10-mal den Gradienten von diesen Daten heruntergehen, sind eine Epoche (entsprechend der Häufigkeit, mit der die gesamten Trainingsdaten in der Lerneinheit geleckt wurden), und diesmal das Training, um die gesamten Trainingsdaten 10-mal zu lecken Ich lasse dich.
Lassen Sie uns vorhersagen.
test_x = x + 0.05
acc_y = np.sin(test_x)
pre_y = model.predict(test_x)
plt.plot(test_x,acc_y)
plt.plot(test_x,pre_y)
plt.show()
Auf diese Weise erhalten Sie eine Vorstellung davon, wie stark sich das Modell für Daten, die in x-Richtung um 0,05 von den Trainingsdaten abweichen, wie sin (x) verhält. Wenn Sie es so bewegen, wie es ist, sieht es so aus.
Der Wert ist bei $ x> 10 $ weit entfernt.
Indem Sie das Modell selbst verbessern und mehr trainieren, können Sie es wie unten gezeigt verbessern. Probieren Sie es also aus.
GPU Wenn Sie ein Modell benötigen, dessen Erlernen lange dauert, oder wenn Sie eine lange Einarbeitungszeit benötigen, gehen Sie zu Bearbeiten-> Notebook-Einstellungen und ändern Sie den Hardwarebeschleuniger in Google Colaboratory von Keine auf GPU. Das Training sollte früh mit der Leistung der GPU enden.
Diesmal wurde die Sinuskurve nur durch lineare Transformation und Relu ausgedrückt. Zusätzlich zur Sinuskurve kann Deep Learning beliebige Funktionen von der Bilderkennung bis zur Bilderzeugung approximieren, sodass die Möglichkeiten endlos sind. Das nächste Mal möchte ich die Faltungsschicht erklären, indem ich die Bilderkennung und die solide, aber mnistische handschriftliche Zeichenerkennung in einer möglichst kurzen Zeile implementiere.
Recommended Posts