[PYTHON] Deep Learning von Grund auf neu 4.3.3 Zeichnen Sie einen Gradientenvektor Ihrer eigenen Funktion basierend auf dem Beispielcode der partiellen Differenzierung.

Einführung

4.3.3 Partielle Differenzierung liefert ein Beispiel für das Zeichnen eines Gradientenvektors von f = x0 ^ 2 + x1 ^ 2 mit Code. Auf dieser Grundlage blieb ich stecken, als ich versuchte, das Ergebnis von f = x0 * x1 zu zeichnen, und werde die Lösung beschreiben. Der ursprüngliche Beispielcode lautet Deep-Learning-from-Scratch / ch04 / gradient_2d.py. ) ist. Das Ausführungsergebnis ist wie folgt. f1.png

Überprüfung

Zunächst wird der Verifizierungsergebniscode dieser Zeit angezeigt.

# coding: utf-8
# cf.http://d.hatena.ne.jp/white_wheels/20100327/p3
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D

def _numerical_gradient_no_batch(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(f, X):
    if X.ndim == 1:
        return _numerical_gradient_no_batch(f, X)
    else:
        grad = np.zeros_like(X)
        
        for idx, x in enumerate(X):
            grad[idx] = _numerical_gradient_no_batch(f, x)
        
        return grad

def function_2(x):
    if x.ndim == 1:
        return np.sum(x**2)
    else:
        return np.sum(x**2, axis=1)

# f = x0*x1, df/dx0 = x1, df/dx1 = x0
# can110
def function_xy(x):
    if x.ndim == 1:
        return x[0]*x[1]
    else:
        return x[:,0]*x[:,1]

# f = sin(x0*x1), df/dx0 = x1*cos(x0*x1), df/dx1 = x0*cos(x0*x1)
# can110
def function_sin_xy(x):
    if x.ndim == 1:
        return np.sin(x[0]*x[1])
    else:
        return np.sin(x[:,0]*x[:,1])

def tangent_line(f, x):
    d = numerical_gradient(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y
     
if __name__ == '__main__':
    x0 = np.arange(-2, 2.5, 0.25)
    x1 = np.arange(-2, 2.5, 0.25)
    X, Y = np.meshgrid(x0, x1)
    
    X = X.flatten()
    Y = Y.flatten()
    a = np.array([X, Y])
    a = a.T #Translokation. 1 Zeile=1 Vektor (Spalte=x0,x1) sollte can110 sein

    #Überprüfung
    #func = function_2      # df/dx0(=2*x0), df/dx1(=2*x1)Sind jeweils x0,Funktioniert es gerade, da es nur aus x1 berechnet wird?
    func = function_xy
    #func = function_sin_xy
    
    #grad = numerical_gradient(function_2, np.array([X, Y]) )
    grad = numerical_gradient(func, a)
    grad = grad.T #Transponiert für Köcher (x0 pro Reihe,Platziere x1 Koordinatenwerte) can110
    
    plt.figure()
    plt.quiver(X, Y, -grad[0], -grad[1],  angles="xy",color="#666666")#,headwidth=10,scale=40,color="#444444")
    plt.xlim([-2, 2])
    plt.ylim([-2, 2])
    plt.xlabel('x0')
    plt.ylabel('x1')
    plt.grid()
    plt.legend()
    plt.draw()
    plt.show()

Dieses Mal habe ich die Funktion f = x0 * x1 wie folgt definiert. Übrigens wird bei dieser Gradientenberechnung nur der Teil von "x.ndim == 1" aufgerufen.

def function_xy(x):
    if x.ndim == 1:
        return x[0]*x[1]
    else:
        return x[:,0]*x[:,1]

Ich habe dies durch das ursprüngliche function_2 ersetzt und es ausgeführt, aber mit einigen seltsamen Ergebnissen. xy_ng.png

Also folgte ich dem eigentlichen Gradientenberechnungscode. Die Funktion "numerischer Gradient" wird für mehrere Vektoren verwendet → Die Funktion "numerischer Gradient_no_batch" wird verwendet, um den Gradienten für einen Vektor zu berechnen. Wenn Sie also x.shape in _numerical_gradient_no_batch betrachten, ist es (324,). Die Anzahl der Vektoren (zu zeichnende Punkte). Dies sollte ** (2,) ** sein. Also, wenn Sie den Anrufer überprüfen

    grad = numerical_gradient(function_2, np.array([X, Y]) )

Wir übergeben einen Satz von X (x0) - und Y (x1) -Koordinaten. Das ist die Ursache. Durch die Übersetzung von "np.array ([X, Y]" in die Form von "1 Zeile = 1 Vektor (Punkt)" wird es nun korrekt gezeichnet. xy_ok.png

Zusammenfassung

Richtige / falsche Tabelle von "Deep Learning von Grund auf neu" ??

Recommended Posts

Deep Learning von Grund auf neu 4.3.3 Zeichnen Sie einen Gradientenvektor Ihrer eigenen Funktion basierend auf dem Beispielcode der partiellen Differenzierung.
Ein Memo bei der Ausführung des Beispielcodes von Deep Learning, der mit Google Colaboratory von Grund auf neu erstellt wurde
Deep Learning von Grund auf neu 4.4.2 Gradient für neuronale Netze Die Frage nach der Funktion numerischer Gradient wurde gelöst.
Erstellen Sie mit Cloud9 (jupyter miniconda python3) eine Lernumgebung für "Deep Learning von Grund auf neu".
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 4 Implementierung der Verlustfunktion
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
[Deep Learning von Grund auf neu] Anfangswert des Gewichts des neuronalen Netzwerks unter Verwendung der Sigmoid-Funktion
GitHub des guten Buches "Deep Learning von Grund auf neu"
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 3 Diagramm der Schrittfunktion, Sigmoidfunktion, ReLU-Funktion
[Deep Learning von Grund auf neu] Anfangsgewicht des neuronalen Netzwerks bei Verwendung der Relu-Funktion
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 14) Führen Sie das Programm in Kapitel 4 in Google Colaboratory aus
Kapitel 2 Implementierung von Perceptron Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Deep Learning von Grund auf neu
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Kapitel 1 Einführung in Python Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden