Wie kann ich ein Modell nach dem Training speichern/wiederherstellen?

Lesezeit: 22 Minuten

Benutzer-Avatar
Mathematiker

Nachdem Sie ein Modell in Tensorflow trainiert haben:

  1. Wie speichern Sie das trainierte Modell?
  2. Wie stellen Sie dieses gespeicherte Modell später wieder her?

  • Konnten Sie die im Anfangsmodell verwendeten Variablen wiederherstellen? Ich versuche auch genau das gleiche Problem, aber ich kann keine Variablen schreiben, die beim Training des Inception-Modells verwendet wurden (von dem ich eine ckpt-Datei habe).

    – ExAres

    11. Oktober 2016 um 17:52 Uhr

  • Ich habe es nicht mit dem Inception-Modell versucht. Haben Sie die Netzwerkstruktur des Modells mit seinen Namen? Sie müssen das Netzwerk replizieren und dann die Gewichtungen und Bias (die ckpt-Datei) laden, wie Ryan erklärt. Vielleicht hat sich seit November 15 etwas geändert und es gibt jetzt einen einfacheren Ansatz, ich bin mir nicht sicher

    – Mathematiker

    11. Oktober 2016 um 18:22 Uhr


  • Ohh ok. Ich habe zuvor andere vortrainierte Tensorflow-Modelle geladen, suchte aber nach variablen Spezifikationen des Anfangsmodells. Vielen Dank.

    – ExAres

    11. Oktober 2016 um 18:30 Uhr

  • Wenn Sie wiederherstellen, um weiter zu trainieren, verwenden Sie einfach die Saver-Checkpoints. Wenn Sie das Modell zum Referenzieren speichern, werden nur die tensorflow SavedModel-APIs.

    – HY G

    20. Dezember 2017 um 9:28 Uhr

  • Auch wenn Sie LSTM verwenden, haben Sie eine Zuordnung von Zeichenfolge zu einer Liste von Zeichen, achten Sie darauf, diese Liste in der gleichen Reihenfolge zu speichern und zu laden! Dies wird durch das Speichern der Modellgewichte und des Modelldiagrammnetzwerks nicht abgedeckt und lässt den Eindruck entstehen, dass Ihr Modell nicht geladen wurde, wenn Sie Sitzungen wechseln oder sich die Daten ändern.

    – devssh

    26. September 2018 um 6:02 Uhr


Benutzer-Avatar
sankit

Ich verbessere meine Antwort, um weitere Details zum Speichern und Wiederherstellen von Modellen hinzuzufügen.

In (und danach) Tensorflow-Version 0.11:

Speichern Sie das Modell:

import tensorflow as tf

#Prepare to feed input, i.e. feed_dict and placeholders
w1 = tf.placeholder("float", name="w1")
w2 = tf.placeholder("float", name="w2")
b1= tf.Variable(2.0,name="bias")
feed_dict ={w1:4,w2:8}

#Define a test operation that we will restore
w3 = tf.add(w1,w2)
w4 = tf.multiply(w3,b1,name="op_to_restore")
sess = tf.Session()
sess.run(tf.global_variables_initializer())

#Create a saver object which will save all the variables
saver = tf.train.Saver()

#Run the operation by feeding input
print sess.run(w4,feed_dict)
#Prints 24 which is sum of (w1+w2)*b1 

#Now, save the graph
saver.save(sess, 'my_test_model',global_step=1000)

Wiederherstellen des Modells:

import tensorflow as tf

sess=tf.Session()    
#First let's load meta graph and restore weights
saver = tf.train.import_meta_graph('my_test_model-1000.meta')
saver.restore(sess,tf.train.latest_checkpoint('./'))


# Access saved Variables directly
print(sess.run('bias:0'))
# This will print 2, which is the value of bias that we saved


# Now, let's access and create placeholders variables and
# create feed-dict to feed new data

graph = tf.get_default_graph()
w1 = graph.get_tensor_by_name("w1:0")
w2 = graph.get_tensor_by_name("w2:0")
feed_dict ={w1:13.0,w2:17.0}

#Now, access the op that you want to run. 
op_to_restore = graph.get_tensor_by_name("op_to_restore:0")

print sess.run(op_to_restore,feed_dict)
#This will print 60 which is calculated 

Dieser und einige fortgeschrittenere Anwendungsfälle wurden hier sehr gut erklärt.

Ein schnelles vollständiges Tutorial zum Speichern und Wiederherstellen von Tensorflow-Modellen

  • +1 dafür # Greife direkt auf gespeicherte Variablen zu print(sess.run(‘bias:0’)) # Dies gibt 2 aus, was der Wert von bias ist, den wir gespeichert haben. Es hilft sehr für Debugging-Zwecke zu sehen, ob das Modell korrekt geladen wird. die Variablen können mit “All_varaibles = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES” abgerufen werden. Außerdem muss “sess.run(tf.global_variables_initializer())” vor dem Restore stehen.

    – LGG

    16. Mai 2017 um 0:08 Uhr


  • Sind Sie sicher, dass wir global_variables_initializer erneut ausführen müssen? Ich habe mein Diagramm mit global_variable_initialization wiederhergestellt, und es gibt mir jedes Mal eine andere Ausgabe für dieselben Daten. Also habe ich die Initialisierung auskommentiert und einfach den Graphen, die Eingabevariable und die Operationen wiederhergestellt, und jetzt funktioniert es einwandfrei.

    – Aditya Shinde

    4. Juni 2017 um 20:44 Uhr

  • @AdityaShinde Ich verstehe nicht, warum ich jedes Mal andere Werte bekomme. Und ich habe den Variablen-Initialisierungsschritt für die Wiederherstellung nicht eingeschlossen. Ich verwende übrigens meinen eigenen Code.

    – Kette

    7. Juni 2017 um 9:35 Uhr

  • @AdityaShinde: Sie brauchen keine Init-Operation, da die Werte bereits durch die Wiederherstellungsfunktion initialisiert wurden, also haben Sie sie entfernt. Ich bin mir jedoch nicht sicher, warum Sie mit init op eine andere Ausgabe erhalten haben.

    – sankit

    8. Juni 2017 um 6:11 Uhr

  • @sankit Wenn Sie die Tensoren wiederherstellen, warum fügen Sie hinzu :0 zu den Namen?

    – Sahar Rabinoviz

    13. Juli 2017 um 0:18 Uhr

Benutzer-Avatar
lei du

In (und nach) TensorFlow Version 0.11.0RC1 können Sie Ihr Modell direkt per Aufruf speichern und wiederherstellen tf.train.export_meta_graph und tf.train.import_meta_graph entsprechend https://www.tensorflow.org/programmers_guide/meta_graph.

Speichern Sie das Modell

w1 = tf.Variable(tf.truncated_normal(shape=[10]), name="w1")
w2 = tf.Variable(tf.truncated_normal(shape=[20]), name="w2")
tf.add_to_collection('vars', w1)
tf.add_to_collection('vars', w2)
saver = tf.train.Saver()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
saver.save(sess, 'my-model')
# `save` method will call `export_meta_graph` implicitly.
# you will get saved graph files:my-model.meta

Stellen Sie das Modell wieder her

sess = tf.Session()
new_saver = tf.train.import_meta_graph('my-model.meta')
new_saver.restore(sess, tf.train.latest_checkpoint('./'))
all_vars = tf.get_collection('vars')
for v in all_vars:
    v_ = sess.run(v)
    print(v_)

  • Wie lade ich Variablen aus dem gespeicherten Modell? Wie kopiert man Werte in eine andere Variable?

    – Neel

    19. Dezember 2016 um 8:58 Uhr

  • Ich kann diesen Code nicht zum Laufen bringen. Das Modell wird gespeichert, aber ich kann es nicht wiederherstellen. Es gibt mir diesen Fehler. <built-in function TF_Run> returned a result with an error set

    – Saad Qureshi

    8. Januar 2017 um 9:05 Uhr


  • Wenn ich nach dem Wiederherstellen auf die Variablen wie oben gezeigt zugreife, funktioniert es. Aber ich kann die Variablen nicht direkter verwenden tf.get_variable_scope().reuse_variables() gefolgt von var = tf.get_variable("varname"). Dies gibt mir den Fehler: “ValueError: Variable varname existiert nicht oder wurde nicht mit tf.get_variable() erstellt.” Wieso den? Sollte dies nicht möglich sein?

    – jpp1

    12. Januar 2017 um 14:16 Uhr

  • Dies funktioniert nur für Variablen gut, aber wie können Sie auf einen Platzhalter zugreifen und ihm Werte zuführen, nachdem Sie das Diagramm wiederhergestellt haben?

    – kbrose

    29. März 2017 um 16:09 Uhr

  • Hier wird nur gezeigt, wie die Variablen wiederhergestellt werden. Wie können Sie das gesamte Modell wiederherstellen und mit neuen Daten testen, ohne das Netzwerk neu zu definieren?

    – Kette

    6. Juni 2017 um 19:26 Uhr

Benutzer-Avatar
ted

Tensorflow 2-Dokumente

Kontrollpunkte speichern

Angepasst von die Dokumente

# -------------------------
# -----  Toy Context  -----
# -------------------------
import tensorflow as tf


class Net(tf.keras.Model):
    """A simple linear model."""

    def __init__(self):
        super(Net, self).__init__()
        self.l1 = tf.keras.layers.Dense(5)

    def call(self, x):
        return self.l1(x)


def toy_dataset():
    inputs = tf.range(10.0)[:, None]
    labels = inputs * 5.0 + tf.range(5.0)[None, :]
    return (
        tf.data.Dataset.from_tensor_slices(dict(x=inputs, y=labels)).repeat().batch(2)
    )


def train_step(net, example, optimizer):
    """Trains `net` on `example` using `optimizer`."""
    with tf.GradientTape() as tape:
        output = net(example["x"])
        loss = tf.reduce_mean(tf.abs(output - example["y"]))
    variables = net.trainable_variables
    gradients = tape.gradient(loss, variables)
    optimizer.apply_gradients(zip(gradients, variables))
    return loss


# ----------------------------
# -----  Create Objects  -----
# ----------------------------

net = Net()
opt = tf.keras.optimizers.Adam(0.1)
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(
    step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator
)
manager = tf.train.CheckpointManager(ckpt, "./tf_ckpts", max_to_keep=3)

# ----------------------------
# -----  Train and Save  -----
# ----------------------------

ckpt.restore(manager.latest_checkpoint)
if manager.latest_checkpoint:
    print("Restored from {}".format(manager.latest_checkpoint))
else:
    print("Initializing from scratch.")

for _ in range(50):
    example = next(iterator)
    loss = train_step(net, example, opt)
    ckpt.step.assign_add(1)
    if int(ckpt.step) % 10 == 0:
        save_path = manager.save()
        print("Saved checkpoint for step {}: {}".format(int(ckpt.step), save_path))
        print("loss {:1.2f}".format(loss.numpy()))


# ---------------------
# -----  Restore  -----
# ---------------------

# In another script, re-initialize objects
opt = tf.keras.optimizers.Adam(0.1)
net = Net()
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(
    step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator
)
manager = tf.train.CheckpointManager(ckpt, "./tf_ckpts", max_to_keep=3)

# Re-use the manager code above ^

ckpt.restore(manager.latest_checkpoint)
if manager.latest_checkpoint:
    print("Restored from {}".format(manager.latest_checkpoint))
else:
    print("Initializing from scratch.")

for _ in range(50):
    example = next(iterator)
    # Continue training or evaluate etc.

Weitere Verbindungen

Prüfpunkte erfassen den genauen Wert aller Parameter (tf.Variable-Objekte), die von einem Modell verwendet werden. Prüfpunkte enthalten keine Beschreibung der durch das Modell definierten Berechnung und sind daher normalerweise nur nützlich, wenn Quellcode verfügbar ist, der die gespeicherten Parameterwerte verwendet.

Das SavedModel-Format hingegen enthält eine serialisierte Beschreibung der durch das Modell definierten Berechnung zusätzlich zu den Parameterwerten (Checkpoint). Modelle in diesem Format sind unabhängig des Quellcodes, der das Modell erstellt hat. Sie eignen sich daher für die Bereitstellung über TensorFlow Serving, TensorFlow Lite, TensorFlow.js oder Programme in anderen Programmiersprachen (die C-, C++-, Java-, Go-, Rust-, C#- usw. TensorFlow-APIs).

(Highlights sind meine eigenen)


Tensorfluss < 2


Aus den Dokumenten:

Speichern

# Create some variables.
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
v2 = tf.get_variable("v2", shape=[5], initializer = tf.zeros_initializer)

inc_v1 = v1.assign(v1+1)
dec_v2 = v2.assign(v2-1)

# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, and save the
# variables to disk.
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  inc_v1.op.run()
  dec_v2.op.run()
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in path: %s" % save_path)

Wiederherstellen

tf.reset_default_graph()

# Create some variables.
v1 = tf.get_variable("v1", shape=[3])
v2 = tf.get_variable("v2", shape=[5])

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
  # Restore variables from disk.
  saver.restore(sess, "/tmp/model.ckpt")
  print("Model restored.")
  # Check the values of the variables
  print("v1 : %s" % v1.eval())
  print("v2 : %s" % v2.eval())

simple_save

Viele gute Antworten, der Vollständigkeit halber füge ich meine 2 Cent hinzu: simple_save. Auch ein eigenständiges Codebeispiel mit der tf.data.Dataset API.

Python 3 ; Tensorfluss 1.14

import tensorflow as tf
from tensorflow.saved_model import tag_constants

with tf.Graph().as_default():
    with tf.Session() as sess:
        ...

        # Saving
        inputs = {
            "batch_size_placeholder": batch_size_placeholder,
            "features_placeholder": features_placeholder,
            "labels_placeholder": labels_placeholder,
        }
        outputs = {"prediction": model_output}
        tf.saved_model.simple_save(
            sess, 'path/to/your/location/', inputs, outputs
        )

Wiederherstellung:

graph = tf.Graph()
with restored_graph.as_default():
    with tf.Session() as sess:
        tf.saved_model.loader.load(
            sess,
            [tag_constants.SERVING],
            'path/to/your/location/',
        )
        batch_size_placeholder = graph.get_tensor_by_name('batch_size_placeholder:0')
        features_placeholder = graph.get_tensor_by_name('features_placeholder:0')
        labels_placeholder = graph.get_tensor_by_name('labels_placeholder:0')
        prediction = restored_graph.get_tensor_by_name('dense/BiasAdd:0')

        sess.run(prediction, feed_dict={
            batch_size_placeholder: some_value,
            features_placeholder: some_other_value,
            labels_placeholder: another_value
        })

Eigenständiges Beispiel

Ursprünglicher Blogbeitrag

Der folgende Code generiert zu Demonstrationszwecken Zufallsdaten.

  1. Wir beginnen mit der Erstellung der Platzhalter. Sie halten die Daten zur Laufzeit. Aus ihnen erstellen wir die Dataset und dann ist es Iterator. Wir erhalten den vom Iterator generierten Tensor namens input_tensor die als Input für unser Modell dienen.
  2. Das Modell selbst ist aus gebaut input_tensor: ein GRU-basiertes bidirektionales RNN, gefolgt von einem dichten Klassifikator. Weil warum nicht.
  3. Der Verlust ist a softmax_cross_entropy_with_logitsoptimiert mit Adam. Nach 2 Epochen (mit je 2 Batches) speichern wir das „trainierte“ Modell mit tf.saved_model.simple_save. Wenn Sie den Code unverändert ausführen, wird das Modell in einem Ordner namens gespeichert simple/ in Ihrem aktuellen Arbeitsverzeichnis.
  4. In einem neuen Diagramm stellen wir dann das gespeicherte Modell wieder her tf.saved_model.loader.load. Wir packen die Platzhalter und Logits mit graph.get_tensor_by_name und die Iterator Betrieb mit initialisieren graph.get_operation_by_name.
  5. Zuletzt führen wir eine Inferenz für beide Batches im Datensatz durch und prüfen, ob das gespeicherte und das wiederhergestellte Modell dieselben Werte liefern. Tun sie!

Code:

import os
import shutil
import numpy as np
import tensorflow as tf
from tensorflow.python.saved_model import tag_constants


def model(graph, input_tensor):
    """Create the model which consists of
    a bidirectional rnn (GRU(10)) followed by a dense classifier

    Args:
        graph (tf.Graph): Tensors' graph
        input_tensor (tf.Tensor): Tensor fed as input to the model

    Returns:
        tf.Tensor: the model's output layer Tensor
    """
    cell = tf.nn.rnn_cell.GRUCell(10)
    with graph.as_default():
        ((fw_outputs, bw_outputs), (fw_state, bw_state)) = tf.nn.bidirectional_dynamic_rnn(
            cell_fw=cell,
            cell_bw=cell,
            inputs=input_tensor,
            sequence_length=[10] * 32,
            dtype=tf.float32,
            swap_memory=True,
            scope=None)
        outputs = tf.concat((fw_outputs, bw_outputs), 2)
        mean = tf.reduce_mean(outputs, axis=1)
        dense = tf.layers.dense(mean, 5, activation=None)

        return dense


def get_opt_op(graph, logits, labels_tensor):
    """Create optimization operation from model's logits and labels

    Args:
        graph (tf.Graph): Tensors' graph
        logits (tf.Tensor): The model's output without activation
        labels_tensor (tf.Tensor): Target labels

    Returns:
        tf.Operation: the operation performing a stem of Adam optimizer
    """
    with graph.as_default():
        with tf.variable_scope('loss'):
            loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
                    logits=logits, labels=labels_tensor, name="xent"),
                    name="mean-xent"
                    )
        with tf.variable_scope('optimizer'):
            opt_op = tf.train.AdamOptimizer(1e-2).minimize(loss)
        return opt_op


if __name__ == '__main__':
    # Set random seed for reproducibility
    # and create synthetic data
    np.random.seed(0)
    features = np.random.randn(64, 10, 30)
    labels = np.eye(5)[np.random.randint(0, 5, (64,))]

    graph1 = tf.Graph()
    with graph1.as_default():
        # Random seed for reproducibility
        tf.set_random_seed(0)
        # Placeholders
        batch_size_ph = tf.placeholder(tf.int64, name="batch_size_ph")
        features_data_ph = tf.placeholder(tf.float32, [None, None, 30], 'features_data_ph')
        labels_data_ph = tf.placeholder(tf.int32, [None, 5], 'labels_data_ph')
        # Dataset
        dataset = tf.data.Dataset.from_tensor_slices((features_data_ph, labels_data_ph))
        dataset = dataset.batch(batch_size_ph)
        iterator = tf.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
        dataset_init_op = iterator.make_initializer(dataset, name="dataset_init")
        input_tensor, labels_tensor = iterator.get_next()

        # Model
        logits = model(graph1, input_tensor)
        # Optimization
        opt_op = get_opt_op(graph1, logits, labels_tensor)

        with tf.Session(graph=graph1) as sess:
            # Initialize variables
            tf.global_variables_initializer().run(session=sess)
            for epoch in range(3):
                batch = 0
                # Initialize dataset (could feed epochs in Dataset.repeat(epochs))
                sess.run(
                    dataset_init_op,
                    feed_dict={
                        features_data_ph: features,
                        labels_data_ph: labels,
                        batch_size_ph: 32
                    })
                values = []
                while True:
                    try:
                        if epoch < 2:
                            # Training
                            _, value = sess.run([opt_op, logits])
                            print('Epoch {}, batch {} | Sample value: {}'.format(epoch, batch, value[0]))
                            batch += 1
                        else:
                            # Final inference
                            values.append(sess.run(logits))
                            print('Epoch {}, batch {} | Final inference | Sample value: {}'.format(epoch, batch, values[-1][0]))
                            batch += 1
                    except tf.errors.OutOfRangeError:
                        break
            # Save model state
            print('\nSaving...')
            cwd = os.getcwd()
            path = os.path.join(cwd, 'simple')
            shutil.rmtree(path, ignore_errors=True)
            inputs_dict = {
                "batch_size_ph": batch_size_ph,
                "features_data_ph": features_data_ph,
                "labels_data_ph": labels_data_ph
            }
            outputs_dict = {
                "logits": logits
            }
            tf.saved_model.simple_save(
                sess, path, inputs_dict, outputs_dict
            )
            print('Ok')
    # Restoring
    graph2 = tf.Graph()
    with graph2.as_default():
        with tf.Session(graph=graph2) as sess:
            # Restore saved values
            print('\nRestoring...')
            tf.saved_model.loader.load(
                sess,
                [tag_constants.SERVING],
                path
            )
            print('Ok')
            # Get restored placeholders
            labels_data_ph = graph2.get_tensor_by_name('labels_data_ph:0')
            features_data_ph = graph2.get_tensor_by_name('features_data_ph:0')
            batch_size_ph = graph2.get_tensor_by_name('batch_size_ph:0')
            # Get restored model output
            restored_logits = graph2.get_tensor_by_name('dense/BiasAdd:0')
            # Get dataset initializing operation
            dataset_init_op = graph2.get_operation_by_name('dataset_init')

            # Initialize restored dataset
            sess.run(
                dataset_init_op,
                feed_dict={
                    features_data_ph: features,
                    labels_data_ph: labels,
                    batch_size_ph: 32
                }

            )
            # Compute inference for both batches in dataset
            restored_values = []
            for i in range(2):
                restored_values.append(sess.run(restored_logits))
                print('Restored values: ', restored_values[i][0])

    # Check if original inference and restored inference are equal
    valid = all((v == rv).all() for v, rv in zip(values, restored_values))
    print('\nInferences match: ', valid)

Dies wird gedruckt:

$ python3 save_and_restore.py

Epoch 0, batch 0 | Sample value: [-0.13851789 -0.3087595   0.12804556  0.20013677 -0.08229901]
Epoch 0, batch 1 | Sample value: [-0.00555491 -0.04339041 -0.05111827 -0.2480045  -0.00107776]
Epoch 1, batch 0 | Sample value: [-0.19321944 -0.2104792  -0.00602257  0.07465433  0.11674127]
Epoch 1, batch 1 | Sample value: [-0.05275984  0.05981954 -0.15913513 -0.3244143   0.10673307]
Epoch 2, batch 0 | Final inference | Sample value: [-0.26331693 -0.13013336 -0.12553    -0.04276478  0.2933622 ]
Epoch 2, batch 1 | Final inference | Sample value: [-0.07730117  0.11119192 -0.20817074 -0.35660955  0.16990358]

Saving...
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: b'/some/path/simple/saved_model.pb'
Ok

Restoring...
INFO:tensorflow:Restoring parameters from b'/some/path/simple/variables/variables'
Ok
Restored values:  [-0.26331693 -0.13013336 -0.12553    -0.04276478  0.2933622 ]
Restored values:  [-0.07730117  0.11119192 -0.20817074 -0.35660955  0.16990358]

Inferences match:  True

  • Ich bin Anfänger und brauche mehr Erklärung … : Wenn ich ein CNN-Modell habe, soll ich nur 1. input_placeholder 2. labels_placeholder und 3. output_of_cnn speichern? Oder alle Zwischenprodukte tf.contrib.layers?

    – VimNing

    16. Juni 2018 um 11:43 Uhr

  • Die Grafik ist vollständig wiederhergestellt. Du könntest prüfen, ob es läuft [n.name for n in graph2.as_graph_def().node]. Wie die Dokumentation sagt, zielt Simple Save darauf ab, die Interaktion mit Tensorflow Serving zu vereinfachen, das ist der Punkt der Argumente; andere Variablen werden jedoch immer noch wiederhergestellt, da sonst keine Inferenz stattfinden würde. Schnappen Sie sich einfach Ihre interessierenden Variablen, wie ich es im Beispiel getan habe. Probier das aus Dokumentation

    – ted

    16. Juni 2018 um 12:25 Uhr


  • Nett, denke ich, aber funktioniert es auch mit Modellen im Eager-Modus und tfe.Saver?

    – Geoffrey Anderson

    26. September 2018 um 18:47 Uhr

  • ohne global_step Als Argument, wenn Sie aufhören und dann versuchen, das Training wieder aufzunehmen, wird es denken, dass Sie einen Schritt eins sind. Es wird zumindest Ihre Tensorboard-Visualisierungen vermasseln

    – Monika Heddneck

    20. April 2019 um 1:00 Uhr

  • Ich versuche, die Wiederherstellung aufzurufen, und erhalte diesen Fehler ValueError: No variables to save. Kann jemand helfen?

    – Elaine Chen

    9. März 2020 um 20:38 Uhr

Benutzer-Avatar
Ryan Sepassi

Für TensorFlow-Version < 0.11.0RC1:

Die gespeicherten Prüfpunkte enthalten Werte für die Variables in Ihrem Modell, nicht im Modell/Diagramm selbst, was bedeutet, dass das Diagramm dasselbe sein sollte, wenn Sie den Prüfpunkt wiederherstellen.

Hier ist ein Beispiel für eine lineare Regression, bei der es eine Trainingsschleife gibt, die variable Prüfpunkte speichert, und einen Bewertungsabschnitt, der in einem früheren Lauf gespeicherte Variablen wiederherstellt und Vorhersagen berechnet. Natürlich können Sie auch Variablen wiederherstellen und das Training fortsetzen, wenn Sie möchten.

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

w = tf.Variable(tf.zeros([1, 1], dtype=tf.float32))
b = tf.Variable(tf.ones([1, 1], dtype=tf.float32))
y_hat = tf.add(b, tf.matmul(x, w))

...more setup for optimization and what not...

saver = tf.train.Saver()  # defaults to saving all variables - in this case w and b

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    if FLAGS.train:
        for i in xrange(FLAGS.training_steps):
            ...training loop...
            if (i + 1) % FLAGS.checkpoint_steps == 0:
                saver.save(sess, FLAGS.checkpoint_dir + 'model.ckpt',
                           global_step=i+1)
    else:
        # Here's where you're restoring the variables w and b.
        # Note that the graph is exactly as it was when the variables were
        # saved in a prior training run.
        ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
        else:
            ...no checkpoint found...

        # Now you can run the model to get predictions
        batch_x = ...load some data...
        predictions = sess.run(y_hat, feed_dict={x: batch_x})

Hier sind die Dokumente zum Variables, die das Speichern und Wiederherstellen abdecken. Und hier sind die Dokumente für die Saver.

Benutzer-Avatar
SON_7093436

Meine Umgebung: Python 3.6, Tensorflow 1.3.0

Obwohl es viele Lösungen gab, basieren die meisten auf tf.train.Saver. Wenn wir a laden .ckpt gespeichert durch Savermüssen wir entweder das Tensorflow-Netzwerk neu definieren oder einen seltsamen und schwer zu merkenden Namen verwenden, z 'placehold_0:0','dense/Adam/Weight:0'. Hier empfehle ich zu verwenden tf.saved_modelein einfachstes Beispiel unten, von dem Sie mehr lernen können Bereitstellen eines TensorFlow-Modells:

Speichern Sie das Modell:

import tensorflow as tf

# define the tensorflow network and do some trains
x = tf.placeholder("float", name="x")
w = tf.Variable(2.0, name="w")
b = tf.Variable(0.0, name="bias")

h = tf.multiply(x, w)
y = tf.add(h, b, name="y")
sess = tf.Session()
sess.run(tf.global_variables_initializer())

# save the model
export_path="./savedmodel"
builder = tf.saved_model.builder.SavedModelBuilder(export_path)

tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)

prediction_signature = (
  tf.saved_model.signature_def_utils.build_signature_def(
      inputs={'x_input': tensor_info_x},
      outputs={'y_output': tensor_info_y},
      method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

builder.add_meta_graph_and_variables(
  sess, [tf.saved_model.tag_constants.SERVING],
  signature_def_map={
      tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
          prediction_signature 
  },
  )
builder.save()

Laden Sie das Modell:

import tensorflow as tf
sess=tf.Session() 
signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
input_key = 'x_input'
output_key = 'y_output'

export_path="./savedmodel"
meta_graph_def = tf.saved_model.loader.load(
           sess,
          [tf.saved_model.tag_constants.SERVING],
          export_path)
signature = meta_graph_def.signature_def

x_tensor_name = signature[signature_key].inputs[input_key].name
y_tensor_name = signature[signature_key].outputs[output_key].name

x = sess.graph.get_tensor_by_name(x_tensor_name)
y = sess.graph.get_tensor_by_name(y_tensor_name)

y_out = sess.run(y, {x: 3.0})

  • +1 für ein großartiges Beispiel der SavedModel-API. Allerdings wünsche ich Ihnen Speichern Sie das Modell Abschnitt zeigte eine Trainingsschleife wie die Antwort von Ryan Sepassi! Mir ist klar, dass dies eine alte Frage ist, aber diese Antwort ist eines der wenigen (und wertvollen) Beispiele für SavedModel, die ich bei Google gefunden habe.

    – Dylan F

    26. Dezember 2017 um 3:07 Uhr

  • @Tom, das ist eine großartige Antwort – nur eine, die auf das neue SavedModel abzielt. Könnten Sie sich diese SavedModel-Frage ansehen? stackoverflow.com/questions/48540744/…

    – blaue Sommer

    11. Februar 2018 um 15:10 Uhr

  • Sorgen Sie jetzt dafür, dass alles mit TF Eager-Modellen richtig funktioniert. Google riet in seiner Präsentation von 2018 jedem, sich vom TF-Grafikcode zu lösen.

    – Geoffrey Anderson

    26. September 2018 um 18:50 Uhr

Benutzer-Avatar
David Silva Barrera

Das Modell besteht aus zwei Teilen, der Modelldefinition, gespeichert von Supervisor wie graph.pbtxt im Modellverzeichnis und die numerischen Werte von Tensoren, gespeichert in Checkpoint-Dateien wie model.ckpt-1003418.

Die Modelldefinition kann mit wiederhergestellt werden tf.import_graph_defund die Gewichte werden mit wiederhergestellt Saver.

Jedoch, Saver verwendet eine spezielle Sammlung, die eine Liste von Variablen enthält, die an das Modell Graph angehängt ist, und diese Sammlung wird nicht mit import_graph_def initialisiert, sodass Sie die beiden im Moment nicht zusammen verwenden können (es ist auf unserer Roadmap zu beheben). Im Moment müssen Sie den Ansatz von Ryan Sepassi verwenden – erstellen Sie manuell ein Diagramm mit identischen Knotennamen und verwenden Sie es Saver um die Gewichte hineinzuladen.

(Alternativ könnten Sie es hacken, indem Sie es mit verwenden import_graph_defVariablen manuell erstellen und verwenden tf.add_to_collection(tf.GraphKeys.VARIABLES, variable) für jede Variable, dann mit Saver)

  • +1 für ein großartiges Beispiel der SavedModel-API. Allerdings wünsche ich Ihnen Speichern Sie das Modell Abschnitt zeigte eine Trainingsschleife wie die Antwort von Ryan Sepassi! Mir ist klar, dass dies eine alte Frage ist, aber diese Antwort ist eines der wenigen (und wertvollen) Beispiele für SavedModel, die ich bei Google gefunden habe.

    – Dylan F

    26. Dezember 2017 um 3:07 Uhr

  • @Tom, das ist eine großartige Antwort – nur eine, die auf das neue SavedModel abzielt. Könnten Sie sich diese SavedModel-Frage ansehen? stackoverflow.com/questions/48540744/…

    – blaue Sommer

    11. Februar 2018 um 15:10 Uhr

  • Sorgen Sie jetzt dafür, dass alles mit TF Eager-Modellen richtig funktioniert. Google riet in seiner Präsentation von 2018 jedem, sich vom TF-Grafikcode zu lösen.

    – Geoffrey Anderson

    26. September 2018 um 18:50 Uhr

Benutzer-Avatar
Nr

Sie können auch diesen einfacheren Weg gehen.

Schritt 1: Initialisieren Sie alle Ihre Variablen

W1 = tf.Variable(tf.truncated_normal([6, 6, 1, K], stddev=0.1), name="W1")
B1 = tf.Variable(tf.constant(0.1, tf.float32, [K]), name="B1")

Similarly, W2, B2, W3, .....

Schritt 2: Speichern Sie die Sitzung im Modell Saver und speichern Sie es

model_saver = tf.train.Saver()

# Train the model and save it in the end
model_saver.save(session, "saved_models/CNN_New.ckpt")

Schritt 3: Stellen Sie das Modell wieder her

with tf.Session(graph=graph_cnn) as session:
    model_saver.restore(session, "saved_models/CNN_New.ckpt")
    print("Model restored.") 
    print('Initialized')

Schritt 4: Überprüfen Sie Ihre Variable

W1 = session.run(W1)
print(W1)

Verwenden Sie während der Ausführung in einer anderen Python-Instanz

with tf.Session() as sess:
    # Restore latest checkpoint
    saver.restore(sess, tf.train.latest_checkpoint('saved_model/.'))

    # Initalize the variables
    sess.run(tf.global_variables_initializer())

    # Get default graph (supply your custom graph if you have one)
    graph = tf.get_default_graph()

    # It will give tensor object
    W1 = graph.get_tensor_by_name('W1:0')

    # To get the value (numpy array)
    W1_value = session.run(W1)

  • Hallo, wie kann ich das Modell nach angenommenen 3000 Iterationen speichern, ähnlich wie bei Caffe. Ich habe herausgefunden, dass Tensorflow nur die letzten Modelle speichert, obwohl ich die Iterationsnummer mit dem Modell verkette, um es unter allen Iterationen zu unterscheiden. Ich meine model_3000.ckpt, model_6000.ckpt, — model_100000.ckpt. Können Sie bitte erklären, warum nicht alle gespeichert werden, sondern nur die letzten 3 Iterationen.

    – Khan

    4. April 2017 um 10:32 Uhr

  • @khan siehe stackoverflow.com/questions/38265061/…

    – Himanshu Babal

    14. April 2017 um 21:28 Uhr

  • Gibt es eine Methode, um alle im Diagramm gespeicherten Variablen/Operationsnamen abzurufen?

    – Moondra

    11. Oktober 2017 um 17:36 Uhr

1128600cookie-checkWie kann ich ein Modell nach dem Training speichern/wiederherstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy