Σύνοψη Keras

Άνοιγμα στο TensorFlow.org Εκτέλεση στο Google Colab Προβολή πηγαίου στο GitHub Λήψη "σημειωματάριου"

Ο οδήγός αυτός προσφέρει τα βασικά ώστε να ξεκινήσετε να χρησιμοποιείτε το Keras. Η διάρκεια ανάγνωσης του είναι περίπου 10 λεπτά.

Εισαγωγή tf.keras

tf.keras . Πρόκειται για την υλοποίησης Διασύνδεσης Προγραμματισμού Εφαρμογών (API) του Keras. Είναι ένα API υψηλού επιπέδου που μπορεί να δημιουργήσει και να εκπαιδεύσει μοντέλα τα οποία θα υποστηρίζουν άμεσα τις υπόλοιπες λειτουργίες του TensorFlow , όπως η "ενθουσιώδης" εκτέλεση , tf.data αγωγοί , και Εκτιμητές

Το tf.keras καθιστά το TensorFlow ευκολότερο στη χρήση , χωρίς να θυσιάζει σε προσαρμοστικότητα και απόδοση

Για να ξεκινήσετε , εισάγετε το tf.keras ως μέρος του προγράμματος TensorFlow σας :

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf

from tensorflow import keras

Το tf.keras μπορέι να τρέξει οποιοδήποτε κομμάτι συμβατού κώδικα Keras , ωστόσο να έχετε υπόψιν σας τα εξής :

Δημιουργία απλού μοντέλου

Σειριακό μοντέλο

Στο Keras , συναθροίζοντας στρώματα(layers) δημιουργούνται τα μοντελα (models). Ένα μοντέλο είναι (συνήθως) ένα γράφημα στρωμάτων. Ο πιο συνηθισμένος τύπος μοντέλου είναι η στοίβα (stack) στρωμάτων : το tf.keras.Sequential μοντέλο

Για την κατασκευή ενός απλού, πλήρως συνδεδεμένου (νευρωνικού) δικτύου (για παράδειγμα : πολυεπίπεδο perceptron):

from tensorflow.keras import layers

model = tf.keras.Sequential()
# Adds a densely-connected layer with 64 units to the model:
model.add(layers.Dense(64, activation='relu'))
# Add another:
model.add(layers.Dense(64, activation='relu'))
# Add a softmax layer with 10 output units:
model.add(layers.Dense(10, activation='softmax'))

Μπορείτε να βρείτε ένα ολοκληρωμένο και σύντομο παράδειγμα για το πώς χρησιμοποιούνται τα σειριακά μοντέλα εδώ

Για να μάθετε να δημιουργείτε πιο προχωρημένα μοντέλα από τα σειριακά , δέιτε τα εξής :

Διαμόρφωση των επιπέδων

Υπάρχουν πολλά επίπεδα tf.keras.layers διαθέσιμα. Τα περισσότερα από αυτά έχουν συνήθη ορίσματα στον κατασκευαστή :

  • activation : Θέτει τη συνάρτηση ενεργοποίησης το επίπεδο. Η παράμετρος αυτή διασαφηνίζεται από το όνομα μίας προεγκατεστημένης συνάρτησης , διαφορετικά ως ένα προς κλήση αντικείμενο. Ως προεπιλογή , δεν εφαρμόζεται activation
  • kernel_initializer και bias_initializer : Τα σχέδια αρχικοποίησης που δημιουργούν τα βάρη του επιπέδου (kernel και bias). Η παράμετρος αυτή είναι είτε όνομα είτε αντικείμενο που μπορεί να κληθεί . Αρχικοποιείται , ως προεπιλογή , στον "Glorot uniform" αρχικοποιητή.
  • kernel_regularizer και bias_regularizer : Τα σχέδια ρύθμισης που εφαρμόζουν τα βάρη του επιπέδου (kernel και bias), όπως για παράδειγμα οι L1 or L2 regularization (L1 ή L2 ρυθμίσεις). Ως προεπιλογή , δεν εφαρμόζεται regularization

Ο ακόλουθος κώδικας δίνει υπόσταση στα tf.keras.layers.Dense επίπεδα με τη χρήση ορισμάτων σε κατασκευαστές :

# Create a sigmoid layer:
layers.Dense(64, activation='sigmoid')
# Or:
layers.Dense(64, activation=tf.keras.activations.sigmoid)

# A linear layer with L1 regularization of factor 0.01 applied to the kernel matrix:
layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l1(0.01))

# A linear layer with L2 regularization of factor 0.01 applied to the bias vector:
layers.Dense(64, bias_regularizer=tf.keras.regularizers.l2(0.01))

# A linear layer with a kernel initialized to a random orthogonal matrix:
layers.Dense(64, kernel_initializer='orthogonal')

# A linear layer with a bias vector initialized to 2.0s:
layers.Dense(64, bias_initializer=tf.keras.initializers.Constant(2.0))
<tensorflow.python.keras.layers.core.Dense at 0x7f0d54c37dd8>

Μάθηση και αξιολόγηση

Στήνοντας την μάθηση

Αφότου έχει κατασκευαστεί το μοντέλο, ορίστε την διαδικασία μάθησης καλώντας την μέθοδο compile:

model = tf.keras.Sequential([
# Adds a densely-connected layer with 64 units to the model:
layers.Dense(64, activation='relu', input_shape=(32,)),
# Add another:
layers.Dense(64, activation='relu'),
# Add a softmax layer with 10 output units:
layers.Dense(10, activation='softmax')])

model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

Η μέθοδος tf.keras.Model.compile δέχεται 3 σημαντικά ορίσματα :

  • optimizer : Το αντικείμενο αυτό προσδιορίζει την διαδικασία μάθησης. Περάστε στιγμιότυπα βελτιστοποίησης (optimizer instances) από το άρθρωμα (module) tf.keras.optimizers , όπως tf.keras.optimizers.Adam ή tf.keras.optimizers.SGD. Αν θέλετε να χρησιμοποιήσετε τις προεπιλεγμένες παραμέτρους , μπορείτε να προσδιορίσετε βελτιστοποιητές μέσω συμβολοσειρών(strings) , όπως adam ή sgd.
  • loss : Η συνάρτηση που πρέπει να ελαχιστοποιείται κατά τη βελτιστοποίηση. Συνήθεις επιλογές είναι η μέση τετραγωνική απόκλιση(mse) ,categorical_crossentropy, και binary_crossentropy. Oι loss functions προσδιορίζονται μέσω του ονόματος ή παιρνώντας ένα αντικείμενο από το άρθρωμα tf.keras.losses.
  • metrics: Χρησιμοποιείται για την παρακολούθηση της διαδικασίας. Πρόκειται για συμβολοσειρές ή για προς κλήση αντικείμενα από το άρθρωμα tf.keras.metrics
  • Επιπρόσθετα , για να βεβαιωθείτε ότι το μοντέλο μαθαίνει και αξιολογεί eagerly("ενθουσιωδώς"), μπορείτε να θέσετε run_eagerly=True ως παράμετρο κατά την μεταγλώττιση

Ο ακόλουθος κώδικας υλοποιεί μερικά παραδείγματα παραμετροποίησης μοντέλου για μάθηση :

# Configure a model for mean-squared error regression.
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss='mse',       # mean squared error
              metrics=['mae'])  # mean absolute error

# Configure a model for categorical classification.
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01),
              loss=tf.keras.losses.CategoricalCrossentropy(),
              metrics=[tf.keras.metrics.CategoricalAccuracy()])

Μάθηση από NumPy δεδομένα

Σε μικρό όγκο δεδομένων,συνιστάται η χρήση των in-memory πινάκων NumPy για την μάθηση και την αξιολόγηση ενός μοντέλου. Το μοντέλο "ταιριάζει" στα δεδομένα εκμάθησης μέσω της μεθόδου fit :

import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.fit(data, labels, epochs=10, batch_size=32)
Train on 1000 samples
Epoch 1/10
1000/1000 [==============================] - 1s 716us/sample - loss: 189.2385 - categorical_accuracy: 0.0940
Epoch 2/10
1000/1000 [==============================] - 0s 80us/sample - loss: 764.7758 - categorical_accuracy: 0.1030
Epoch 3/10
1000/1000 [==============================] - 0s 82us/sample - loss: 1611.0833 - categorical_accuracy: 0.1030
Epoch 4/10
1000/1000 [==============================] - 0s 81us/sample - loss: 2762.8416 - categorical_accuracy: 0.0950
Epoch 5/10
1000/1000 [==============================] - 0s 79us/sample - loss: 3991.0301 - categorical_accuracy: 0.1110
Epoch 6/10
1000/1000 [==============================] - 0s 79us/sample - loss: 5485.9669 - categorical_accuracy: 0.1040
Epoch 7/10
1000/1000 [==============================] - 0s 79us/sample - loss: 7383.6389 - categorical_accuracy: 0.1000
Epoch 8/10
1000/1000 [==============================] - 0s 81us/sample - loss: 9679.2860 - categorical_accuracy: 0.1010
Epoch 9/10
1000/1000 [==============================] - 0s 80us/sample - loss: 11467.4744 - categorical_accuracy: 0.1110
Epoch 10/10
1000/1000 [==============================] - 0s 80us/sample - loss: 14393.6878 - categorical_accuracy: 0.0900

<tensorflow.python.keras.callbacks.History at 0x7f0d54318320>

Η μέθοδος tf.keras.Model.fit δέχεται 3 ορίσματα :

  • epochs : Η μάθηση οργανώνεται σε εποχές (epochs). Εποχή είναι μία επανάληψη σε όλο τον όγκο των δεδομένων εισόδου(αυτό γίνεται πρώτα σε μικρότερες "δεσμίδες" δεδομένων)
  • batch_size : Όταν περνάνε τα δεδομένα NumPy , το μοντέλο τα τεμαχίζει σε (μικρότερες) "δεσμίδες" και εκτελεί επαναλήψεις πάνω σε αυτές κατά την εκμάθηση.
  • validation_data : Όταν δημιουργείτε ένα πρωτότυπο ενός μοντέλους , θα ήταν επιθυμητό να παρακολουθείτε με ευκολία την απόδοσή του σε μερικά δεδομένα επαλήθευσης (validation data). Περνώντας αυτό το όρισμα -μία πλειάδα εισόδων και "ετικετών"- επιτρέπετε στο μοντέλο να δείχνει την απώλεια και τις μετρήσεις σε "συμπερασματική" λειτουργία (inference mode) για τα εισαγώμενα δεδομένα, στο τέλος κάθε εποχής

Ακολουθεί παράδειγμα με την χρήση της validation_data :

import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))

model.fit(data, labels, epochs=10, batch_size=32,
          validation_data=(val_data, val_labels))
Train on 1000 samples, validate on 100 samples
Epoch 1/10
1000/1000 [==============================] - 0s 175us/sample - loss: 17254.2305 - categorical_accuracy: 0.1070 - val_loss: 18553.6463 - val_categorical_accuracy: 0.1300
Epoch 2/10
1000/1000 [==============================] - 0s 91us/sample - loss: 19889.6731 - categorical_accuracy: 0.1110 - val_loss: 17542.3515 - val_categorical_accuracy: 0.1500
Epoch 3/10
1000/1000 [==============================] - 0s 92us/sample - loss: 23624.1192 - categorical_accuracy: 0.0880 - val_loss: 22255.7791 - val_categorical_accuracy: 0.1500
Epoch 4/10
1000/1000 [==============================] - 0s 93us/sample - loss: 26351.2096 - categorical_accuracy: 0.1140 - val_loss: 30696.5959 - val_categorical_accuracy: 0.0600
Epoch 5/10
1000/1000 [==============================] - 0s 93us/sample - loss: 30272.1742 - categorical_accuracy: 0.1040 - val_loss: 31481.7487 - val_categorical_accuracy: 0.0900
Epoch 6/10
1000/1000 [==============================] - 0s 92us/sample - loss: 33734.7068 - categorical_accuracy: 0.1010 - val_loss: 38571.5617 - val_categorical_accuracy: 0.1500
Epoch 7/10
1000/1000 [==============================] - 0s 92us/sample - loss: 38845.4787 - categorical_accuracy: 0.1010 - val_loss: 39966.4361 - val_categorical_accuracy: 0.0900
Epoch 8/10
1000/1000 [==============================] - 0s 93us/sample - loss: 41940.6970 - categorical_accuracy: 0.1130 - val_loss: 32284.8275 - val_categorical_accuracy: 0.0900
Epoch 9/10
1000/1000 [==============================] - 0s 92us/sample - loss: 47264.2168 - categorical_accuracy: 0.0960 - val_loss: 59353.0475 - val_categorical_accuracy: 0.1300
Epoch 10/10
1000/1000 [==============================] - 0s 90us/sample - loss: 52214.4779 - categorical_accuracy: 0.0950 - val_loss: 53452.8366 - val_categorical_accuracy: 0.0700

<tensorflow.python.keras.callbacks.History at 0x7f0d541ad780>

Μάθηση από σύνολα δεδομένων(datasets) tf.data

Χρησιμοποιείστε τo Datasets API για να κλιμακώσετε μεγάλα σύνολα δεδομένων ή μάθηση σε πολλές συσκευές. Περάστε ένα tf.data.Dataset στιγμιότυπο στην μέθοδο fit :

# Instantiates a toy dataset instance:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

model.fit(dataset, epochs=10)
Train for 32 steps
Epoch 1/10
32/32 [==============================] - 0s 10ms/step - loss: 55800.7787 - categorical_accuracy: 0.0960
Epoch 2/10
32/32 [==============================] - 0s 3ms/step - loss: 62740.8243 - categorical_accuracy: 0.0920
Epoch 3/10
32/32 [==============================] - 0s 3ms/step - loss: 66679.0899 - categorical_accuracy: 0.1110
Epoch 4/10
32/32 [==============================] - 0s 3ms/step - loss: 73234.8438 - categorical_accuracy: 0.1060
Epoch 5/10
32/32 [==============================] - 0s 3ms/step - loss: 79254.9882 - categorical_accuracy: 0.1040
Epoch 6/10
32/32 [==============================] - 0s 3ms/step - loss: 85622.9984 - categorical_accuracy: 0.1030
Epoch 7/10
32/32 [==============================] - 0s 3ms/step - loss: 89436.8638 - categorical_accuracy: 0.1120
Epoch 8/10
32/32 [==============================] - 0s 3ms/step - loss: 100403.1088 - categorical_accuracy: 0.1010
Epoch 9/10
32/32 [==============================] - 0s 3ms/step - loss: 103928.8969 - categorical_accuracy: 0.0980
Epoch 10/10
32/32 [==============================] - 0s 3ms/step - loss: 112558.8554 - categorical_accuracy: 0.1090

<tensorflow.python.keras.callbacks.History at 0x7f0d54337668>

Από τη στιγμή που το Dataset παράγει "δεσμίδες" δεδομένων , αυτό το απόσπασμα δεν απαίτει το batch_size.

Τα σύνολα δεδομένων μπορούν να χρησιμοποιηθούν και για επιβεβαίωση :

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32)

model.fit(dataset, epochs=10,
          validation_data=val_dataset)
Train for 32 steps, validate for 4 steps
Epoch 1/10
32/32 [==============================] - 0s 5ms/step - loss: 118180.8180 - categorical_accuracy: 0.1160 - val_loss: 106175.7402 - val_categorical_accuracy: 0.0700
Epoch 2/10
32/32 [==============================] - 0s 3ms/step - loss: 128135.7680 - categorical_accuracy: 0.0880 - val_loss: 134933.7988 - val_categorical_accuracy: 0.0900
Epoch 3/10
32/32 [==============================] - 0s 3ms/step - loss: 130229.8513 - categorical_accuracy: 0.0930 - val_loss: 173920.7578 - val_categorical_accuracy: 0.1500
Epoch 4/10
32/32 [==============================] - 0s 3ms/step - loss: 143772.3367 - categorical_accuracy: 0.0930 - val_loss: 207047.4805 - val_categorical_accuracy: 0.0600
Epoch 5/10
32/32 [==============================] - 0s 3ms/step - loss: 149663.8907 - categorical_accuracy: 0.1010 - val_loss: 114527.5703 - val_categorical_accuracy: 0.1000
Epoch 6/10
32/32 [==============================] - 0s 3ms/step - loss: 161475.5014 - categorical_accuracy: 0.0790 - val_loss: 163735.2383 - val_categorical_accuracy: 0.1000
Epoch 7/10
32/32 [==============================] - 0s 3ms/step - loss: 165114.4864 - categorical_accuracy: 0.1140 - val_loss: 204209.3672 - val_categorical_accuracy: 0.1000
Epoch 8/10
32/32 [==============================] - 0s 3ms/step - loss: 174453.2307 - categorical_accuracy: 0.1190 - val_loss: 219636.3320 - val_categorical_accuracy: 0.1000
Epoch 9/10
32/32 [==============================] - 0s 3ms/step - loss: 183308.6876 - categorical_accuracy: 0.0920 - val_loss: 153133.1289 - val_categorical_accuracy: 0.1000
Epoch 10/10
32/32 [==============================] - 0s 3ms/step - loss: 194187.1009 - categorical_accuracy: 0.0940 - val_loss: 200069.8164 - val_categorical_accuracy: 0.1000

<tensorflow.python.keras.callbacks.History at 0x7f0d54140668>

Αξιολόγηση και πρόβλεψη

Οι tf.keras.Model.evaluate και tf.keras.Model.predict μέθοδοι μπορούν να χρησιμοποιήσουν δεδομένα NumPy και ένα tf.data.Dataset.

Ακολουθεί ο τρόπος αξιολόγησης "συμπερασματικής" λειτουργίας των απωλειών και των μετρήσεων για τα παρεχόμενα δεδομένα :

# With Numpy arrays
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.evaluate(data, labels, batch_size=32)

# With a Dataset
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

model.evaluate(dataset)
1000/1000 [==============================] - 0s 57us/sample - loss: 189905.3355 - categorical_accuracy: 0.0890
32/32 [==============================] - 0s 2ms/step - loss: 190392.3955 - categorical_accuracy: 0.0890

[190392.3955078125, 0.089]

Με αυτό το απόσπασμα μπορείτε να προβλέψετε την έξοδο του τελευταίου επιπέδου σε inference για τα παρεχόμενα δεδομένα , ως έναν πίνακα NumPy :

result = model.predict(data, batch_size=32)
print(result.shape)
(1000, 10)

Για έναν ολοκληρωμένο οδηγό στην εκμάθηση και την αξιολόγηση , ο οποίος περιλαμβάνει και οδηγίες για συγγραφή προσαρμοσμένων loops μαθήσεως από το μηδέν , δείτε τον οδηγό αυτό.

Δημιουργία σύνθετων μοντέλων

To Functional API

Το μοντέλο tf.keras.Sequential είναι μία απλή στοίβα επιπέδων η οποία δεν μπορεί να εκπροσωπήσει αυθαίρετα μοντέλα . Με τη χρήση του Keras functional API μπορείτε να φτιάξετε σύνθετες τοπολογίες μοντέλων όπως :

  • Μοντέλα πολλαπλών εισόδων,
  • Μοντέλα πολλαπλών εξόδων,
  • Μοντέλα με κοινόχρηστα επίπεδα (το ίδιο επίπεδο να καλείται πολλαπλές φορές),
  • Μοντέλα με μη σειριακή ροή δεδομένων (π.χ residual connections)

H δημιουργία μοντέλων με το functional API ακολουθεί το εξής :

  1. Ένα στιγμιότυπο ενός επιπέδου καλείται και επιστρέφει έναν τανυστή(tensor).
  2. Τανυστές εισόδου και εξόδου χρησιμοποιούνται για να ορίσουν μία κατάσταση της tf.keras.Model.
  3. Το μοντέλο μαθαίνει κατά τον ίδιο τρόπο με το Σειριακό μοντέλο.

Το ακόλουθο παράδειγμα χρησιμοποιεί το functional API για να φτιάξει ένα απλό, πλήρως συνδεδεμένο (νευρωνικό) δίκτυο :

inputs = tf.keras.Input(shape=(32,))  # Returns an input placeholder

# A layer instance is callable on a tensor, and returns a tensor.
x = layers.Dense(64, activation='relu')(inputs)
x = layers.Dense(64, activation='relu')(x)
predictions = layers.Dense(10, activation='softmax')(x)

Δώστε υπόσταση στο μοντέλο με είσοδο και έξοδο:

model = tf.keras.Model(inputs=inputs, outputs=predictions)

# The compile step specifies the training configuration.
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Trains for 5 epochs
model.fit(data, labels, batch_size=32, epochs=5)
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 434us/sample - loss: 13.4625 - accuracy: 0.1000
Epoch 2/5
1000/1000 [==============================] - 0s 79us/sample - loss: 22.9841 - accuracy: 0.0970
Epoch 3/5
1000/1000 [==============================] - 0s 81us/sample - loss: 34.7539 - accuracy: 0.1040
Epoch 4/5
1000/1000 [==============================] - 0s 79us/sample - loss: 48.1720 - accuracy: 0.0920
Epoch 5/5
1000/1000 [==============================] - 0s 81us/sample - loss: 62.1887 - accuracy: 0.0910

<tensorflow.python.keras.callbacks.History at 0x7f0d485d26d8>

Υποκατηγοριοποίηση στα μοντέλα

Φτιάξτε ένα πλήρως παραμετροποιήσιμο μοντέλο υποκατηγοριοποιώντας την tf.keras.Model και ορίζοντας το δικό σας "προς τα εμπρος πέρασμα"(forward pass,κοινώς διαδικασία υπολογισμού η οποία ξεκινάει από το 1ο προς το τελευταίο επίπεδο). Κατασκευάστε επίπεδα στην μέθοδο __init__ και θέστε τα ως ιδιότητες της κλάσης . Ορίστε έπειτα το "προς τα εμπρος πέρασμα"(forward pass)στην μέθοδο call.

Η υποκατηγοριοποίηση στα μοντέλα είναι ιδιαίτερα χρήσιμη όταν η "ενθουσιώδης" εκτέλεση είναι ενεργοποιημένη ,καθώς επιτρέπει το "προς τα εμπρος πέρασμα"(forward pass) να εγγράφεται αναγκαστικά.

Σημείωση: αν το μοντέλο σας χρειάζεται να τρέχει πάντα αναγκαστικά, μπορείτε να θέσετε dynamic=True όταν καλείται ο super κατασκευαστής.

Σημείο κλειδί : Χρησιμοποιήστε το σωστό , ανάλογα με την δουλειά , API . Παρόλο που η χρήση της υποκατηγοριοποίηση προσφέρει ευελιξία , κοστίζει σε πολυπλοκότητα και σε μεγαλύτερα περιθώρια για σφάλματα χρήστη. Αν είναι εφικ΄το , προτιμήστε το functional API.

Το ακόλουθο παράδειγμα δείχνει μια υποκλάση tf.keras.Model που χρησιμοποιεί "προς τα εμπρός πέρασμα" το οποίο δεν χρειάζεται να εκτελείται αναγκαστικά:

class MyModel(tf.keras.Model):

  def __init__(self, num_classes=10):
    super(MyModel, self).__init__(name='my_model')
    self.num_classes = num_classes
    # Define your layers here.
    self.dense_1 = layers.Dense(32, activation='relu')
    self.dense_2 = layers.Dense(num_classes, activation='sigmoid')

  def call(self, inputs):
    # Define your forward pass here,
    # using layers you previously defined (in `__init__`).
    x = self.dense_1(inputs)
    return self.dense_2(x)

Η νέα κλάση model λαμβάνει υπόσταση :


model = MyModel(num_classes=10)

# The compile step specifies the training configuration.
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Trains for 5 epochs.
model.fit(data, labels, batch_size=32, epochs=5)
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 392us/sample - loss: 11.5279 - accuracy: 0.0980
Epoch 2/5
1000/1000 [==============================] - 0s 80us/sample - loss: 11.5126 - accuracy: 0.1000
Epoch 3/5
1000/1000 [==============================] - 0s 79us/sample - loss: 11.5074 - accuracy: 0.0950
Epoch 4/5
1000/1000 [==============================] - 0s 80us/sample - loss: 11.5040 - accuracy: 0.1040
Epoch 5/5
1000/1000 [==============================] - 0s 78us/sample - loss: 11.5018 - accuracy: 0.1100

<tensorflow.python.keras.callbacks.History at 0x7f0d48442080>

Παραμετροποιήσιμα επίπεδα

Δημιουργήστε ένα παραμετροποιήσιμο επίπεδο υποκατηγοριοποιώντας την tf.keras.layers.Layer και υλοποιώντας τις παρακάτω μεθόδους :

  • __init__ : (Προαιρετικά) ορίστε τα υποεπίπεδα που θα χρησιμοποιηθούν από το επίπεδο
  • build : Δημιουργεί τα βάρη του επιπέδου. Προσθέστε βάρη με την μέθοδο add_weight.
  • call : Ορίστε το "προς τα εμπρός πέρασμα"
  • Προαιρετικά, ένα επίπεδο μπορεί να σειριοποιηθεί με την υλοποίηση της μεθόδου get_config και της μεθόδου κλάσης from_config.

Ακολουθεί παράδειγμα ενός παραμετροποιήσιμου επιπέδου το οποίο υλοποιεί ένα matmul με ορίσματα μία είσοδο και έναν kernel (πυρήνα)

class MyLayer(layers.Layer):

  def __init__(self, output_dim, **kwargs):
    self.output_dim = output_dim
    super(MyLayer, self).__init__(**kwargs)

  def build(self, input_shape):
    # Create a trainable weight variable for this layer.
    self.kernel = self.add_weight(name='kernel',
                                  shape=(input_shape[1], self.output_dim),
                                  initializer='uniform',
                                  trainable=True)

  def call(self, inputs):
    return tf.matmul(inputs, self.kernel)

  def get_config(self):
    base_config = super(MyLayer, self).get_config()
    base_config['output_dim'] = self.output_dim
    return base_config

  @classmethod
  def from_config(cls, config):
    return cls(**config)

Δημιουργήστε ένα μοντέλο χρησιμοποιώντας το δικό σας επίπεδο :

model = tf.keras.Sequential([
    MyLayer(10),
    layers.Activation('softmax')])

# The compile step specifies the training configuration
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Trains for 5 epochs.
model.fit(data, labels, batch_size=32, epochs=5)
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 287us/sample - loss: 11.5103 - accuracy: 0.1040
Epoch 2/5
1000/1000 [==============================] - 0s 67us/sample - loss: 11.5108 - accuracy: 0.1060
Epoch 3/5
1000/1000 [==============================] - 0s 65us/sample - loss: 11.5107 - accuracy: 0.1020
Epoch 4/5
1000/1000 [==============================] - 0s 65us/sample - loss: 11.5110 - accuracy: 0.1010
Epoch 5/5
1000/1000 [==============================] - 0s 65us/sample - loss: 11.5108 - accuracy: 0.1020

<tensorflow.python.keras.callbacks.History at 0x7f0d483080b8>

Επανακλήσεις

Μία επανάκληση(callback) είναι ένα αντικείμενο το οποίο περνάει σε ένα μοντέλο για να τροποποιήσει και να επεκτείνει τη συμπεριφορά του κατά την διάρκεια της μάθησης. Μπορείτε να γράψετε τις δικές σας επανακλήσεις ή να χρησιμοποιήσετε την tf.keras.callbacks η οποία περιλαμβάνει :

Για να χρησιμοποιήσετε την tf.keras.callbacks.Callback , περάστε την στην μέθοδο fit του μοντέλου :

callbacks = [
  # Interrupt training if `val_loss` stops improving for over 2 epochs
  tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
  # Write TensorBoard logs to `./logs` directory
  tf.keras.callbacks.TensorBoard(log_dir='./logs')
]
model.fit(data, labels, batch_size=32, epochs=5, callbacks=callbacks,
          validation_data=(val_data, val_labels))
Train on 1000 samples, validate on 100 samples
Epoch 1/5
1000/1000 [==============================] - 0s 172us/sample - loss: 11.5109 - accuracy: 0.1010 - val_loss: 11.3599 - val_accuracy: 0.0700
Epoch 2/5
1000/1000 [==============================] - 0s 97us/sample - loss: 11.5107 - accuracy: 0.1040 - val_loss: 11.3600 - val_accuracy: 0.0600
Epoch 3/5
1000/1000 [==============================] - 0s 99us/sample - loss: 11.5107 - accuracy: 0.1010 - val_loss: 11.3596 - val_accuracy: 0.0700
Epoch 4/5
1000/1000 [==============================] - 0s 98us/sample - loss: 11.5106 - accuracy: 0.0990 - val_loss: 11.3597 - val_accuracy: 0.0700
Epoch 5/5
1000/1000 [==============================] - 0s 95us/sample - loss: 11.5107 - accuracy: 0.1030 - val_loss: 11.3609 - val_accuracy: 0.0700

<tensorflow.python.keras.callbacks.History at 0x7f0d481f73c8>

Αποθήκευση και επαναφορά

Αποθήκευση μόνο των τιμών των βαρών

Αποθηκεύστε και φορτώστε τα βάρη ενός μοντέλου με τη χρήση της tf.keras.Model.save_weights:

model = tf.keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(32,)),
layers.Dense(10, activation='softmax')])

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
# Save weights to a TensorFlow Checkpoint file
model.save_weights('./weights/my_model')

# Restore the model's state,
# this requires a model with the same architecture.
model.load_weights('./weights/my_model')
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f0d483ccef0>

Ως προεπιλογή , το παραπάνω αποθηκεύει τα βάρη του μοντέλου σε μορφοποίηση TensorFlow checkpoint. Εναλλακτικά , μπορούν να αποθηκευτούν χρησιμοποιώντας την μορφοποιήση Keras HDF5(η προεπιλογή για την υλοποίηση του συστήματος υποστήριξης του Keras):

# Save weights to a HDF5 file
model.save_weights('my_model.h5', save_format='h5')

# Restore the model's state
model.load_weights('my_model.h5')

Αποθήκευση μόνο των ρυθμίσεων του μοντέλου

Οι ρυθμίσεις ενός μοντέλου μπορούν να αποθηκευτούν-αυτό σειριοποιεί την αρχιτεκτονική του μοντέλου χωρίς βάρη. Οι αποθηκευμένες ρυθμίσεις μπορόυν να αναπαράγουν και να αρχικοποιήσουν το ίδιο μοντέλο, ακόμη και χωρίς τον κώδικα που όρισε το πρότυπο μοντέλο. To Keras υποστηρίζει τα JSON και YAML ως μορφές σειριοποίησης:

# Serialize a model to JSON format
json_string = model.to_json()
json_string
'{"class_name": "Sequential", "config": {"name": "sequential_3", "layers": [{"class_name": "Dense", "config": {"name": "dense_17", "trainable": true, "batch_input_shape": [null, 32], "dtype": "float32", "units": 64, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_18", "trainable": true, "dtype": "float32", "units": 10, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "keras_version": "2.2.4-tf", "backend": "tensorflow"}'
import json
import pprint
pprint.pprint(json.loads(json_string))
{'backend': 'tensorflow',
 'class_name': 'Sequential',
 'config': {'layers': [{'class_name': 'Dense',
                        'config': {'activation': 'relu',
                                   'activity_regularizer': None,
                                   'batch_input_shape': [None, 32],
                                   'bias_constraint': None,
                                   'bias_initializer': {'class_name': 'Zeros',
                                                        'config': {}},
                                   'bias_regularizer': None,
                                   'dtype': 'float32',
                                   'kernel_constraint': None,
                                   'kernel_initializer': {'class_name': 'GlorotUniform',
                                                          'config': {'seed': None}},
                                   'kernel_regularizer': None,
                                   'name': 'dense_17',
                                   'trainable': True,
                                   'units': 64,
                                   'use_bias': True}},
                       {'class_name': 'Dense',
                        'config': {'activation': 'softmax',
                                   'activity_regularizer': None,
                                   'bias_constraint': None,
                                   'bias_initializer': {'class_name': 'Zeros',
                                                        'config': {}},
                                   'bias_regularizer': None,
                                   'dtype': 'float32',
                                   'kernel_constraint': None,
                                   'kernel_initializer': {'class_name': 'GlorotUniform',
                                                          'config': {'seed': None}},
                                   'kernel_regularizer': None,
                                   'name': 'dense_18',
                                   'trainable': True,
                                   'units': 10,
                                   'use_bias': True}}],
            'name': 'sequential_3'},
 'keras_version': '2.2.4-tf'}

Αναπαραγωγή του μοντέλου(νεότερα αρχικοποιήθεντος) από το JSON :

fresh_model = tf.keras.models.model_from_json(json_string)

Η σειριοποίηση μοντέλου σε μορφή YAML απαιτεί την εγκατάσταση της pyyaml πριν γίνει είσοδος της TensorFlow:

yaml_string = model.to_yaml()
print(yaml_string)
backend: tensorflow
class_name: Sequential
config:
  layers:
  - class_name: Dense
    config:
      activation: relu
      activity_regularizer: null
      batch_input_shape: !!python/tuple [null, 32]
      bias_constraint: null
      bias_initializer:
        class_name: Zeros
        config: {}
      bias_regularizer: null
      dtype: float32
      kernel_constraint: null
      kernel_initializer:
        class_name: GlorotUniform
        config: {seed: null}
      kernel_regularizer: null
      name: dense_17
      trainable: true
      units: 64
      use_bias: true
  - class_name: Dense
    config:
      activation: softmax
      activity_regularizer: null
      bias_constraint: null
      bias_initializer:
        class_name: Zeros
        config: {}
      bias_regularizer: null
      dtype: float32
      kernel_constraint: null
      kernel_initializer:
        class_name: GlorotUniform
        config: {seed: null}
      kernel_regularizer: null
      name: dense_18
      trainable: true
      units: 10
      use_bias: true
  name: sequential_3
keras_version: 2.2.4-tf

Αναπαραγωγή του μοντέλου από το YAML :

fresh_model = tf.keras.models.model_from_yaml(yaml_string)

Προσοχή : Μοντέλα ως υποκλάσεις δεν σειριοποιούνται διότι η αρχιτεκτονική τους ορίζεται από τον κώδικα Python στο σώμα τις μεθόδου call.

Αποθήκευση ολόκληρου του μοντέλου σε ένα αρχείο

Ολόκληρο το μοντέλο μπορεί να αποθηκευτεί σε ένα μόνο αρχείο το οποίο περιέχει τα βάρη , τις ρυθμίσεις του μοντέλου , ακόμη και τις ρυθμίσεις του βελτιστοποιητή. Έτσι , μπορείτε να θέσετε ένα σημείο ελέγχου σε ένα μοντέλο και να συνεχίσετε την εκμάθηση αργότερα - από την ακριβώς ίδια κατάσταση - χωρίς πρόσβαση στον πρωταρχικό κώδικα :

# Create a simple model
model = tf.keras.Sequential([
  layers.Dense(10, activation='softmax', input_shape=(32,)),
  layers.Dense(10, activation='softmax')
])
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels, batch_size=32, epochs=5)


# Save entire model to a HDF5 file
model.save('my_model.h5')

# Recreate the exact same model, including weights and optimizer.
model = tf.keras.models.load_model('my_model.h5')
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 367us/sample - loss: 11.5314 - accuracy: 0.1010
Epoch 2/5
1000/1000 [==============================] - 0s 76us/sample - loss: 11.5488 - accuracy: 0.1010
Epoch 3/5
1000/1000 [==============================] - 0s 74us/sample - loss: 11.5657 - accuracy: 0.1030
Epoch 4/5
1000/1000 [==============================] - 0s 77us/sample - loss: 11.5836 - accuracy: 0.1030
Epoch 5/5
1000/1000 [==============================] - 0s 77us/sample - loss: 11.6006 - accuracy: 0.1030

Για να μάθετε περισσότερα για την αποθήκευση και την σειριοποίηση , πατήστε εδώ.

"Ενθουσιώδης" εκτέλεση(Eager execution)

H "Ενθουσιώδης" εκτέλεση είναι ένα (επιτακτικό) περιβάλλον προγραμματισμού το οποίο αξιολογεί λειτουργίες αμέσως. Αυτό δεν απαιτείται από το Keras , ωστόσο η tf.keras παρέχει υποστήριξη και χρησιμεύει για την επιθεώρηση και την εκσφαλμάτωση του προγράμματος.

Όλα τα API της tf.keras για την κατασκευή μοντέλων είναι συμβατά με την "ενθουσιώδη εκτέλεση". Και καθώς τα Σειριακά και τα λειτουργικά (functional) API μπορούν να χρησιμοποιηθούν, η "ενθουσιώδης" εκτέλεση επωφελεί ιδιαίτερα την υποκατηγοριοποίηση μοντέλων και την κατασκευή παραμετροποιήσιμων επιπέδων-τα ΑPI's που σας προτρέπουν να γράψετε το "προς τα εμπρος πέρασμα" ως κώδικα (σε αντίθεση με τα API's που δημιουργούν μοντέλα μέσω της σύνθεσης των ήδη υπάρχοντων επιπέδων)

Δείτε τον οδηγό αυτό για παραδείγματα χρήσης μοντέλων Keras με custom training looops και την tf.GradientTape. Ακόμη , μπορείτε να δείτε ένα ολοκληρωμένο και σύντομο παράδειγμα εδώ.

Διανομή

Τα μοντέλα της tf.keras μπορούν να εκτελεστούν σε πολλαπλές GPUs ,με την χρήση της tf.distribute.Strategy. Το API αυτό κατανείμει την μάθηση σε πολλαπλές κάρτες γραφικών με σχεδόν καθόλου αλλαγές στον υπάρχον κώδικα.

Επί του παρόντος, η tf.distribute.MirroredStrategy αποτελεί την μόνη στρατηγική κατανομής που υποστηρίζεται. Η MirroredStrategy πραγματοποιεί in-graph replication μαζί με συγχρονισμένη μάθηση, χρησιμοποιώντας all-reduce σε ένα μηχάνημα. Για να χρησιμοποιήσετε τη distribute.Strategy, εμφωλεύστε την αρχικοποίηση του βελτιστοποιητή, τον κατασκευαστή του μοντέλου, και το compile σε ένα μπλοκ κώδικα Strategy.scope(). Έπειτα , προχωρήστε στην εκμάθηση του μοντέλου.

Το ακόλουθο παράδειγμα κατανείμει ένα tf.keras.Model σε πολλαπλές κάρτες γραφικών σε ένα μηχάνημα. Πρώτα , ορίζεται ένα μοντέλο εντός της distribute.Strategy:

strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
  model = tf.keras.Sequential()
  model.add(layers.Dense(16, activation='relu', input_shape=(10,)))
  model.add(layers.Dense(1, activation='sigmoid'))

  optimizer = tf.keras.optimizers.SGD(0.2)

  model.compile(loss='binary_crossentropy', optimizer=optimizer)

model.summary()
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_21 (Dense)             (None, 16)                176       
_________________________________________________________________
dense_22 (Dense)             (None, 1)                 17        
=================================================================
Total params: 193
Trainable params: 193
Non-trainable params: 0
_________________________________________________________________

Στη συνέχεια , εξασκείστε το μοντέλο πάνω σε δεδομένα κατά τα γνωστά :

x = np.random.random((1024, 10))
y = np.random.randint(2, size=(1024, 1))
x = tf.cast(x, tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((x, y))
dataset = dataset.shuffle(buffer_size=1024).batch(32)

model.fit(dataset, epochs=1)
Train for 32 steps
32/32 [==============================] - 3s 79ms/step - loss: 0.6923

<tensorflow.python.keras.callbacks.History at 0x7f0d40681b70>

Για περισσότερες πληροφορίες , δείτε τον πλήρη οδηγό για την Κατανεμημένη Μάθηση με TensorFlow.