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)
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)
Die obige Abbildung zeigt das in diesem Artikel aufgebaute neuronale Netzwerk. Wir werden es in jede Ebene aufteilen und in der richtigen Reihenfolge erstellen.
Lassen Sie uns $ (1) a1 $ mit einer Formel ausdrücken. Sie kann aus der Summe von Voreingenommenheit und Gewicht abgeleitet werden.
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,
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.
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. ..
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.
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.
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)
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