[PYTHON] Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden

neurales Netzwerk

Es ist ein ganz anderes Konzept als in Kapitel 2 Perceptron.

Glossar

Von der Eingabeebene zur Ausgabeebene werden sie der Reihe nach die 0. Ebene, die 1. Ebene und die 2. Ebene genannt.

Aus der Überprüfung von Kapitel 2 kann es durch die folgende Formel ausgedrückt werden

y = h(b+w1x1+w2x2)

h(x) = 0 (x <= 0)
       1 (x > 0)
a = b+w1x1+w2x2
h(a) = 0 (x <= 0)
       1 (x > 0)

Aktivierungsfunktion

Implementierung der Schrittfunktion

h(x) = 1 (x >= 0)
       0 (x < 0)

Beim Versuch, eine Schrittfunktion als Ausdruck auszudrücken

Da es nicht wie step_function verwendet werden kann (np.array ([1.0, 2.0]))

import numpy as np
x = np.array([-1.0, 1.0, 2.0])
y = x > 0
y
array([False, True, True], dtype=bool)
y = y.astype(np.int)
y
array([0, 1, 1])

Das Obige in einer Funktion zusammenfassen

def step_function(x):
    return np.array(x > 0, dtype= np.int)

Kann vertreten werden durch.

Implementierung der Sigmoidfunktion

h(x) = 1 / 1 + exp(-x)

def sigmoid(x):
    return 1/ (1 + np.exp(-x))

x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)

> array([0.2689, 0.73.., 0.88..])

Perceptron hat nur 0,1 Signale, aber NN hat kontinuierliche Signale. Verwenden Sie keine linearen Funktionen für die Aktivierungsfunktion. Die Verwendung der linearen Algebra macht es bedeutungslos, Schichten in einem neuronalen Netzwerk zu vertiefen.

Da es sich um ein Netzwerk ohne versteckte Schichten handelt, ist es nicht möglich, Multi-Layering zu nutzen

ReLU-Funktion

Obwohl Sigmoid häufig ist, wird hauptsächlich eine Funktion namens ReLU (Rectified Linear Unit) verwendet. Die ReLU-Funktion kann wie folgt als mathematischer Ausdruck ausgedrückt werden.

h(x) = x (x > 0)
       0 (x <= 0)

Implementierung

def relu(x):
    return np.maximum(0, x)

Mehrdimensionale Array-Berechnung

Inneres Produkt der Matrix

A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
np.dot(A, B)

>> array([[19, 22],[43, 50]])

A = np.array([1,2,3],[4,5,6])
B = np.array([[1,2],[3,4],[5,6]])

np.dot(A,B)

>> array([[22,28],[49,64]])

Inneres Produkt des neuronalen Netzwerks

X = np.array([1,2])
W = np.array([1,3,5],[2,4,6])

Y = np.dot(X,W)
print(Y)
>>> [5,11,17]

Implementierung eines 3-Schicht-Neuronalen Netzwerks

Eine einfache Formel für ein dreischichtiges neuronales Netzwerk

A = XW = B

W1.shape = (2, 3)
W2.shape = (3, 2)
W3.shape = (2, 2)

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

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

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

Implementierungszusammenfassung

def init_network():
    network = {}
    network['W1'] = np.array([[0.1, 0.3, 0.5],[0.2,0.4,0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])
    network['W2'] = np.array([[0.1, 0.4],[0.2, 0.5],[0.3,0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['W3'] = np.array([[0.1, 0.3],[0.2,0.4]])
    network['b3'] = np.array([0.1, 0.2])

    return network

def forward(network, x)
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = identity_function(a3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y) # [0.3168.., 0.69....]

Design der Ausgabeschicht

Gleiche Funktion und Softmax-Funktion

Die Gleichheitsfunktion gibt die Eingabe so aus, wie sie ist. Die Softmax-Funktion wird durch die folgende Formel ausgedrückt

yk = exp(ak) / nΣi=1 exp(ai)
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a = sum_exp_a

Vorsichtsmaßnahmen zur Implementierung von Softmax-Funktionen

Sie müssen auf Überlauf achten.

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c) #Überlaufmaßnahmen
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

Anzahl der Neuronen in der Ausgabeschicht

Stellen Sie bei Klassifizierungsproblemen mit 10 Klassen die Anzahl der Ausgabeebenen auf 10 ein.

Handschriftliche Nummernerkennung

MNIST-Datensatz

Bildsatz handgeschriebener Zahlen. Einer der bekanntesten Datensätze. Es besteht aus numerischen Bildern von 0 bis 9.
Es stehen 60.000 Trainingsbilder und 10.000 Testbilder zur Verfügung, die zum Lernen und Inferenzieren verwendet werden.
Eine häufige Verwendung des MNIST-Datensatzes besteht darin, mit Trainingsbildern zu trainieren und zu messen, wie gut das trainierte Modell Testbilder klassifizieren kann.

Implementierung

import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist

(x_train, t_train), (x_test, t_test) = \
    load_mnist(flatten=True, normalize=False)

print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,)

Gibt die gelesenen MNIST-Daten im Format (Trainingsbild, Trainingsetikett) (Testbild, Testetikett) zurück.

import sys, os
sys.path.append(os.pardir)
import numpy as np
from datase.mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = IMage.fromarray(np.unit8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = \
    load_mnist(flatten = True, normalize = False)

img = x_train[0]
label = t_train[0]
print(label) # 5

print(img.shape) # (784)
img = img.reshape(28, 28)
print(img.shape) # (28, 28)

img_show(img) #Es werden 5 Bilder angezeigt

Das als flatten = True gelesene Bild wird in einer Dimension als Numpy-Array gespeichert. Wenn es angezeigt wird, muss es auf eine Größe von 28 x 28 umgeformt werden.

Inferenzverarbeitung für neuronale Netze

Da es in 10 Zahlen klassifiziert ist, gibt es 10 Ausgabeebenen. Es wird auch angenommen, dass es zwei verborgene Schichten gibt, die erste verborgene Schicht hat 50 Neuronen und die zweite Schicht hat 100 Neuronen. Die Zahlen 50 und 100 können auf einen beliebigen Wert eingestellt werden. Zunächst definieren wir drei Funktionen.

  1. get_data()
  2. init_network()
  3. predict()
def get_date():
    (x_train, t_train), (x_test, t_test) = \
        load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test

def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)
    return y

x, t = get_date()
network = init_network()

accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p = np.armax(y) #Index des etabliertesten Elements abrufen
    if p == t[i]:
        accurancy_cnt += 1
print("accurancy:" + str(float(accuracy_cnt) / len(x)))

Laden Sie die trainierten Gewichtsparameter, die in sample_weight.pkl gespeichert sind. Diese Datei enthält Gewichts- und Bias-Parameter. pkl wird im nächsten Kapitel erklärt.

Recommended Posts

Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Kapitel 2 Implementierung von Perceptron Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Kapitel 1 Einführung in Python Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
Deep Learning / Deep Learning von Grund auf neu Kapitel 6 Memo
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 5]
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 6]
Deep Learning / Deep Learning von Grund auf neu Kapitel 7 Memo
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
Deep Learning Memo von Grund auf neu gemacht
Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]
Schreiben Sie Ihre Eindrücke von der Deep Learning 3 Framework Edition, die von Grund auf neu erstellt wurde
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
[Deep Learning von Grund auf neu] Informationen zu den Ebenen, die für die Implementierung der Backpropagation-Verarbeitung in einem neuronalen Netzwerk erforderlich sind
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 4 Implementierung der Verlustfunktion
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
GitHub des guten Buches "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Deep Learning von Grund auf neu
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Diagramm der Schrittfunktion, Sigmoidfunktion, ReLU-Funktion
Python vs Ruby "Deep Learning from Grund" Kapitel 1 Diagramm der Sin-Funktion und der Cos-Funktion
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 1
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 5
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 2
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 3
Ein Amateur stolperte in Deep Learning von Grund auf neu. Hinweis: Kapitel 7
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 5
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 1
Ein Amateur stolperte über Deep Learning ❷ von Grund auf neu Hinweis: Kapitel 4
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 4
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 14) Führen Sie das Programm in Kapitel 4 in Google Colaboratory aus
"Deep Learning from Grund" Memo zum Selbststudium (Teil 8) Ich habe die Grafik in Kapitel 6 mit matplotlib gezeichnet
[Deep Learning von Grund auf neu] Implementieren Sie die Backpropagation-Verarbeitung in einem neuronalen Netzwerk mithilfe der Fehler-Back-Propagation-Methode
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 2
Deep Learning von Grund auf neu 4.4.2 Gradient für neuronale Netze Die Frage nach der Funktion numerischer Gradient wurde gelöst.
[Deep Learning von Grund auf neu] Methoden zur Aktualisierung der wichtigsten Parameter für neuronale Netze
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 10-2) Anfangswert des Gewichts
Deep Learning / Deep Learning von Grund auf neu 2 Kapitel 4 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 5 Memo
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Deep Learning / Deep Learning von Null 2 Kapitel 7 Memo
Berühren Sie das Objekt des neuronalen Netzes
Deep Learning / Deep Learning von Null 2 Kapitel 8 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 5 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 4 Memo
Deep Learning / Deep Learning von Grund auf neu 2 Kapitel 3 Memo