Implémenté dans Python PRML Chapter 5 Neural Network

Implémentons un réseau neuronal pour reproduire la figure 5.3 du chapitre 5 de PRML. Comme je l'ai dit plus tôt, même si on dit qu'il s'agit d'une implémentation, le chiffre reproduit à partir du code n'est pas net. .. .. J'ai l'impression que je suis en colère si je ne soulève pas d'imperfections, mais veuillez vous y référer.

Premièrement, en ce qui concerne les figures 5.3 (b), (c) et (d), on a l'impression que la précision des prévisions n'est pas aussi bonne que les chiffres du PRML. En outre, en ce qui concerne la figure 5.3 (a), une prédiction complètement erronée est renvoyée. J'ai fait un essai et une erreur, mais veuillez indiquer si quelqu'un remarque une erreur due à un manque de puissance.

Je laisserai l'explication du réseau neuronal et de la méthode de propagation d'erreur (Backpropagation) elle-même à PRML et Hajipata, et je voudrais vérifier brièvement uniquement les parties nécessaires à la mise en œuvre.

Flux de mise en œuvre approximatif

(1) La sortie via le réseau neuronal est représentée par (5.9). La formule dans l'instruction PRML suppose une fonction sigmoïde pour la fonction d'activation $ h () $, mais notez que tanh () est spécifié dans la figure 5.3.

 y_k({\bf x}, {\bf w}) = \sigma(\sum_{j=0}^M, w^{(2)}_{kj} h(\sum_{i=0}^D w^{(1)}_{ji} x_i)) (5.9)

(2) Lors de l'apprentissage du poids $ {\ bf w} $ entre les nœuds, trouvez la différence entre la sortie et la valeur mesurée à chaque nœud. Premièrement, la sortie de l'unité cachée est (5,63) et la sortie de l'unité de sortie est (5,64).

 z_j = {\rm tanh} (\sigma(\sum_{i=0}^D, w^{(1)}_{ji} x_i)) (5.63)
 y_k = \sum_{j=0}^M, w^{(2)}_{kj} z_i (5.64)

③ Ensuite, recherchez l'erreur $ \ delta_k $ dans la couche de sortie.

\delta_k = y_k - t_k (5.65)

④ Ensuite, recherchez l'erreur $ \ delta_j $ dans la couche cachée.

\delta_j = (1-{z_j}^2) \sum_{k=1}^K w_{kj} \delta_k (5.65)

⑤ Mettez à jour les poids entre les nœuds en utilisant (5.43) et (5.67).

{\bf w}^{\rm \tau+1} = {\bf w}^{\rm \tau} - \mu \nabla  E({\bf{w}})(5.43)

code

import matplotlib.pyplot as plt
from pylab import *
import numpy as np
import random

def heaviside(x):
    return 0.5 * (np.sign(x) + 1)

def NN(x_train, t, n_imput, n_hidden, n_output, eta, W1, W2, n_loop):
    for n in xrange(n_loop):
        for n in range(len(x_train)):
            x = np.array([x_train[n]])
            
            #feedforward
            X = np.insert(x, 0, 1) #Insert fixed term

            A = np.dot(W1, X) #(5.62)
            Z = np.tanh(A)  #(5.63)
            Z[0] = 1.0
            Y = np.dot(W2, Z) #(5.64)

   
            #Backprobagation
            D2 = Y - t[n]#(5.65)
            D1 = (1-Z**2)*W2*D2 #(5.66)
    
            W1 = W1- eta*D1.T*X #(5.67), (5.43)
            W2 = W2- eta*D2.T*Z #(5.67), (5.43)
    return  W1, W2

def output(x, W1, W2):
    X = np.insert(x, 0, 1) #Insert fixed term
            
    A = np.dot(W1, X) #(5.62)
    Z = np.tanh(A)  #(5.63)
    Z[0] = 1.0 #Insert fixed term
    Y = np.dot(W2, Z) #(5.64)
    return Y, Z

if __name__ == "__main__":
    #Set form of nueral network 
    n_imput = 2
    n_hidden = 4
    n_output = 1
    eta = 0.1
    W1 = np.random.random((n_hidden, n_imput))
    W2 = np.random.random((n_output, n_hidden))
    n_loop = 1000
    
    
    #Set train data
    x_train = np.linspace(-4, 4, 300).reshape(300, 1)
    y_train_1 = x_train * x_train
    y_train_2 = np.sin(x_train)
    y_train_3 = np.abs(x_train)
    y_train_4 = heaviside(x_train)
    
    W1_1, W2_1= NN(x_train, y_train_1, n_imput, n_hidden, n_output, eta, W1, W2, n_loop) 
    W1_2, W2_2= NN(x_train, y_train_2, n_imput, n_hidden, n_output, eta, W1, W2, n_loop)
    W1_3, W2_3= NN(x_train, y_train_3, n_imput, n_hidden, n_output, eta, W1, W2, n_loop)
    W1_4, W2_4= NN(x_train, y_train_4, n_imput, n_hidden, n_output, eta, W1, W2, n_loop)

    Y_1 = np.zeros((len(x_train), n_output))
    Z_1 = np.zeros((len(x_train), n_hidden))

    Y_2 = np.zeros((len(x_train), n_output))
    Z_2 = np.zeros((len(x_train), n_hidden))

    Y_3 = np.zeros((len(x_train), n_output))
    Z_3 = np.zeros((len(x_train), n_hidden))

    Y_4 = np.zeros((len(x_train), n_output))
    Z_4 = np.zeros((len(x_train), n_hidden))

    for n in range(len(x_train)):
        Y_1[n], Z_1[n] =output(x_train[n], W1_1, W2_1)
        Y_2[n], Z_2[n] =output(x_train[n], W1_2, W2_2)
        Y_3[n], Z_3[n] =output(x_train[n], W1_3, W2_3)
        Y_4[n], Z_4[n] =output(x_train[n], W1_4, W2_4)
    
    
    plt.plot(x_train, Y_1, "r-")
    plt.plot(x_train, y_train_1, "bo", markersize=3)
    for i in range(n_hidden):
        plt.plot(x_train, Z_1[:,i], 'm--')
    xlim([-1,1])
    ylim([0, 1])
    title("Figure 5.3(a)")
    show()
    
    plt.plot(x_train, Y_2, "r-")
    plt.plot(x_train, y_train_2, "bo", markersize=2)
    for i in range(n_hidden):
        plt.plot(x_train, Z_2[:,i], 'm--')
    xlim([-3.14,3.14])
    ylim([-1, 1])
    title("Figure 5.3(b)")
    show()
    
    
    plt.plot(x_train, Y_3, "r-")
    plt.plot(x_train, y_train_3, "bo", markersize=4)
    for i in range(n_hidden):
        plt.plot(x_train, Z_3[:,i], 'm--')
    xlim([-1,1])
    ylim([0, 1])
    title("Figure 5.3(c)")
    show()
    
    
    plt.plot(x_train, Y_4, "r-")
    plt.plot(x_train, y_train_4, "bo" ,markersize=2)
    for i in range(n_hidden):
        plt.plot(x_train, Z_4[:,i], 'm--')
    xlim([-2,2])
    ylim([-0.05, 1.05])
    title("Figure 5.3(d)")
    show()

résultat

Screen Shot 2015-09-26 at 03.19.37.png

Screen Shot 2015-09-26 at 03.19.59.png

Screen Shot 2015-09-26 at 03.20.17.png

Screen Shot 2015-09-26 at 03.20.35.png

Recommended Posts

Implémenté dans Python PRML Chapter 5 Neural Network
Implémenté en Python PRML Chapitre 7 SVM non linéaire
Implémenté en Python PRML Chapitre 1 Estimation bayésienne
Implémenté en Python PRML Chapitre 3 Régression linéaire bayésienne
Implémenté dans Python PRML Chapitre 1 Ajustement de courbe polygonale
Implémenté en Python PRML Chapitre 4 Classification par algorithme Perceptron
PRML Chapitre 5 Implémentation Python du réseau neuronal
Implémentation de SimRank en Python
Implémentation de Shiritori en Python
Implémentation de Supreme Solver dans Python 3
Implémentation de réseau neuronal en python
Implémentation de la segmentation d'image en python (Union-Find)
100 Language Processing Knock Chapitre 1 en Python
Règles d'apprentissage Widrow-Hoff implémentées en Python
Implémentation de la méthode de propagation d'étiquettes en Python
PRML Chapitre 3 Preuve Implémentation approximative de Python
Implémentation des règles d'apprentissage Perceptron en Python
Implémenté en 1 minute! LINE Notify en Python
PRML Chapitre 8 Algorithme Somme des produits Implémentation Python
PRML Chapitre 4 Implémentation Python de la régression logistique bayésienne
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
PRML Chapter 5 Implémentation Python de réseau à densité mixte
Un client HTTP simple implémenté en Python
PRML Chapitre 9 Implémentation Python de distribution gaussienne mixte
PRML Chapitre 14 Implémentation Python de modèle mixte conditionnel
PRML Chapitre 10 Implémentation Python de distribution gaussienne mixte
PRML Chapitre 6 Implémentation Python Gaussian Return
PRML Chapter 2 Student t-Distribution Python Implementation
PRML Chapitre 1 Implémentation de Python pour l'ajustement de courbe bayésienne
J'ai essayé d'implémenter la régression logistique de Cousera en Python
Mise en œuvre du tri Stuge dans Python 3 (tri à bulles et tri rapide)
Introduction à la vérification de l'efficacité Chapitre 1 écrit en Python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 13 Bases du réseau neuronal
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
SendKeys en Python
J'ai essayé d'implémenter le filtre anti-spam bayésien de Robinson avec python
Introduction à la vérification de l'efficacité Chapitre 3 écrit en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
[Python] Automatisation implémentée pour la copie de fichiers Excel
N-Gram en Python
PRML Chapitre 11 Implémentation Python Monte Carlo Chaîne de Markov
Programmation avec Python
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
J'ai essayé d'implémenter la fonction gamma inverse en python
LINE-Bot [0] en Python