Dies ist mein erster Artikel über maschinelles Lernen. Vor kurzem habe ich mich beruflich mit maschinellem Lernen und Computer Vision beschäftigt. In diesem und zukünftigen Artikeln werde ich Beobachtungen und Lösungen für bestimmte Probleme bei der Verwendung von TensorFlow und Keras vorstellen. In diesem Artikel werde ich auf ein nicht offensichtliches Problem bei der Arbeit mit TensorFlow und Keras eingehen - das gleichzeitige Laden und Ausführen mehrerer Modelle. Wenn Sie nicht wissen, wie TensorFlow und Keras intern funktionieren, kann dieses Thema für Anfänger ein Problem sein. Wenn Sie sich für das Thema interessieren, bitte unter der Katze.
TensorFlow präsentiert Berechnungen im neuronalen Netzwerkmodell im Speicher als Diagramm der Abhängigkeiten zwischen Operationen während der Initialisierung. Bei der Ausführung des Modells führt TensorFlow innerhalb einer bestimmten Sitzung Berechnungen für das Diagramm durch. Ich werde in Tensorflow nicht auf Details dieser Entitäten eingehen.
Weitere Informationen zu Grafiken und Sitzungen zu
Medium und Habré finden Sie
hier und
hier .
Normalerweise arbeiten wir mit einem Modell und hier gibt es keine Probleme. Stellen wir uns nun vor, wir arbeiten mit zwei Klassen. Beide Klassen arbeiten mit Keras-Modellen: Erstellen Sie eine neuronale Architektur, laden Sie trainierte Gewichte und führen Sie Vorhersagen durch. Wenn Sie zwei Klassen in einer Pipeline ausführen (z. B. führen wir im ersten Schritt eine Gesichtserkennung auf dem Foto durch, im nächsten Schritt - menschliche Erkennung), kann ein ähnlicher Fehler auftreten:
Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph
Der Grund für den Fehler ist, dass Keras standardmäßig nur mit der Standardsitzung funktioniert und die neue Sitzung nicht als Standardsitzung registriert.
Bei der Arbeit mit dem Keras-Modell muss der Benutzer die neue Sitzung explizit als Standardsitzung festlegen. Dies kann folgendermaßen geschehen:
self.graph = tf.Graph() with self.graph.as_default(): self.session = tf.Session(graph=self.graph) with self.session.as_default(): self.model = WideResNet(face_size, depth=depth, k=width)() model_dir = <model_path> ... self.model.load_weights(fpath)
Wir erstellen ein neues TensorFlow-Diagramm und eine neue Sitzung und laden das Modell in die neue TensorFlow-Sitzung.
String
with self.graph.as_default():
bedeutet, dass
wir das neue Diagramm () als Standarddiagramm und in der Zeile verwenden
möchten with self.session.as_default():
Wir geben an, dass wir die self.session als Standardsitzung verwenden und den nachfolgenden Code innerhalb dieser Sitzung ausführen möchten. Das with-Konstrukt erstellt einen Kontextmanager, mit dem wir beim Umgang mit ressourcenintensiven Objekten (z. B. beim Lesen von Dateien) effizient mit dem Speicher arbeiten können, da beim Verlassen des with-Blocks automatisch Ressourcen freigesetzt werden.
Wenn wir die Vorhersage erfüllen müssen, machen wir es so:
with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1)
Wir rufen einfach die Predict () -Methode in der zuvor erstellten TF-Sitzung auf.
Das ist alles für jetzt. Viel Glück an alle und bis bald!