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-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.
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.
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
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.
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".
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
SGD RMSprop Adagrad Adadelta Adam Adamax Nadam TFOptimizer
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.
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.CategoricalAccuracy
、tf.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()])
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.
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 Documentation、KerasAPIref
Teil 14 ← → Teil 16 Klicken Sie hier, um eine Liste der Memos usw. anzuzeigen. Unlesbares Glossar
Recommended Posts