Lesen Sie Tensorflow 2.0 Tutorial. Ich möchte untersuchen und ergänzen, was ich im Tutorial als Memorandum nicht verstanden habe. Es kann also gut sein, es neben dem Tutorial zu lesen.
Ich habe bis jetzt Ketten verwendet Als ich Tensorflow lernen wollte, war der Mainstream auf 2.0 übergegangen, bevor ich es wusste. Ich kenne das Tensorflow1-System nicht einmal, aber wenn ich es jetzt mache, halte ich es für sinnvoll, mit dem 2. System zu beginnen, also habe ich angefangen, das Tensorflow2-Tutorial zu lesen.
windows10 Ich habe es in der virtuellen Umgebung von Anaconda gemacht Die Umgebungskonstruktion ist wie folgt
#python3.Es scheint, dass es nur bis zu 6 unterstützt, also ist die Version 3.6
conda create -n tensorflow2.0 python=3.6 anaconda
conda install tensorflow==2.0.0
conda install jupyter
from __future__ import absolute_import, division, print_function, unicode_literals
!pip install -q tensorflow-gpu==2.0.0-rc1
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#~~
x_train, x_test = x_train / 255.0, x_test / 255.0
# tf.Importieren Sie zunächst die TensorFlow-Bibliothek in Ihr Programm. Laden Sie den MNIST-Datensatz und bereiten Sie ihn vor. Es scheint, dass die Anzahl der Dimensionen mit einer neuen Achse herausgenommen werden kann, die den Pixelwert (0255) auf 01 drückt
#Fügen Sie allen Daten (jedem Bild) Informationen zur Dimensionsnummer hinzu.
#CNN scheint dimensionale Informationen zu benötigen. Dies kann ein Prozess sein, der bei vollständiger Verknüpfung nicht umgekehrt ausgeführt werden sollte
x_train = x_train[..., tf.newaxis]
x_test = x_test[..., tf.newaxis]
Verwenden Sie tf.data, um Datasets zu mischen und zu stapeln.
#10000 ist die Puffergröße. Reichen 10.000 für CNN aus? ??
#32 ist die Chargengröße.
train_ds = tf.data.Dataset.from_tensor_slices(
(x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
Erstellen Sie ein tf.keras-Modell mit der Keras-Modell-Unterklassen-API.
#Vererbung der Modellklasse
class MyModel(Model):
#Erstellen Sie ein Modell mit init
def __init__(self):
super(MyModel, self).__init__()
#32 Filtertypen
#Die Filtergröße beträgt 3*3
#Die Aktivierungsfunktion ist Relu
self.conv1 = Conv2D(32, 3, activation='relu')
#Zweidimensionale Daten*Reduzieren Sie die Anzahl der Filterdaten auf eine Dimension
self.flatten = Flatten()
self.d1 = Dense(128, activation='relu')
#Da es sich um eine Ausgabeschicht handelt, ist die Aktivierungsfunktion eine Softmax-Funktion
self.d2 = Dense(10, activation='softmax')
#Ist x die Eingabebildgruppe? ??
# -> tf.Es scheinen Tensortypdaten zu sein.
def call(self, x):
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
#Spucken Sie das von NN berechnete Ergebnis aus? ??
return self.d2(x)
model = MyModel()
Wählen Sie einen Optimierer und eine Verlustfunktion für das Training.
#Stabiler Kreuzentropiefehler
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
#Es wird gemunkelt, dass ADAM jetzt (vor langer Zeit?) Der Beste ist.
optimizer = tf.keras.optimizers.Adam()
Wählen Sie Metriken aus, um den Modellverlust und die Genauigkeit zu messen. Diese Metriken aggregieren die Werte für jede Epoche und geben das Endergebnis aus.
#Instanz, die die Matrix mittelt
train_loss = tf.keras.metrics.Mean(name='train_loss')
#Instanz, die die richtige Antwortrate angibt
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
Trainieren Sie Ihr Modell mit tf.GradientTape.
@tf.function
def train_step(image, label):
#Mit internen Berechnungen aufzeichnen. Band.~~Ich nehme es raus
with tf.GradientTape() as tape:
#Vorhersage basierend auf Bild, Verlustberechnung
predictions = model(image)
loss = loss_object(label, predictions)
# model.trainable_Übergeben Sie Gewichte mit Variablen
gradients = tape.gradient(loss, model.trainable_variables)
#Aktualisieren Sie die Gewichte mit dem Optimierer
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
#Berechnen Sie den Verlust und die Akkreditierung mit der vorherigen Instanz
train_loss(loss)
train_accuracy(label, predictions)
Referenz: Einführung in TensorFlow 2.0 für Low-Level-API-Benutzer
Über @ tf.function
Es gibt zwei Möglichkeiten, den NN zu drehen.
Definieren und ausführen: Definieren Sie das Berechnungsdiagramm und führen Sie dann die Daten aus, um das Ergebnis zu erhalten.
Define-by-Run: Wie der normale Python-Code wird das Diagramm gleichzeitig mit der Definition des Diagramms mit x + y ausgeführt und das Ergebnis erhalten (Quelle). )))
Es scheint, dass Tensorflow 2.0.0 "by" verwendet, weil "by" einfacher zu schreiben ist.
'By' ist jedoch sehr langsam, so dass das Hinzufügen von '@ tf.function' den gleichen Vorgang wie 'and' zu ermöglichen scheint.
Weitere Informationen finden Sie im Bestätigungsartikel (https://qiita.com/nj_ryoo0/items/7f4495aaef07ccc6a303).
Dann testen Sie das Modell.
@tf.function
def test_step(image, label):
predictions = model(image)
t_loss = loss_object(label, predictions)
test_loss(t_loss)
test_accuracy(label, predictions)
EPOCHS = 5
for epoch in range(EPOCHS):
#Führen Sie den Zug auf allen Bildern für jede Charge
for image, label in train_ds:
train_step(image, label)
#Führen Sie für jeden Stapel Tests für alle Bilder durch
for test_image, test_label in test_ds:
test_step(test_image, test_label)
#Verschiedene Anzeigen
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print (template.format(epoch+1,
train_loss.result(),
train_accuracy.result()*100,
test_loss.result(),
test_accuracy.result()*100))
Ergebnis
WARNING:tensorflow:Layer my_model is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2. The layer has dtype float32 because it's dtype defaults to floatx.
If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.
To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.
Epoch 1, Loss: 0.14364087581634521, Accuracy: 95.62000274658203, Test Loss: 0.06367728859186172, Test Accuracy: 97.88999938964844
Epoch 2, Loss: 0.09373863786458969, Accuracy: 97.1483383178711, Test Loss: 0.056961096823215485, Test Accuracy: 98.07500457763672
Epoch 3, Loss: 0.07041392475366592, Accuracy: 97.84444427490234, Test Loss: 0.05455232039093971, Test Accuracy: 98.17666625976562
Epoch 4, Loss: 0.05662970244884491, Accuracy: 98.25749969482422, Test Loss: 0.05664524435997009, Test Accuracy: 98.19499969482422
Epoch 5, Loss: 0.047065384685993195, Accuracy: 98.54966735839844, Test Loss: 0.057572390884160995, Test Accuracy: 98.23799896240234
P.S. @```Es war bequem, sich im Wörterbuch mit zu registrieren
Recommended Posts