[PYTHON] Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)

Einführung

Dieser Artikel ist eine Fortsetzung von Maschinelles Lernen ④ Implementierung eines neuronalen Netzwerks (nur NumPy). In diesem Artikel wird die Implementierung eines neuronalen Netzwerks nur mit NumPy beschrieben. Einige Teile des unten stehenden Links überschneiden sich nicht mit der Erklärung. Bitte lesen Sie sie auch. Maschinelles Lernen ① Grundlagen der Perceptron-Grundlagen Maschinelles Lernen ② Perceptron-Aktivierungsfunktion Maschinelles Lernen ③ Einführung und Implementierung der Aktivierungsfunktion Maschinelles Lernen ④ Implementierung eines neuronalen Netzwerks (nur NumPy)

Referenz

Referenzen: O'REILLY JAPAN Deep Learning von Grund auf neu Bisherige Artikel: Maschinelles Lernen ① Grundlagen der Perceptron-Grundlagen Maschinelles Lernen ② Perceptron-Aktivierungsfunktion Maschinelles Lernen ③ Einführung und Implementierung der Aktivierungsfunktion Maschinelles Lernen ④ Implementierung eines neuronalen Netzwerks (nur NumPy)

Implementierung eines 3-Schicht-Neuronalen Netzwerks

Dieses Mal soll ein neuronales Netz implementiert werden

Abbildung 5-1

3層ニューラルネットワーク.jpg

Die obige Abbildung zeigt das in diesem Artikel aufgebaute neuronale Netzwerk. Wir werden es in jede Ebene aufteilen und in der richtigen Reihenfolge erstellen.

Implementierung

Abbildung 5-2

入力層→1層目.jpg Lassen Sie uns $ (1) a1 $ mit einer Formel ausdrücken. Sie kann aus der Summe von Voreingenommenheit und Gewicht abgeleitet werden.

Gleichung 5-1

aa


(1)a1 = (1)w1,1\,\,x1 + (1)w1,2\,\,x2+b1

Wie beim letzten Mal kann die "gewichtete Summe" der ersten Schicht gemeinsam nach der folgenden Formel berechnet werden.

aa


(1)A=X\,\,(1)W+(1)B

Das ist,

Gleichung 5-2
A=
\begin{pmatrix}\,\,
(1)a1 & (1)a2 & (1)a3\,\,
\end{pmatrix}

X=
\begin{pmatrix}\,\,
x1 & x2\,\,
\end{pmatrix}

B=
\begin{pmatrix}\,\,
b1 & b2 & b3\,\,
\end{pmatrix}

W=
\begin{pmatrix}
\,\, (1)w1,1 & (1)w1,2 & (1)w1,3 \,\, \\
\,\, (1)w2,1 & (1)w2,2 & (1)w2,3 \,\,
\end{pmatrix}

Basierend auf den obigen Informationen möchte ich den obigen Ausdruck mit dem NumPy-Array von Python ausführen. Für das Gewicht und die Abweichung werden Hypothekenwerte eingegeben.

5-1ThreeLayer_NeuralNetwork.py


import numpy as np
def sigmoid_function(x):

    return 1 / (1 + np.exp(-x))

X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
A1 = np.dot(X, W1) + B1
print(A1)

Ausführungsergebnis


[0.3 0.7 1.1]

Erläuterungen zum Programm finden Sie unter Maschinelles Lernen ③ Einführung / Implementierung der Aktivierungsfunktion.

Angenommen, Sie übernehmen als nächstes die Sigmoid-Funktion als Aktivierungsfunktion. Dann kann gesagt werden, dass es wie folgt wird.

Abbildung 5-3

活性化関数の実装.jpg

5-2ThreeLayer_NeuralNetwork_activation_function.py


import numpy as np
def sigmoid_function(x):

    return 1 / (1 + np.exp(-x))

X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
A1 = np.dot(X, W1) + B1

#Anpassung der Sigmoidfunktion
Z1 = sigmoid_function(A1)

print(A1)
print(Z1)

Ausführungsergebnis


[0.3 0.7 1.1]
[0.57444252 0.66818777 0.75026011]

Es kann bestätigt werden, dass es im Bereich von 0-1 liegt, wie im vorherigen Maschinelles Lernen ③ Einführung / Implementierung der Aktivierungsfunktion beschrieben. Mit diesem Impuls werden wir von der 1. Schicht zur 2. Schicht implementieren.

5-3ThreeLayer_NeuralNetwork_cmp.py


import numpy as np
def sigmoid_function(x):

    return 1 / (1 + np.exp(-x))
#Eingegebener Wert
X = np.array([1.0, 0.5])
#Gewicht der ersten Schicht (numerischer Wert ist angemessen)
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
#Gewicht der zweiten Schicht (numerischer Wert ist angemessen)
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
#Vorspannung der ersten Schicht
B1 = np.array([0.1, 0.2, 0.3])
#Vorspannung der zweiten Schicht
B2 = np.array([0.1, 0.2])

A1 = np.dot(X, W1) + B1

#Anpassung der Sigmoidfunktion
Z1 = sigmoid_function(A1)

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid_function(A2)


print(A1)
print(Z1)
print(A2)
print(Z2)

Ausführungsergebnis


[0.3 0.7 1.1]
[0.57444252 0.66818777 0.75026011]
[0.51615984 1.21402696]
[0.62624937 0.7710107 ]

Ich habe es schnell geschrieben, aber wenn Sie Fragen haben, kommentieren Sie bitte. ..

Über die Aktivierungsfunktion der Ausgabeschicht (Ausgabeknoten)

Es scheint, dass die Aktivierungsfunktion der Ausgabeschicht (Ausgabeknoten) im Allgemeinen durch den Prozess geteilt wird, den Sie durch maschinelles Lernen lösen möchten. Der Autor schreibt diesen Artikel derzeit als Rezension, aber ich werde später auf das Design der Ausgabeebene eingehen. Lassen Sie mich nun einfach schreiben, dass das Ergebnis der Ausgabeebene durch das tatsächlich gewünschte Ergebnis ersetzt werden kann, und es ist üblich, die Aktivierungsfunktion aus einer anderen Richtung als die verborgene Ebene entsprechend auszuwählen. ..

Um zwischen der Aktivierungsfunktion der verborgenen Schicht und der Aktivierungsfunktion der Ausgabeschicht zu unterscheiden, platzieren Sie die Aktivierungsfunktion der Ausgabeschicht als $ σ () $. (Geben Sie in der Aktivierungsfunktion der verborgenen Ebene $ h () $ ein.) Da diesmal der Zweck darin besteht, $ σ () $ und $ h () $ explizit zu unterscheiden, wird für $ σ () $ eine gleiche Funktion (eine Funktion, die den Eingabewert so ausgibt, wie er ist) übernommen. Der obige Inhalt ist dargestellt.

Abbildung 5-3

出力層について.jpg

Definieren und implementieren Sie diesmal `` `identity_function``` in $ σ () $.

5-4NeuralNetwork_identityf.py


import numpy as np
def sigmoid_function(x):

    return 1 / (1 + np.exp(-x))

def identity_function(x):
    return x

#Eingegebener Wert
X = np.array([1.0, 0.5])

#Gewicht der ersten Schicht (numerischer Wert ist angemessen)
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])

#Gewicht der zweiten Schicht (numerischer Wert ist angemessen)
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])

#Gewicht der dritten Schicht (numerischer Wert ist angemessen)
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])

#Vorspannung der ersten Schicht
B1 = np.array([0.1, 0.2, 0.3])

#Vorspannung der zweiten Schicht
B2 = np.array([0.1, 0.2])

#Vorspannung der dritten Schicht
B3 = np.array([0.1, 0.2])

A1 = np.dot(X, W1) + B1

#Anpassung der Sigmoidfunktion
Z1 = sigmoid_function(A1)

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid_function(A2)

A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3)
print(A1)
print(Z1)
print(A2)
print(Z2)
print(A3)
print(Y)

Ausführungsergebnis


[0.3 0.7 1.1]
[0.57444252 0.66818777 0.75026011]
[0.51615984 1.21402696]
[0.62624937 0.7710107 ]
[0.31682708 0.69627909]
[0.31682708 0.69627909]

Sie können sehen, dass die Ausgabe funktioniert. Die letzten beiden Ausgänge haben denselben Wert, da sie eine Gleichheitsfunktion verwenden.

Organisieren Sie das Implementierungsprogramm auf nette Weise

Da es sich um ein zusätzliches Programm handelte, werde ich es am Ende zusammenfassen. (Der Verarbeitungsinhalt ändert sich nicht.)

5-4NeuralNetwork_identityf.py


import numpy as np
def sigmoid_function(x):

    return 1 / (1 + np.exp(-x))

def identity_function(x):
    return x


def init_data():
    data = {}
    #Gewicht der ersten Schicht (numerischer Wert ist angemessen)
    data['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])

    #Gewicht der zweiten Schicht (numerischer Wert ist angemessen)
    data['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])

    #Gewicht der dritten Schicht (numerischer Wert ist angemessen)
    data['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])

    #Vorspannung der ersten Schicht
    data['B1'] = np.array([0.1, 0.2, 0.3])

    #Vorspannung der zweiten Schicht
    data['B2'] = np.array([0.1, 0.2])

    #Vorspannung der dritten Schicht
    data['B3'] = np.array([0.1, 0.2])

    return data

def run(data,x):
    W1, W2, W3 = data['W1'], data['W2'], data['W3']
    B1, B2, B3 = data['B1'], data['B2'], data['B3']
    
    A1 = np.dot(X, W1) + B1
    Z1 = sigmoid_function(A1)

    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid_function(A2)

    A3 = np.dot(Z2, W3) + B3
    Y = identity_function(A3)

    return Y

NN_data = init_data()
#Eingegebener Wert
X = np.array([1.0, 0.5])
Y = run(NN_data, X)
print(Y)

Zusammenfassung

Wir haben tatsächlich ein dreischichtiges neuronales Netzwerk aufgebaut. Ich möchte es für zukünftiges Lernen basierend auf dieser Konstruktionsmethode entwickeln.

Recommended Posts

Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)
Implementierung eines zweischichtigen neuronalen Netzwerks 2
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
Rank Learning über ein neuronales Netzwerk (RankNet-Implementierung von Chainer)
Implementierung von "verschwommenen" neuronalen Netzen mit Chainer
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Bayesianische Optimierungsimplementierung von Hyperparametern des neuronalen Netzwerks (Chainer + GPyOpt)
Implementierung eines neuronalen Netzwerks in Python
Implementierung eines Faltungs-Neuronalen Netzwerks mit nur Numpy
Implementierung eines neuronalen Netzwerks (nur NumPy)
Tiefes Lernen der Verstärkung 2 Implementierung des Lernens der Verstärkung
Einfache Implementierung eines neuronalen Netzwerks mit Chainer
PRML Kapitel 5 Python-Implementierung für neuronale Netze
Einfache Theorie und Implementierung des neuronalen Netzes
Berühren Sie das Objekt des neuronalen Netzes
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Qiskit: Implementierung von Quantum Circuit Learning (QCL)
Algorithmus für maschinelles Lernen (Implementierung einer Klassifizierung mit mehreren Klassen)
Einfache Implementierung eines neuronalen Netzwerks mithilfe der Chainer-Datenaufbereitung
Python & Machine Learning Study Memo ③: Neuronales Netz
Einfache Implementierung eines neuronalen Netzwerks mithilfe der Beschreibung des Chainer-Modells
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Einfache Implementierung eines neuronalen Netzwerks mit Chainer ~ Optimierungsalgorithmus einstellen ~
[Python / Maschinelles Lernen] Warum Deep Learning # 1 Perceptron Neural Network
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Überprüfung der Chargennormalisierung mit einem mehrschichtigen neuronalen Netz
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Richtlinien für das Design der Ausgangsschicht neuronaler Netze
Erkennung handgeschriebener Zahlen durch ein mehrschichtiges neuronales Netzwerk
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
Implementierung eines Deep Learning-Modells zur Bilderkennung
Tiefes Lernen durch Implementierung (Segmentierung) ~ Implementierung von SegNet ~
Parametrisches neuronales Netzwerk
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
Übersicht über DNC (Differentiable Neural Computers) + Implementierung durch Chainer
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
Implementierung des Chainer-Serienlernens mit Mini-Batch variabler Länge
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Implementieren Sie das Convolutional Neural Network
Deep Learning 1 Übung des Deep Learning
Implementierung der Fibonacci-Sequenz
Implementieren Sie das neuronale Netzwerk von Grund auf neu
Erfahrung mit faltbaren neuronalen Netzen
Grundlagen von Netzwerkprogrammen?
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
[Deep Learning] Bildklassifizierung mit Faltungsnetz [DW Tag 4]
Aufbau eines neuronalen Netzwerks, das XOR durch Z3 reproduziert
CNN Acceleration Series ~ FCNN: Einführung des Fourier Convolutional Neural Network ~
Eine Geschichte und ihre Implementierung, dass beliebige a1 * a2-Daten durch ein dreischichtiges neuronales ReLU-Netzwerk mit a1- und a2-Zwischenneuronen ohne Fehler dargestellt werden können.