[PYTHON] Implementierung eines zweischichtigen neuronalen Netzwerks 2

Fortsetzung des vorherigen Artikels Implementierung eines zweischichtigen neuronalen Netzwerks Wir haben ein zweischichtiges neuronales Netzwerk erstellt und MNIST gelernt. Bestätigung der Vorhersagegenauigkeit der gelernten Ergebnisse. Siehe Kapitel 4 von Deep Learning von Grund auf neu

TwoLayerNet.py


import numpy as np

class TwoLayerNet:
    
    def __init__(self,input_size,hidden_size,output_size,weight_init_std=0.01):
        #Gewichtsinitialisierung
        self.params = {}
        #784 *50 Gewichtsmatrix
        self.params['W1'] = weight_init_std * np.random.randn(input_size,hidden_size)
        #50 *10 Gewichtsmatrix
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size,output_size)
        #Bias, so viele versteckte Schichten
        self.params['b1'] = np.zeros(hidden_size)
        #Bias, so viele wie die Anzahl der Ausgabeebenen
        self.params['b2'] = np.zeros(output_size)
    
    def sigmoid(self,x):
        return 1 / (1 + np.exp(-x))
    
    def softmax(self,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
    
    def _numerical_gradient_1d(self,f, x):
        h = 1e-4 # 0.0001
        grad = np.zeros_like(x)

        for idx in range(x.size):
            tmp_val = x[idx]
            x[idx] = float(tmp_val) + h
            fxh1 = f(x) # f(x+h)

            x[idx] = tmp_val - h 
            fxh2 = f(x) # f(x-h)
            grad[idx] = (fxh1 - fxh2) / (2*h)

            x[idx] = tmp_val #Stellen Sie den Wert wieder her

        return grad


    def numerical_gradient(self,f, X):
        if X.ndim == 1:
            return self._numerical_gradient_1d(f, X)
        else:
            grad = np.zeros_like(X)

            for idx, x in enumerate(X):
                grad[idx] = self._numerical_gradient_1d(f, x)

            return grad

    def cross_entropy_error(self,y,t):
        if y.ndim == 1:
            t = t.reshape(1,t.size)
            y = y.reshape(1,y.size)
        batch_size = y.shape[0]
        return -np.sum(t * np.log(y)) / batch_size
    
    def predict(self,x):
        W1,W2 = self.params['W1'],self.params['W2']
        b1,b2 = self.params['b1'],self.params['b2']
        
        a1 = np.dot(x,W1) + b1 #a = Wx + b
        z1 = self.sigmoid(a1)
        a2 = np.dot(z1,W2) + b2
        z2 = self.softmax(a2)
        
        return z2
    
    def loss(self, x, t):
        y = self.predict(x)
        
        return self.cross_entropy_error(y,t)
    
    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y,axis=1)
        t = np.argmax(t,axis=1)
        
        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy
    
    def gradient(self,x,t):
        loss_W = lambda W: self.loss(x,t)
        grads = {}
        grads['W1'] = self.numerical_gradient(loss_W,self.params['W1'])
        grads['W2'] = self.numerical_gradient(loss_W,self.params['W2'])
        grads['b1'] = self.numerical_gradient(loss_W,self.params['b1'])
        grads['b2'] = self.numerical_gradient(loss_W,self.params['b2'])
        
        return grads

Ähnlich wie beim vorherigen Mal wurde das Mini-Batch-Lernen (Größe 50) 500 Mal aus MNIST-Daten durchgeführt. Dieses Mal wird die Genauigkeit (acc) mit 50 Schleifen als eine Epoche berechnet.

LearningMNIST.py


#coding: utf-8
import numpy as np
from sklearn.datasets import fetch_mldata
from sklearn.preprocessing import OneHotEncoder

mnist = fetch_mldata('MNIST original', data_home=".")

x_train = mnist['data'][:60000]
t_train = mnist['target'][:60000]

t_train = t_train.reshape(1, -1).transpose()
# encode label
encoder = OneHotEncoder(n_values=max(t_train)+1)
t_train = encoder.fit_transform(t_train).toarray()

x_test = mnist['data'][60000:]
t_test = mnist['target'][60000:]

t_test = t_test.reshape(1, -1).transpose()
# encode label
encoder = OneHotEncoder(n_values=max(t_test)+1)
t_test = encoder.fit_transform(t_test).toarray()

x_train = x_train.astype(np.float64)
x_train /= x_train.max()
x_test = x_test.astype(np.float64)
x_test /= x_test.max()

train_loss_list = []
train_acc_list = []
test_acc_list = []

#hyper parameter
iters_num = 2
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1

#Anzahl der Iterationen pro Epoche
#iter_per_epoch = max(train_size / batch_size, 1)
iter_per_epoch = 50

network = TwoLayerNet(input_size=784,hidden_size=50,output_size=10)

iters_num = 500
for i in range(iters_num):
    batch_mask = np.random.choice(train_size,batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    
    grad = network.gradient(x_batch,t_batch)
    
    for key in ('W1','W2','b1','b2'):
        network.params[key] -= learning_rate * grad[key]
        
    loss = network.loss(x_batch,t_batch)
    train_loss_list.append(loss)
    #Berechnen Sie die Erkennungsgenauigkeit für jede Epoche
    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accuracy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))

Das Ergebnis ist die folgende Grafik, die vertikale Achse ist die Genauigkeit und die horizontale Achse ist die Anzahl der Epochen.

MNIST_acc.jpg

Die Genauigkeit wird für jede Epoche verbessert.

Recommended Posts

Implementierung eines zweischichtigen neuronalen Netzwerks 2
Ich habe versucht, ein zweischichtiges neuronales Netzwerk zu implementieren
Implementierung eines Faltungs-Neuronalen Netzwerks mit nur Numpy
Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)
Implementierung von "verschwommenen" neuronalen Netzen mit Chainer
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Implementieren Sie ein dreischichtiges neuronales Netzwerk
Implementierung eines neuronalen Netzwerks in Python
Implementierung eines neuronalen Netzwerks (nur NumPy)
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Bayesianische Optimierungsimplementierung von Hyperparametern des neuronalen Netzwerks (Chainer + GPyOpt)
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
Rank Learning über ein neuronales Netzwerk (RankNet-Implementierung von Chainer)
Einfache Implementierung eines neuronalen Netzwerks mit Chainer
Implementierung eines einfachen Partikelfilters
PRML Kapitel 5 Python-Implementierung für neuronale Netze
Was ist das Convolutional Neural Network?
Einfache Theorie und Implementierung des neuronalen Netzes
Berühren Sie das Objekt des neuronalen Netzes
Aufbau eines neuronalen Netzwerks, das XOR durch Z3 reproduziert
Verstehen Sie die Anzahl der Eingabe- / Ausgabeparameter des Faltungs-Neuronalen Netzes
Komponieren Sie mit einem neuronalen Netzwerk! Führen Sie Magenta aus
Einfache Implementierung eines neuronalen Netzwerks mithilfe der Chainer-Datenaufbereitung
Einfache Implementierung eines neuronalen Netzwerks mithilfe der Beschreibung des Chainer-Modells
Erstellen Sie mithilfe des TensorFlow-Faltungsnetzwerks einen Klassifikator mit einer Handschrifterkennungsrate von 99,2%
Parametrisches neuronales Netzwerk
Einfache Implementierung eines neuronalen Netzwerks mit Chainer ~ Optimierungsalgorithmus einstellen ~
Experimentieren Sie mit verschiedenen Optimierungsalgorithmen im neuronalen Netz
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Überprüfung der Chargennormalisierung mit einem mehrschichtigen neuronalen Netz
Erkennung handgeschriebener Zahlen durch ein mehrschichtiges neuronales Netzwerk
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Implementierung eines dreischichtigen neuronalen Netzwerks
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Trainieren Sie MNIST-Daten mit PyTorch mithilfe eines neuronalen Netzwerks
Übersicht über DNC (Differentiable Neural Computers) + Implementierung durch Chainer
Implementieren Sie das Convolutional Neural Network
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Implementierung der Fibonacci-Sequenz
Implementieren Sie das neuronale Netzwerk von Grund auf neu
Erfahrung mit faltbaren neuronalen Netzen
Grundlagen von Netzwerkprogrammen?
Ein Memorandum über die Umsetzung von Empfehlungen in Python
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Ich habe ein Convolutional Neural Network (CNN) mit einem TensorFlow-Tutorial zur Cloud9-Klassifizierung handgeschriebener Bilder ausprobiert.
Ich habe versucht, das grundlegende Modell des wiederkehrenden neuronalen Netzwerks zu implementieren
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Implementierung von VGG16 mit Keras, die ohne Verwendung eines trainierten Modells erstellt wurden
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Mit den Daten von COVID-19 wurde ein Netzwerkdiagramm erstellt.
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ich habe einen neuronalen Netzwerkgenerator erstellt, der auf FPGA läuft
CNN Acceleration Series ~ FCNN: Einführung des Fourier Convolutional Neural Network ~
Das Verfahren zum Initialisieren von Gewichtsparametern in einem neuronalen Netzwerk wird mit der Implementierung zusammengefasst (Anfangswerte von Xavier, He et al., Etc.)
Quantum Computer Implementierung von Quantum Walk 2
Implementierung von TF-IDF mit Gensim
Hinweis zur Kernel-Kompilierung
Neuronales Netzwerk mit Python (Scikit-Learn)
3. Normalverteilung mit neuronalem Netz!
Erklärung und Implementierung von SocialFoceModel
Ein kleines Memorandum von openpyxl