Hallo und willkommen zu diesem Python-Tutorial.
Also gut, wir haben sehr aufregenden Boden vor uns.
Wir werden damit beginnen, die Architektur des neuronalen Netzwerks zu schaffen, das heißt, wir werden das
neuronale Netzwerk schaffen, das das Herzstück unserer KI sein wird und das die Action im Alter von 90 Jahren zurückbringen wird.
Also lass uns das tun.
Da wir wollen, dass unser neuronales Netzwerk objektiv ist, werden wir es zur Klasse machen.
Und das ist so, weil es viel bequemer ist.
Sie wissen, dass die Klasse das Modell von etwas ist, das wir bauen möchten.
Wir möchten ein neuronales Netzwerk aufbauen und müssen einige Anweisungen machen, die alle in der Klasse
enthalten sind.
Und in dieser Klasse machen wir zwei Funktionen.
Zuerst die Init-Funktion, welche die ganze Zeit während des Unterrichts auftritt.
Und das definiert im Wesentlichen die Variable Ihres Objekts, das das neuronale Netzwerk ist.
Sie kennen die an das Objekt angehängten Variablen im Gegensatz zu den globalen Variablen.
Dies ist also in dieser Funktion, die die Architektur des neuen Netzwerks definiert, das Sie
kennen, indem Sie die Eingabeschicht definieren, die aus fünf Eingangsneuronen besteht, da wir fünf Dimensionen für den
kodierten Vektor der Eingangszustände haben.
Dann definieren wir einige verborgene Ebenen.
Möglicherweise beginnen Sie mit einer verborgenen Schicht, und Sie können dann andere Architekturen des neuronalen
Netzwerks ausprobieren.
Und dann erhalten wir natürlich die Ausgabeebene, die die möglichen Aktionen enthält, die
wir jederzeit ausführen können.
Genau das machen wir also in dieser Funktion.
Und dann werden wir noch eine weitere Funktion innerhalb der Klasse erstellen, die die
Vorwärtsfunktion ist und die die Neuronen im neuronalen Netzwerk aktivieren wird.
Sie wissen, dass dies die Signale aktivieren wird. Daher verwenden wir eine gleichgerichtete Aktivierungsfunktion,
da es sich natürlich um ein rein nichtlineares Problem handelt und diese korrigierte Funktion die Linearität bricht.
Meistens machen wir diese Ford-Funktion jedoch, um die q-Werte zurückzugeben, die die Ausgänge des Netzwerks sind.
Wir haben jedoch einen Schlüsselwert für jede Aktion.
Später werden wir die endgültige Aktion zurückgeben, indem wir entweder das Maximum der Schlüsselwerte verwenden oder eine
weiche Max-Methode verwenden.
Das werden wir später sehen.
In diesem Tutorial beginnen wir mit der Implementierung der init-Funktion, und als
nächstes wird die forward-Funktion implementiert.
Also lass uns das tun.
Zuerst müssen wir unsere Klasse vorstellen.
Wir beginnen mit dem Unterricht und geben unserer Klasse einen Namen, in dem wir es Netzwerk nennen können.
Und dann werde ich in dieser Netzwerkklasse eine Objektprogrammiertechnik verwenden, die Vererbung genannt wird
und nur von allen Werkzeugen einer übergeordneten Klasse erben soll.
Unsere Netzwerkklasse, die wir gerade erstellen, ist also ein untergeordneter Test einer größeren Klasse.
Und das Modul.
Das ist also nur ein Erben von allen Werkzeugen dieser Modulklasse, die natürlich die Werkzeuge zum Implementieren eines
neuronalen Netzwerks sind.
Das ist also ein sehr mächtiger und evolutionärer Trick in der objektorientierten Programmierung.
Und jetzt erben wir von dieser übergeordneten Modulklasse.
Alles klar und jetzt können wir in die Klasse gehen.
Ich drücke also zweimal die Eingabetaste, weil wir zwei Funktionen erstellen und mit der
Endefunktion beginnen.
Also die init-Funktion müssen wir so mit zwei auf diesem Kurs dann so benennen.
Und dann nochmal zu unterstreichen, das ist nur Python-Syntax. Genau so müssen wir es tun.
Und dann müssen wir die Argumente darlegen.
Wir haben also drei Argumente.
Der erste ist ein obligatorisches Argument, das eigentlich Selbst und Selbst ist.
Es gibt kein Mysterium, das sich auf das Objekt bezieht, das aus dieser Klasse erstellt wird, die wir gerade
erstellen.
Sie wissen, dass wir diese Klasse machen.
Es ist wie eine Anleitung eines Modells dieses neuronalen Netzwerks, das wir bauen wollen.
Und wenn die Klasse fertig ist, können wir mit Netzwerken so viele machen, wie wir möchten.
Und jedes dieser neuen Netzwerke wird ein Objekt dieser Klasse sein, und da wir
das Objekt für andere Zwecke verwenden werden, müssen wir nur die Variablen des Objekts und
für Spudis verwenden beziehen sich auf das Objekt.
Wann immer ich verfügbar von meinem Objekt verwenden möchte, werde ich vor der Variablen selbst verwenden, um anzugeben,
dass dies eine Variable des Objekts ist.
In Ordnung, das ist also das erste Argument und dann haben wir zwei
weitere Argumente, die natürlich die Anzahl der Eingangsneuronen und die Anzahl der Ausgangsneuronen sind.
Die Anzahl der Eingabe-Neuronen nennen wir Eingangsgröße, und das sind eigentlich fünf, da unsere
Eingangsvektoren fünf Dimensionen zu drei Signalen plus Orientierung plus Minus-Orientierung haben, Vektoren von
codierten Werten, die einen Zustand der Umgebung beschreiben.
Diese fünf Werte reichen aus, um den Zustand der Umgebung zu beschreiben.
Wir hätten uns weniger Werte oder mehr Werte vorstellen können, aber ich habe es versucht und es macht
tatsächlich Sinn, weil wir tatsächlich ein Signal von links vor uns und eines rechts benötigen.
Weißt du, wenn wir ein Auto fahren, hätten wir uns für ein 360-Signal entschieden, das du kennst, wie
die Signale an der Spitze der Google-Autos, dass wir mit drei Sensoren völlig selbst fahren können. Dann haben wir diese Orientierung und
diese negative Orientierung für dich wissen, halten Sie das Ziel fest, das Sie erreichen wollten.
Und dann haben wir natürlich die Ausgabeneuronen unseres Netzwerks, die den Aktionen entsprechen, und wir haben drei
mögliche Aktionen, die nach links oder nach rechts gehen.
Und deshalb werde ich es und die Aktion nennen und es werden drei davon sein.
Gut.
Bisher müssen wir nur die Eingänge benennen und dann diese Volleyball verwenden, um die Bedingungen innerhalb des neuronalen
Netzwerks zu erfüllen.
Also gut, und Sie beginnen mit einem anderen Fackel-Trick. Dieser Trick ist eine Superfunktion,
eine Funktion, die tatsächlich vom Modul erbt.
Deshalb mussten wir das Modul auch mit Vererbung erben.
Dies ist das erste, das verwendet wird.
Im Grunde verwenden wir diese Super-Trick-Superfunktion nur, um die Werkzeuge des Moduls verwenden zu können, die
wesentlich effizienter sind.
Und innerhalb der Superfunktion muss ich nur das Netzwerk angeben.
Das ist also unsere Netzwerk-Chul-Klasse, die Sie kennen, da diese von der übergeordneten Modulklasse und
dann unserem Objekt erbt.
Und dann füge ich das nur hinzu und habe eine Funktion wie diese, wie wir es nannten.
Also gut, das ist nur ein Trick, bei dem ich alle meine Werkzeuge benutzen muss.
In diesem Modul können wir dann zum nächsten Schritt übergehen, der die Eingabeebene angibt.
Im Grunde muss ich also eine neue Variable einführen, die an das Objekt angehängt wird.
Diese Variable enthält die Anzahl der Eingabe-Neuronen.
Nicht mit der Eingabegröße zu verwechseln. Die Eingabegröße ist das Argument der Endefunktion.
Dies ist jedoch nicht die an das Objekt angehängte Variable, sondern die an das Objekt
angehängte Variable.
Nun, wie ich gerade erwähnte, müssen wir angeben, dass es stattdessen an das Objekt angehängt ist, also verwenden
wir einen Autodidakt und geben dieser ersten an das Objekt angehängten Variablen einen Namen.
Und so können wir einfach den gleichen Namen wie die Eingabe angeben.
Wir können es Eingabegröße nennen und wir werden sagen, dass es den Argumenten einer Funktion entspricht, die Eingabegröße ist.
Gut.
Jedes Mal, wenn ich ein Objekt aus der Netzwerkklasse erstelle, wird die Eingabegröße
angegeben, z.
Hier wird es 5 sein, und daher wird die Eingangsgrößenvariable unseres Objekts den Wert
5 haben, da diese Eingangsgröße hier 5 ist und unser neues Netzwerk daher 5 Eingangsneuronen in
der Eingabeebene hat.
Gut.
Und das ist auch für die andere Variable, die wir an Objekte anhängen möchten, dasselbe.
Und wie Sie vielleicht schon vermutet haben, wird dies eine Variable für die Anzahl der Ausgangsneuronen sein.
Zu sagen, wir nehmen unser Objekt selbst und geben dieser zweiten Variablen des Objekts, das wir es
nennen, und der Aktion einen Namen.
Und dies wird diesem Argument hier gleich sein, wenn man die Anzahl der Aktionen, also die Anzahl der
Ausgangsneuronen, berücksichtigt.
Wir setzen es also der tatsächlichen Aktion gleich und die Aktion wird gleich drei sein.
Daher erhalten die Variable und die Aktion, die unser Objekt einem Netzwerk angehängt, den Wert drei.
Eigentlich sehen wir hier eine Warnung, die den Namen undefiniert nennt.
Und das ist gut so, weil wir hier die verwenden.
Und dann eine Verknüpfung.
Und wir müssen hier eine Abkürzung verwenden.
Und für unsere Fackel fangen wir in Mudgal an und dann wird es verschwinden.
Auf geht's.
Perfekt.
Im Moment haben wir neue Warnungen. Alle Warnungen hier sollen nur angeben, dass das, was wir importieren, noch nicht
verwendet wird.
Das ist in Ordnung, wir werden sie später verwenden.
In Ordnung, dann haben wir zwei weitere Variablen, die wir für das Objekt definieren wollen.
Und dies wird die volle Verbindung sein, die volle Verbindung zwischen den verschiedenen Schichten unseres
neuronalen Netzwerks.
Da wir jetzt ein neuronales Netzwerk schaffen wollen, das aus nur einem Kopf in ihrer Welt besteht,
gibt es zwei vollständige Verbindungen.
Es gibt eine erste vollständige Verbindung zwischen der Eingabeebene und der verborgenen Ebene.
Und eine Sekunde volle Verbindung zwischen dem Hügel und der Ausgabeschicht.
Beginnen wir also mit der ersten vollständigen Verbindung.
Wir werden es SE1 nennen. Und wieder benutze ich selbst, um anzugeben, dass FC eins eine Variable meines Objekts ist, um das zu
lösen.
FC einer, der gleich sein wird.
Und jetzt verwenden wir das N in-Modul, und wir werden eine Funktion namens lineares R verwenden. Das ist genau das,
um diese vollständige Verbindung zwischen den Neuronen und der Eingabeschicht mit den Neuronen der dort verborgenen Nerven herzustellen.
Und was meine ich mit voller Verbindung?
Das bedeutet, dass alle Neuronen der Eingabeschicht mit allen Neuronen des Hierin verbunden
sind.
Um diese Verbindung herzustellen, verwenden wir diese lineare Funktion, auf die wir einige Argumente setzen müssen.
Und wie Sie sehen, sind diese Argumente in Features.
Das ist also die Anzahl der Neuronen des ersten Gesetzes, die Sie verbinden möchten. Dabei handelt es sich um die Anzahl
der Neuronen der zweiten Schicht, die Sie verbinden möchten. Dies ist die Schicht auf der rechten Seite,
die die verborgene Schicht und das Fahrrad ist.
Für das Fahrrad gilt also, dass wir den Standardwert beibehalten, um einen Vorurteil zu haben, und nicht nur etwas Gewicht, das mit
dem Lauf zu tun hat, wir müssen warten und einen Vorrang für jede Schicht.
Und so wollen wir mal sehen, was wir eingeben müssen.
Das erste Argument in Features ist also die Anzahl der Eingabe-Neuronen in der Eingabeebene.
Und wo ist es dann?
Nun, das ist eigentlich ungenau.
Das ist das Argument unserer init-Funktion, mit der wir später die drei Signale und die
Mannus-Orientierung bekämpfen können.
Auf geht's.
Wenn die ersten Argumente und Put-Größe und dann das zweite Argument aus sind, ist dies die Anzahl der Neuronen, die wir
in der zweiten Schicht haben möchten.
Die zweite Schicht, die vollständig mit der ersten Schicht verbunden ist.
Die Frage ist also, wie viele Neuronen wir in dieser verborgenen Schicht haben wollen.
Nun, ich habe viel Parameter trainiert.
Ich habe viel experimentiert.
Das ist es, was wir tun, oder das tun wir tiefer.
Im Allgemeinen experimentieren wir viel, um herauszufinden, welches das beste neuronale Netzwerk für unser spezielles
Problem wäre.
Ich versuche also viele Werte und habe letztendlich 30 30 Läufe in einer verborgenen Schicht gewählt. Sie werden sehen, dass wir
mit dieser Zahl ziemlich gute Ergebnisse erzielen werden, aber dann die Architektur des neuronalen Netzwerks
ändern können.
Fühlen Sie sich frei, damit zu spielen.
Sie können nicht nur die Anzahl der Neuronen im Hier und Da ändern, sondern Sie können auch weitere
Schichten hinzufügen, so dass Sie vielleicht ein noch besseres Auto bekommen, aber 30 Hinna-Neuronen erhalten ein gutes neuronales Netzwerk und
eine gute Sache.
Das ist es, was wir wollen.
Und da gehen wir hin.
Wir haben unsere erste volle Verbindung wirklich mit dieser linearen Funktion.
Wir stellen die Verbindung zwischen der Eingabeebene und dem verborgenen Bein her.
Und nun ist es Zeit, die zweite vollständige Verbindung herzustellen, bei der es sich um die vollständige Verbindung zwischen der verborgenen
Schicht und der Ausgabeebene handelt.
Also los geht's.
Wir werden diese zweite vollständige Verbindung bei C2 anrufen.
Da gehen wir.
Und dies ist immer noch für mehr Objekte verfügbar, die Saphir verwenden.
Und dann benutzen wir wieder.
Tatsächlich können wir dies kopieren, da wir das N in-Modul und dann die lineare Funktion verwenden werden.
Dann müssen wir natürlich zuerst die Argumente ändern.
Das Gleiche ist zunächst die Anzahl der Neuronen, die wir in der ersten Schicht der Verbindung haben werden.
Das ist also das versteckte dort.
Das ist also 30 und das zweite Argument ist die Anzahl der Neuronen in der zweiten Schicht der
Verbindung, und dies entspricht der Ausgabeschicht und der Ausgabe, die dort vorliegt.
Und die eigentlichen Neuronen werden später drei sein, weil wir drei mögliche Aktionen haben, aber bisher müssen wir die
Namen verwenden, die wir definiert haben.
Das ist der Name des Arguments der init-Funktion und deshalb geben wir hier und die Aktion ein und
los geht's.
Vor allem unsere Tupel-Verbindungen.
Und zweitens ist jede Funktion Israel.
Deshalb initialisieren wir unser Objekt immer dann, wenn wir ein Objekt aus der Netzwerkklasse erstellen.
Sobald wir also ein Objekt erstellt haben, geben Sie hier alle diese Variablen ein. Geben Sie Größe und Reaktion ein.
Sie und zwei werden definiert.
Und so erhalten wir die Architektur unseres Tiernetzwerks für jedes Objekt, das wir erstellen.
Jedes Objekt entspricht einem neuronalen Netzwerk mit fünf eingegebenen Neuronen, 30 verborgenen Neuronen und drei
Ausgangsneuronen.
Also los geht's.
Wir sind mit dieser ersten Funktion fertig und können nun zu
der zweiten Funktion übergehen, der Vorwärtsfunktion, mit der die Neuronen im neuronalen Netzwerk mit
der Gleichrichteraktivierungsfunktion aktiviert werden und meistens zu den Cube-Werten zurückkehren die Ausgänge nur eines Netzwerks.
Ich kann es also kaum erwarten, das im nächsten Tutorial zu tun und bis dahin ich.