Der Zweck von Perceptron besteht darin, das Gewicht (synaptische Last) zwischen der Zwischenschicht und der Ausgangsschicht zu lernen und das dem Eingangsmuster entsprechende Ausgangsmuster zu erzeugen.
Angenommen, Sie haben $ M $ Neuronen.
Es empfängt die Eingabe von außen wie sie ist und gibt sie aus.
Die Ausgabe des $ i $ -ten Neurons wird durch die folgende Formel ausgedrückt.
Angenommen, Sie haben $ N $ Neuronen.
Die Eingabe für das $ j $ -te Neuron in der mittleren Schicht ist die Summe der Ausgabewerte aller Neuronen der Eingabeschicht multipliziert mit der synaptischen Last $ w_ {i, j}
Stellen Sie dann den Schwellenwert $ \ theta_j $ für das von jedem Neuron der mittleren Schicht empfangene Signal ein und reduzieren Sie ihn um diesen Betrag.
Da die Ausgabe nur $ 0 $ oder $ 1 $ ist, setzen Sie die Ausgabefunktion $ f (x) $. Daher wird der Ausgabewert des $ j $ -ten Neurons in der mittleren Schicht durch die folgende Formel ausgedrückt.
f(u) = \left\{
\begin{array}{ll}
1 & (u \gt 0) \\
0 & (u \leq 0)
\end{array}
\right.
Die Eingabe der Ausgabeschicht ist wie die Eingabe der mittleren Schicht der Ausgabewert aller Neuronen in der vorherigen Schicht multipliziert mit der synaptischen Last. Die Anzahl der Neuronen in der Ausgabeschicht sei $ 1 $.
Die Ausgabe der Ausgabeschicht ist das Ergebnis der Anwendung von $ f (x) $ auf den Wert, der durch Subtrahieren des Schwellenwerts von der Eingabe wie in der Zwischenschicht erhalten wird.
f(u) = \left\{
\begin{array}{ll}
1 & (u \gt 0) \\
0 & (u \leq 0)
\end{array}
\right.
Während des Trainings wird nur die synaptische Last $ w_ {j, o} $ zwischen der Ausgabeschicht und der Zwischenschicht aktualisiert, ohne andere Parameter zu ändern.
$ \ eta $ ist die Lernrate, und es ist üblich, einen kleinen positiven Wert festzulegen. $ t_o-output_o $ ist die Differenz zwischen der Ausgabe $ t_o $ der Lehrerdaten und den tatsächlichen Ausgabedaten $ output_o $. Daher ist ersichtlich, dass die synaptische Last nur aktualisiert wird, wenn das berechnete Ergebnis und das Lehrersignal unterschiedlich sind.
Die Erklärung und der Beweis des Konvergenzsatzes von Perceptron werden hier weggelassen. Wenn Sie interessiert sind, überprüfen Sie es bitte.
Bibliotheksinstallation und Eingabepfadeinstellung
import numpy as np
import matplotlib.pyplot as plt
PATH_X = "./../input_x.npy"
PATH_Y = "./../input_y.npy"
Konvertieren Sie Eingabedaten von $ (x, y) $ in $ 0 $ und $ 1 $ Spalten mit einer Länge von $ 8 $
def to_input(data):
x = data[0]
y = data[1]
n = x * 16 + y
return np.array([int(k) for k in format(n, '08b')])
Perceptron-Klasse __Hinweis! __ Die Lastberechnung im Programm wird unter Berücksichtigung der oben erläuterten Formel als Vektor berechnet.
class Perceptron:
def __init__(self, m, n, o):
# decide initial weight [-0.005,0.005)
#Ich habe 1 hinzugefügt, um den Schwellenwert leicht zu handhaben
self.w_IM = np.random.rand(n,m+1) - 0.5
self.w_IM = self.w_IM / 100
self.w_MO = np.random.rand(o,n+1) - 0.5
self.w_MO = self.w_MO / 100
# calculate accuracy
def get_acc(self, x, y):
ok = 0
for i in range(len(x)):
#Ich füge ein Neuron hinzu, das immer 1 ausgibt
mid_in = np.inner(np.append(x[i],1.), self.w_IM)
mid_out = np.array([int(k > 0) for k in mid_in])
#Ich füge ein Neuron hinzu, das immer 1 ausgibt
out_in = np.inner(np.append(mid_out,1.), self.w_MO)
ok += int(int(out_in[0] > 0) == y[i])
return ok / len(x)
def learn(self, train_x, train_y, eta = 0.00001):
#Ich füge ein Neuron hinzu, das immer 1 ausgibt
mid_in = np.inner(np.append(train_x,1.), self.w_IM)
mid_out = np.array([int(k > 0) for k in mid_in])
#Ich füge ein Neuron hinzu, das immer 1 ausgibt
out_in = np.inner(np.append(mid_out,1.), self.w_MO)
out = int(out_in[0] > 0)
#Aktualisieren der Last aus den Ausgabe- und Lehrerdatenwerten
self.w_MO[0,:-1] = self.w_MO[0,:-1] + eta * (train_y - out) * mid_out
Parameter einstellen und Ergebnisdiagramm zeichnen
def main():
# read datas
x = np.load(PATH_X)
y = np.load(PATH_Y)
# split datas
train_x, test_x = np.split(x, 2)
train_y, test_y = np.split(y, 2)
# preprocess - transfer data into inputs
datas = np.array([to_input(k) for k in train_x])
tests = np.array([to_input(k) for k in test_x])
# number of neurons input layer
m = 8
# number of neurons mid layer
n = 10
# number of neurons output layer
o = 1
# define the perceptron
P = Perceptron(m,n,o)
# learning time
N = 10
cnt = 0
x = np.linspace(0,200,200)
acc_train = np.copy(x)
acc_test = np.copy(x)
while True:
acc = P.get_acc(datas, train_y)
acc_train[cnt] = acc
acc = P.get_acc(tests, test_y)
acc_test[cnt] = acc
print("Try ", cnt, ": ", acc)
cnt += 1
for i in range(len(datas)):
P.learn(datas[i], train_y[i])
if cnt >= 200:
break
plt.plot(x,acc_train,label="train")
plt.plot(x,acc_test,label="test")
plt.savefig("result.png ")
if __name__ == "__main__":
main()
Es wird auch auf Github hochgeladen. https://github.com/xuelei7/NeuralNetwork/tree/master/Perceptron
Für $ 30 $ Mittelschichtneuronen:
Für $ 100 $ Anzahl der Neuronen der mittleren Schicht:
Wenn Sie etwas finden, das nicht angemessen ist, möchten wir es korrigieren. Wir entschuldigen uns für die Unannehmlichkeiten, wenden uns jedoch bitte an den Autor.
"Neuronales Netz", Yasunari Yoshitomi, Asakura Shoten,
Recommended Posts