[PYTHON] Selbststudien-Memo "Deep Learning from Grund" (Nr. 15) TensorFlow-Anfänger-Tutorial

Während ich "Deep Learning from Grund" (gelesen von Yasuki Saito, veröffentlicht von O'Reilly Japan) lese, werde ich die Websites notieren, auf die ich mich bezog. Teil 14 ← → Teil 16

Da Google Colab normal verwendet werden kann, werde ich den Inhalt dieses Buches mit TensorFlow testen.

TensorFlow Anfänger Tutorial

TensorFlow-Website https://www.tensorflow.org/?hl=ja Anfänger-Tutorial "First Neural Network" Ich habe es so bewegt, wie es war.

Wenn Sie es kopieren und in Colab einfügen, funktioniert es wirklich, sodass Sie keine besonderen Notizen machen müssen. Es gibt jedoch keine Erklärung für den Inhalt, da dies zur Bestätigung der Funktionsweise dient. Die notwendigen Erklärungen scheinen auf der gesamten Website verteilt zu sein, aber Anfänger gehen wahrscheinlich nach dem Tutorial verloren, ohne zu wissen, was sie jetzt getan haben oder was als nächstes zu tun ist.

Oder sagen Sie:

Vielleicht ist diese Seite überhaupt nicht für Anfänger gedacht, sondern für jemanden, der etwas über Python und Neuralnet weiß, damit TensorFlow mit Google Colab zusammenarbeitet. Eigentlich kann ich keine Erklärung für das neuronale Netzwerk selbst finden.

In dieser Hinsicht denke ich, dass es notwendig ist, ein Buch zu haben, das Erklärungen in der richtigen Reihenfolge sammelt, wie zum Beispiel "Deep Learning von Grund auf neu".

damit

Vergleichen wir das in diesem Tutorial ausgeführte Skript mit dem Inhalt von "Deep Learning von Grund auf neu", um herauszufinden, was Keras und TensorFlow tun.

Ein Modell bauen

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

Hier erstellen wir Keras Sequential Model.

type(model)

tensorflow.python.keras.engine.sequential.Sequential

model.summary()

Model: "sequential" Layer (type)       Output Shape       Param #


flatten (Flatten)      (None, 784)       0
dense (Dense)       (None, 128)      100480
dense_1 (Dense)      (None, 10)      1290


Total params: 101,770 Trainable params: 101,770 Non-trainable params: 0

Die Ausgabe (, 784) von der Eingabeebene ist In der nächsten dichten Schicht wird das Gewicht von (784, 128) mit Punkten multipliziert und (, 128) ausgegeben. Es wird mit dem Gewicht von (128, 10) in der nächsten dichten 1-Schicht punktmultipliziert und (, 10) ausgegeben.

model.layers

[tensorflow.python.keras.layers.core.Flatten at 0x7faf1e9efac8, tensorflow.python.keras.layers.core.Dense at 0x7faeea73b438, tensorflow.python.keras.layers.core.Dense at 0x7faeea73b710]

Erstellen Sie ein Modell mit der im Modul tensorflow.python.keras.engine.sequential.py definierten Sequential-Klasse. Die erste Ebene ist die Eingabeebene, die scheinbar nur "von einem 2D-Array (28 x 28 Pixel) in ein 1D-Array mit 28 x 28 = 784 Pixel konvertiert".

Nachdem die Pixel eindimensional sind, verfügt das Netzwerk über zwei tf.keras.layers.Dense-Ebenen. Diese Schichten sind eng oder vollständig verbundene Schichten von Neuronen. Die erste dichte Schicht hat 128 Knoten (oder Neuronen). Die zweite Schicht, die auch die letzte Schicht ist, ist die Softmax-Schicht mit 10 Knoten. Diese Ebene gibt ein Array von 10 Wahrscheinlichkeiten zurück, die sich zu 1 addieren. Jeder Knoten gibt die Wahrscheinlichkeit aus, dass das Bild, das Sie betrachten, zu jeder der 10 Klassen gehört.

Daher scheint es der zweischichtigen neuronalen Netzwerkklasse TwoLayerNet zu entsprechen, die auf Seite 113 des Buches "Deep Learning from Grund" erläutert wurde. Die Aktivierungsfunktion der TwoLayerNet-Klasse war jedoch die Sigmoid-Funktion, aber dieses sequenzielle Keras-Modell gibt die Relu-Funktion an.

Dicht Es scheint eine vollständig verbundene Schicht in dem Sinne zu sein, dass sie "dicht, (...) dicht und dicht" ist.

"Deep Learning von Grund auf neu" P205 Es gab eine Verbindung zwischen allen Neuronen in der benachbarten Schicht. Dies wird als vollständig verbunden bezeichnet und wir haben die vollständig verbundene Schicht unter dem Namen Affine Schicht implementiert.

Es scheint zu entsprechen.

dichte Parameter

Einheiten, Anzahl der Ausgangsabmessungen Aktivierung = Keine, zu verwendende Aktivierungsfunktion (falls nicht angegeben, wird die Aktivierungsfunktion nicht verwendet) use_bias = True, ob Bias verwendet werden soll kernel_initializer = 'glorot_uniform', Anfangsgewicht Bias_Initializer = 'Nullen', Anfangswert des Bias kernel_regularizer = Keine, Regularisierungsfunktion auf Gewichtsmatrix angewendet Bias_regularizer = Keine, Regularisierungsfunktion auf Bias angewendet activity_regularizer = Keine, Regularisierungsfunktion für Layer-Ausgabe (Aktivierung) kernel_constraint = Keine, Einschränkungsfunktion Bias_Constraint = Keine, Einschränkungsfunktion **kwargs

Aktivierungsfunktion

softmax elu selu softplus softsign relu tanh sigmoid hard_sigmoid linear

Etwa die Hälfte wurde in "Deep Learning von Grund auf neu" erklärt. linear ist die konstante Funktion von P66.

Anfangswert des Gewichts

glorot_uniform Standardwert Gibt die Initialisierung durch Glorots Gleichverteilung (Xaviers Gleichverteilung) zurück.

Aus der Keras-Dokumentation Dies entspricht der gleichmäßigen Verteilung mit [limit, -limit] als Bereich, wenn limit sqrt ist (6 / (fan_in + fan_out)). Dabei ist fan_in die Anzahl der Eingabeeinheiten und fan_out die Anzahl der Ausgabeeinheiten.

glorot_normal Gibt die Initialisierung durch Glorots Normalverteilung zurück (mit Xaviers Normalverteilung). "Deep Learning von Grund auf neu" p182 "Anfangswert von Xavier" Gaußsche Verteilung mit $ \ frac {1} {\ sqrt n} $ als Standardabweichung, wenn die Anzahl der Knoten in der vorherigen Schicht n beträgt

he_normal Gibt die Initialisierung durch Normalverteilung von He zurück "Tiefes Lernen von Grund auf neu" p184 "Anfangswert von He" Gaußsche Verteilung mit $ \ sqrt \ frac {2} {n} $ als Standardabweichung, wenn die Anzahl der Knoten in der vorherigen Schicht n beträgt

random_normal Initialisieren Sie die Gewichte gemäß der Normalverteilung. Wenn als Zeichenfolge angegeben, wird sie mit den Einstellungen mean = 0.0, stddev = 0.05 und seed = None (Gaußsche Verteilung mit einer Standardabweichung von 0.05) initialisiert. Wenn Sie den Parameter einstellen möchten, geben Sie ihn mit der folgenden Funktion an. keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)

"Deep Learning von Grund auf neu" P184 Da die Sigmoidfunktion und die Tanh-Funktion symmetrisch sind und als lineare Funktion in der Nähe des Zentrums angesehen werden können, "Anfangswert von Xavier" ist geeignet. Wenn Sie ReLU verwenden, spezialisieren Sie sich auf ReLU. Es wird empfohlen, den Anfangswert zu verwenden. Es ist ein frühes Stadium, das von Kaiming He et al. Wert - Der Name ist auch "Anfangswert von He".

Parameter, die mit der Methode model.compile angegeben werden können

model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Beim Kompilieren des Modells wird Adam für das Optimierungsprogramm und sparse_categorical_crossentropy für die Verlustfunktion angegeben.

Optimierer = 'rmsprop', Optimierer-Standard ist rmsprop Verlust = Keine, Verlustfunktion Metriken = Keine, Bewertungsfunktion loss_weights=None, weighted_metrics=None, run_eagerly=None, **kwargs

Optimierer Optimierer

SGD RMSprop Adagrad Adadelta Adam Adamax Nadam TFOptimizer

Verlust der Verlustfunktion

mean_squared_error mean_absolute_error mean_absolute_percentage_error mean_squared_logarithmic_error squared_hinge hinge categorical_hinge logcosh categorical_crossentropy sparse_categorical_crossentropy binary_crossentropy kullback_leibler_divergence poisson cosine_proximity

Mittelwert ~ ist die Verlustfunktion, die im Regressionsproblem verwendet wird ~ Crossentropy ist eine Verlustfunktion, die bei Klassifizierungsproblemen verwendet wird und in "Deep Learning from Grund" P89 erläutert wird. Es scheint, dass categoryical_crossentropy verwendet wird, wenn die korrekte Bezeichnung ein One-Hot-Ausdruck ist, und sparse_categorical_crossentropy, wenn der Zielwert eine Ganzzahl ist.

Bewertungsfunktionsmetriken

Nach dem Kommentar in der Kompilierungsmethode geschrieben

Verwenden Sie normalerweise metrics = ['Genauigkeit'].

darüber. Ebenfalls,

Wenn Sie die Zeichenfolge "Genauigkeit" oder "acc" übergeben, Basierend auf der verwendeten Verlustfunktion und der Ausgabeform des Modells ist dies "tf.keras.metrics.BinaryAccuracy". tf.keras.metrics.CategoricalAccuracytf.keras.metrics.SparseCategoricalAccuracy In eines von konvertieren.

darüber.

Es scheint, dass Sie auch "metrics = ['mae'] "angeben können, aber dies scheint für Regressionsprobleme zu sein und den mittleren absoluten Fehler zu finden. Es scheint auch, dass Sie eine Verlustfunktion angeben können, also nicht verwirren.

damit

Konvertiert die Zeichenfolge "Genauigkeit" ~ in eine der Zeichenfolgen "tf.keras.metrics.SparseCategoricalAccuracy".

Wie Sie sehen können, scheint die Funktion selbst tatsächlich angegeben zu sein. Wenn Sie sie jedoch mit einer Zeichenfolge angeben, wird sie konvertiert. Dies gilt auch für Optimierungs- und Verlustfunktionen. Wenn Sie es als Zeichenfolge angeben, ist es leichter zu verstehen und es ist weniger wahrscheinlich, dass Sie einen Fehler machen, aber der Parameter ist der Standardwert.

Wenn Sie beispielsweise "adam" im Optimierer angeben, wird die Klasse Adam im Modul tensorflow.python.keras.optimizer_v2.adam.py aufgerufen. Die folgenden Parameter sind jedoch standardmäßig festgelegt. learning_rate=0.001, beta_1=0.9, beta_2=0.999,

"Deep Learning von Grund auf neu" P175 Adam stellt drei Hyperparameter ein. Einer ist der bisherige Lernkoeffizient (erschien in der Arbeit als α). Die beiden letzteren sind der Koeffizient β 1 für das primäre Moment und der Koeffizient β 2 für das sekundäre Moment. Dem Papier zufolge betragen die Standardeinstellungen 0,9 für β1 und 0,999 für β2, und diese Einstellung scheint in den meisten Fällen zu funktionieren.

Es scheint also kein Problem mit dem Standardwert zu geben, aber wenn Sie dies ändern möchten, müssen Sie die Funktion direkt angeben.

model.compile(optimizer=keras.optimizers.Adam(0.001, 0.9, 0.999), 
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=[keras.metrics.SparseCategoricalAccuracy()])

Modelltraining

model.fit(train_images, train_labels, epochs=5)

Trainieren (lernen) Sie mit der model.fit-Methode. Geben Sie das Bild und die Beschriftung der Trainingsdaten an. Epochen Die Anzahl der Epochen wird mit 5 angegeben. Wenn Sie das Lernen fünfmal wiederholen, wird das Ausführungsergebnis von fünf Zeilen wie unten gezeigt angezeigt, wenn Sie es tatsächlich ausführen.

Epoch 1/5 1875/1875 [==============================] - 2s 1ms/step - loss: 1.5450 - accuracy: 0.6806 Epoch 2/5 1875/1875 [==============================] - 2s 1ms/step - loss: 0.7987 - accuracy: 0.8338 Epoch 3/5 1875/1875 [==============================] - 2s 1ms/step - loss: 0.5804 - accuracy: 0.8666 Epoch 4/5 1875/1875 [==============================] - 2s 1ms/step - loss: 0.4854 - accuracy: 0.8804 Epoch 5/5 1875/1875 [==============================] - 2s 1ms/step - loss: 0.4319 - accuracy: 0.8893 tensorflow.python.keras.callbacks.History at 0x7fd89467f550

Die Parameter der Anpassungsmethode sind wie folgt x = Keine, Trainingsdaten (Bild) y = Keine, Trainingsdaten (Etikett) batch_size = Keine, Stapelgröße Anzahl der Daten, die in einem Stapel verarbeitet werden sollen Der Standardwert ist 32 Epochen = 1, Anzahl des Lernens ausführlich = 1, Protokollausgabespezifikation 0: nicht Ausgabe 1, 2: Ausgabe callbacks=None, validation_split=0., validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_batch_size=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False

Da es 60.000 Trainingsdaten gibt und die Standard-Stapelgröße 32 beträgt, iter_per_epoch Die Anzahl der Iterationen beträgt 60000 ÷ 32 = 1875 Wenn Sie 1875 Teile in einer Epoche stapelweise verarbeiten (lernen), werden alle Trainingsdaten angezeigt. Dies wird 5 mal wiederholt.

Bewertung der richtigen Antwortrate

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)

313/313 - 0s - loss: 0.3390 - accuracy: 0.8781 Test accuracy: 0.8780999779701233

Parameter der model.evaluate-Methode

x = Keine, Testdaten (Bild) y = Keine, Testdaten (Etikett) batch_size = Keine, Standardmäßig ist die Stapelgröße 32 ausführlich = 1, Protokollausgabespezifikation 0: nicht Ausgabe 1, 2: Ausgabe sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, return_dict=False

Gibt den Verlustwert und die Genauigkeitsrate der Testdaten im trainierten Modell zurück

Auf der TensorFlow-Site bin ich mir nicht sicher, wie die Parameter lauten, daher habe ich auf diese Site verwiesen. Die Erklärung reicht nicht aus, aber Sie können sehen, was Sie angeben können. →Keras DocumentationKerasAPIref

Teil 14 ← → Teil 16 Klicken Sie hier, um eine Liste der Memos usw. anzuzeigen. Unlesbares Glossar

Recommended Posts

Selbststudien-Memo "Deep Learning from Grund" (Nr. 15) TensorFlow-Anfänger-Tutorial
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 11) CNN
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 19) Datenerweiterung
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
Selbststudien-Memo "Deep Learning from Grund" (Nr. 18) Eins! Miau! Grad-CAM!
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Selbststudien-Memo "Deep Learning from Grund" (Nr. 13) Verwenden Sie Google Colaboratory
"Deep Learning from Grund" Memo zum Selbststudium (10) MultiLayerNet-Klasse
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 10-2) Anfangswert des Gewichts
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
[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 from Grund" Memo zum Selbststudium (Nr. 16) Ich habe versucht, SimpleConvNet mit Keras zu erstellen
Deep Learning von Grund auf neu
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 14) Führen Sie das Programm in Kapitel 4 in Google Colaboratory aus
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
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
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
Deep Learning Memo von Grund auf neu gemacht
Deep Learning / Deep Learning von Null 2 Kapitel 6 Memo
Deep Learning Tutorial aus dem Umgebungsbau
"Deep Learning from Grund" Memo zum Selbststudium (Teil 8) Ich habe die Grafik in Kapitel 6 mit matplotlib gezeichnet
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
GitHub des guten Buches "Deep Learning von Grund auf neu"
Python vs Ruby "Deep Learning von Grund auf neu" Zusammenfassung
Django Memo # 1 von Grund auf neu
[Deep Learning von Grund auf neu] Ich habe die Affine-Ebene implementiert
Anwendung von Deep Learning 2 von Grund auf neu Spam-Filter
Ich habe versucht, Dropout zu erklären
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Versuchen Sie es mit TensorFlow
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 1
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
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Deep Learning / LSTM Scratch Code
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
Ein Amateur stolperte in Deep Learning von Grund auf neu Hinweis: Kapitel 2
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.