[PYTHON] Berühren Sie das Objekt des neuronalen Netzes

Ich habe Tensorflow neulich zum ersten Mal berührt, aber diesmal habe ich ein kleines neuronales Netzobjekt berührt. Zuerst habe ich hochrangige Herausforderungen ausprobiert, um verschiedene Gruppen auszuprobieren, aber es hat überhaupt nicht funktioniert, deshalb werde ich super-super-rudimentäre Dinge schreiben, um die Grundlagen zu bewerten.

Ich habe es berührt tensorflow.layers.dense Dieser Teil. Anscheinend entspricht es der "Schicht" des Newral Network. Als ich danach suchte, fand ich den folgenden Beispielsatz.

hidden1 = tf.layers.dense(x_ph, 32, activation=tf.nn.relu)

Wenn Sie dies bauen, scheint es, dass Sie ziemlich komplizierte Dinge tun können. Dieses Mal werde ich jedoch einfach das folgende Modell betrachten. Es gibt zwei Eingänge und einen Ausgang.

math_0329_1.jpg

Ich glaube nicht, dass es mehr ein neuronales Netzwerk ist, aber ... Ich denke, ich muss das verstehen, also fange ich von hier aus an.

Lassen Sie uns zunächst eine Schicht eines neuronalen Netzwerks erstellen.

newral_out = tf.layers.dense(x_ph, 1)

Damit wird die Eingabe durch x_ph definiert und die Anzahl der Ausgaben scheint eins zu sein. Es scheint, dass Sie mit Optionen verschiedene Dinge tun können, aber dieses Mal werde ich versuchen, dass es sich wie eine bloße lineare Verbindung anfühlt. x_ph ist ein Platzhalter eines Felds für die Dateneingabe, und diesmal wird es unten definiert.

x_ph = tf.placeholder(tf.float32, [None, 2])

Die Größe von [Keine 2] und Keine bedeutet, dass Sie eine beliebige Anzahl von Samples einfügen können, und 2 ist die Anzahl der einzugebenden Variablen. Daher setzen wir sie hier auf 2 (X1, X2).

Dieses Mal entspricht die Ausgabe der folgenden Formel ganz einfach y1.

y_1 = w_1 x_1 + w_2 x_2 + w_0

Ist es möglich, w_1, w_2, w_0 gut abzuschätzen, indem willkürlich (x1, x2) und y1 entsprechend eingefügt werden? Es ist ein wirklich einfaches Problem.

Zu diesem Zeitpunkt kann der Code des ersten Beispiels so verwendet werden, wie er ist. Daher ist er wahrscheinlich sehr einfach zu implementieren und sieht wie folgt aus.

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(newral_out - y_ph))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

Ist es danach in Ordnung, wenn ich Sie das lernen lasse?

# initialize tensorflow session
sess = tf.Session()
sess.run(tf.global_variables_initializer())

for k in range(101):
    # shuffle train_x and train_y
    n = np.random.permutation(len(train_x))
    train_x = train_x[n]
    train_y = train_y[n].reshape([len(train_y), 1])

    # execute train process
    sess.run(train,feed_dict = {
                     x_ph: train_x, # x is input data
                     y_ph: train_y # y is true data
                     })

Dies scheint einmal zu funktionieren, aber da es eine gute Idee ist, würde ich gerne wissen, wie sich die Parameter des Newral Network verhalten. Es scheint eine Möglichkeit zu geben, es direkt zu lesen, aber es scheint schwierig zu sein. Da es ein einfaches Problem ist, habe ich über meine eigene Analysefunktion nachgedacht.

Die Idee ist, w0, w1, w2 nach der Methode der kleinsten Quadrate zu finden. Stellen Sie sich das neuronale Netzwerk als virtuelle lineare Approximationsgleichung vor und überprüfen Sie seine Parameter. Geben Sie zuerst die Daten ein

{{x_1}_k},{{x_2}_k}

Und stellen Sie die durch Newral abgeleiteten Informationen ein

{y^{(new)}}_k = Newral({{x_1}_k},{{x_2}_k})

Wird besorgt. Dieses {y ^ {(neu)}} _k enthält eine definitive Zahl. Da die Schätzung des neuronalen Netzes möglicherweise eine Verzerrung aufweist, ist die folgende Gleichung zu berücksichtigen.

{y^{(new)}}_k = w_1{x_1}_k + w_2{x_2}_k + w0

Zu diesem Zeitpunkt sind w_1, w_2, w_0 unbekannt und die anderen werden bestimmt. Hier ist es für jedes k wie folgt, wenn es als simultane Gleichung betrachtet wird.

\left(
\begin{matrix}
{y^{(new)}}_1 \\
... \\
{y^{(new)}}_K \\
\end{matrix}
\right)
 = 
\left(
\begin{matrix}
{x_1}_1 & {x_2}_1 & 1 \\
... & ... \\
{x_1}_K & {x_2}_K & 1 \\
\end{matrix}
\right)
\left(
\begin{matrix}
w_1 \\
w_2 \\
w_0 \\
\end{matrix}
\right)

An diesem Punkt haben wir ein einfaches Problem der kleinsten Quadrate. Der Einfachheit halber

A
 = 
\left(
\begin{matrix}
{x_1}_1 & {x_2}_1 & 1 \\
... & ... \\
{x_1}_K & {x_2}_K & 1 \\
\end{matrix}
\right)

Und dann,

\left(
\begin{matrix}
w_1 \\
w_2 \\
w_0 \\
\end{matrix}
\right)
=
\left(
A^T A
\right)^{-1}
A^T
\left(
\begin{matrix}
{y^{(new)}}_1 \\
... \\
{y^{(new)}}_K \\
\end{matrix}
\right)

Es scheint also, dass die Parameter erhalten werden können. Wenn Sie beim Erstellen eines echten Werts w_1, w_2, w_0 auf einen numerischen Wert setzen und beobachten, wie Sie sich der richtigen Antwort nähern, werden Sie das Gefühl haben, den Inhalt des neuronalen Netzwerks ein wenig zu verstehen. (Lacht)

Also werde ich den gesamten Code einfügen.

import numpy as np
#import matplotlib.pyplot as plt
import tensorflow as tf


# deta making???
N = 50
x = np.random.rand(N,2)
# true param???
w = np.array([0.5,0.5]).reshape(2,1)
# sum > 1.0 > 1 : else > 0
#y = np.floor(np.sum(x,axis=1))
y = np.matmul(x,w)
train_x = x
train_y = y


# make placeholder
x_ph = tf.placeholder(tf.float32, [None, 2])
y_ph = tf.placeholder(tf.float32, [None, 1])
# create newral parameter(depth=1,input:2 > output:1)
newral_out = tf.layers.dense(x_ph, 1)


# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(newral_out - y_ph))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)


# initialize tensorflow session
sess = tf.Session()
sess.run(tf.global_variables_initializer())


for k in range(101):

    
    if np.mod(k,10) == 0:
        # get Newral predict data
        y_newral = sess.run( newral_out
                         ,feed_dict = {
                         x_ph: x, #Ich habe die Eingabedaten in x gesetzt
                         y_ph: y.reshape(len(y),1) #Ich habe die richtigen Antwortdaten in y eingegeben
                         })
        
        # check for newral_parameter(w0,w1,w2)???
        # 
        x_ext = np.hstack([x,np.ones(N).reshape(N,1)])
        A = np.linalg.inv( np.matmul(np.transpose(x_ext),x_ext) )
        A = np.matmul(A,np.transpose(x_ext))
        w_ext = np.matmul(A,y_newral)
        
        # errcheck??? ([newral predict] vs [true value])
        err = y_newral - y
        err = np.matmul(np.transpose(err),err)
        
        
        # check y_newral
        # check LS solution(approaching to NewralNet Parameter)
        # check predict NewralParam
        print('[%d] err:%.5f w1:%.2f w2:%.2f bias:%.2f' % (k,err,w_ext[0],w_ext[1],w_ext[2]))


    # shuffle train_x and train_y
    n = np.random.permutation(len(train_x))
    train_x = train_x[n]
    train_y = train_y[n].reshape([len(train_y), 1])

    # execute train process
    sess.run(train,feed_dict = {
                     x_ph: train_x, # x is input data
                     y_ph: train_y # y is true data
                     })

Ich habe nichts geschrieben, aber ich habe beschlossen, den Fehler durch die Summe der Quadrate zu berechnen. Betrachtet man dieses Ergebnis ... ???

[0] err:1.06784 w1:0.36 w2:0.36 bias:0.00
[10] err:0.02231 w1:0.45 w2:0.45 bias:0.06
[20] err:0.00795 w1:0.47 w2:0.47 bias:0.03
[30] err:0.00283 w1:0.48 w2:0.48 bias:0.02
[40] err:0.00101 w1:0.49 w2:0.49 bias:0.01
[50] err:0.00036 w1:0.49 w2:0.49 bias:0.01
[60] err:0.00013 w1:0.50 w2:0.50 bias:0.00
[70] err:0.00005 w1:0.50 w2:0.50 bias:0.00
[80] err:0.00002 w1:0.50 w2:0.50 bias:0.00
[90] err:0.00001 w1:0.50 w2:0.50 bias:0.00
[100] err:0.00000 w1:0.50 w2:0.50 bias:0.00

Da der wahre Parameter w1 = 0,5, w2 = 0,5, Vorspannung (w0) = 0 ist, scheint er nach etwa 30-maligem Drehen zu einem guten Gefühl zu konvergieren.

Das neuronale Netzwerk schien kompliziert zu sein, aber wenn man es so einfach macht, sieht es aus wie eine einfache lineare Kopplung und ein Ersatzschaltbild. Es mag ein Ergebnis sein, das für den Experten offensichtlich ist, aber es war eine große Ernte für mich.

Mit diesem Gefühl werde ich das nächste Mal etwas Komplizierteres ausprobieren!

Recommended Posts

Berühren Sie das Objekt des neuronalen Netzes
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Implementierung eines zweischichtigen neuronalen Netzwerks 2
Ruft die Attribute eines Objekts ab
Verstehen Sie die Anzahl der Eingabe- / Ausgabeparameter des Faltungs-Neuronalen Netzes
Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)
[Python3] Schreiben Sie das Codeobjekt der Funktion neu
Behalten Sie das mit PyBrain aufgebaute neuronale Netzwerk bei
Implementierung von "verschwommenen" neuronalen Netzen mit Chainer
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Parametrisches neuronales Netzwerk
Überprüfung der Chargennormalisierung mit einem mehrschichtigen neuronalen Netz
Ich habe das neuronale Netzwerk auf dem eigentlichen FPGA betrieben
Erkennung handgeschriebener Zahlen durch ein mehrschichtiges neuronales Netzwerk
Der Beginn von cif2cell
Fügen Sie Attribute von Klassenobjekten mit einer for-Anweisung hinzu
[Python] Berechnen Sie den Durchschnittswert des Pixelwerts RGB des Objekts
Implementieren Sie das Convolutional Neural Network
der Zen von Python
Bayesianische Optimierungsimplementierung von Hyperparametern des neuronalen Netzwerks (Chainer + GPyOpt)
Die Geschichte von sys.path.append ()
Implementieren Sie das neuronale Netzwerk von Grund auf neu
Erfahrung mit faltbaren neuronalen Netzen
Grundlagen von Netzwerkprogrammen?
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
Implementierung eines Faltungs-Neuronalen Netzwerks mit nur Numpy
Verringern Sie den Klassennamen der Anzeige des Erkennungsergebnisses der Objekterkennung
Ich habe das TensorFlow-Tutorial mit Kommentaren ausgeführt (erstes neuronales Netzwerk: Beginn des Klassifizierungsproblems)
Schätzen Sie die Gesamtspeicherauslastung eines Objekts grob ab
Rache der Typen: Rache der Typen
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
Kapitel 3 Neuronales Netz Schneiden Sie nur die guten Punkte des Deeplearning aus, die von Grund auf neu erstellt wurden
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Das verallgemeinerte lineare Modell (GLM) und das neuronale Netz sind gleich (1)
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
Maya | Ermitteln Sie die Anzahl der Polygone im ausgewählten Objekt
Mit den Daten von COVID-19 wurde ein Netzwerkdiagramm erstellt.
Drucken Sie den Namen des Objekts direkt unter dem in Blender angegebenen Objekt
Eine Einführung in die Objektorientierung: Ändern Sie den internen Status eines Objekts
Berühren wir die API der Netatmo Weather Station mit Python. #Python #Netatmo
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Das verallgemeinerte lineare Modell (GLM) und das neuronale Netz sind gleich (2)
Aufbau eines neuronalen Netzwerks, das XOR durch Z3 reproduziert
CNN Acceleration Series ~ FCNN: Einführung des Fourier Convolutional Neural Network ~
Implementieren Sie ein dreischichtiges neuronales Netzwerk
Scraping das Ergebnis von "Schedule-Kun"
Die Geschichte des Baus von Zabbix 4.4
Auf dem Weg zum Ruhestand von Python2
Fassen wir die Grundfunktionen von TensorFlow zusammen, indem wir ein neuronales Netzwerk erstellen, das XOR-Gatter lernt.
Neuronales Netzwerk mit Python (Scikit-Learn)
[Python] Wert des Funktionsobjekts (?)
3. Normalverteilung mit neuronalem Netz!
Vergleichen Sie die Schriftarten von Jupyter-Themen
Erläutern Sie den Code von Tensorflow_in_ROS
Verwenden Sie die Clustering-Ergebnisse erneut