Tensorflow : 모델을 저장 / 복원하는 방법?


552

Tensorflow에서 모델을 학습 한 후 :

  1. 훈련 된 모델을 어떻게 저장합니까?
  2. 나중에이 저장된 모델을 어떻게 복원합니까?

초기 모델에 사용 된 변수를 복원 할 수 있었습니까? 나는 또한 똑같은 문제를 시도하고 있지만 시작 모델을 훈련하는 동안 사용 된 변수 세트를 작성할 수 없습니다 (ckpt 파일이 있음)
exAres

나는 시작 모델로 시도하지 않았습니다. 모델의 네트워크 구조 이름이 있습니까? Ryan이 설명하는 것처럼 네트워크를 복제 한 다음 가중치 및 바이어스 (ckpt 파일)를로드해야합니다. 어쩌면
mathetes

알았어 이전에 다른 사전 훈련 된 tensorflow 모델을로드했지만 시작 모델의 변수 사양을 찾고있었습니다. 감사.
exares

1
훈련을 계속하기 위해 복원하는 경우 Saver 검사 점을 사용하십시오. 참조를 위해 모델을 저장하면 tensorflow SavedModel API 만 있습니다.
HY G

또한 LSTM을 사용하는 경우 문자열에서 문자 목록으로의 맵이 있으므로 동일한 순서로 해당 목록을 저장하고로드하십시오! 이것은 모델 가중치 및 모델 그래프 네트워크를 저장하여 다루지 않으며 세션을 변경하거나 데이터를 변경할 때 모델이로드되지 않은 것처럼 보이게합니다.
devssh

답변:


119

문서

문서에서 :

저장

# 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)

복원

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())

텐서 플로우 2

이것은 여전히 ​​베타 버전이므로 지금은 조언하지 않습니다. 여전히 그 길을 가고 싶다면 tf.saved_model사용 안내서가 있습니다.

텐서 플로우 <2

simple_save

많은 좋은 대답, 완전성을 위해 2 센트를 추가합니다 : simple_save . tf.data.DatasetAPI 를 사용하는 독립형 코드 예제도 있습니다.

파이썬 3; 텐서 플로우 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
        )

복원 :

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
        })

독립형 예

원본 블로그 게시물

다음 코드는 데모를 위해 임의의 데이터를 생성합니다.

  1. 플레이스 홀더를 작성하여 시작합니다. 런타임시 데이터를 보유합니다. 그들로부터 우리는를 Dataset만든 다음 그것의를 만듭니다 Iterator. input_tensor모델에 대한 입력으로 사용되는 이터레이터의 생성 된 텐서를 얻습니다 .
  2. 모델 자체는 input_tensorGRU 기반 양방향 RNN과 고밀도 분류기 에서 빌드 됩니다. 왜 안돼?
  3. 손실은로 softmax_cross_entropy_with_logits최적화되어 Adam있습니다. 에포크 2 개 (각 2 개 배치) 후에 "트레이닝 된"모델을로 저장합니다 tf.saved_model.simple_save. 코드를있는 그대로 실행하면 모델이 simple/현재 작업 디렉토리 에있는 폴더에 저장됩니다 .
  4. 새 그래프에서로 저장된 모델을 복원합니다 tf.saved_model.loader.load. 우리는 자리와와 logits 잡아 graph.get_tensor_by_nameIterator와 초기화 작업을 graph.get_operation_by_name.
  5. 마지막으로 데이터 세트의 두 배치에 대해 유추를 실행하고 저장된 모델과 복원 된 모델이 모두 동일한 값을 생성하는지 확인합니다. 그들이하다!

암호:

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)

인쇄됩니다 :

$ 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

1
초보자이고 더 많은 설명이 필요합니다 ... : CNN 모델이있는 경우 1 개만 입력해야합니다. inputs_placeholder 2. labels_placeholder 및 3. output_of_cnn? 아니면 모든 중간 tf.contrib.layers?
비가 오는

2
그래프가 완전히 복원됩니다. 실행 중인지 확인할 수 [n.name for n in graph2.as_graph_def().node]있습니다. 문서에서 알 수 있듯이 간단한 저장은 tensorflow 제공과의 상호 작용을 단순화하는 것을 목표로합니다. 이는 논쟁의 요점입니다. 그러나 다른 변수는 여전히 복원되며, 그렇지 않으면 추론이 발생하지 않습니다. 예제에서와 같이 관심 변수를 가져 오십시오. 문서를
ted

@ tf.saved_model.simple_save 대 tf.train.Saver ()를 언제 사용합니까? 내 직감에서 나는 훈련 중에 tf.train.Saver ()를 사용하고 다른 순간을 저장하려고합니다. 프로덕션에서 사용하기 위해 교육을 받으면 tf.saved_model.simple_save를 사용합니다. (나는 여기 에 의견을 똑같이 물었다 )
loco.loop

1
좋은 생각이지만 Eager 모드 모델 및 tfe.Saver에서도 작동합니까?
Geoffrey Anderson

1
global_step논란의 여지 없이 , 만약 당신이 멈추었다가 다시 훈련을 받으려고한다면, 당신은 한 걸음이라고 생각할 것입니다. 최소한 텐서 보드 시각화를 망칠 것입니다
Monica Heddneck

252

모델 저장 및 복원에 대한 세부 정보를 추가하기 위해 답변을 개선하고 있습니다.

IN (이후) Tensorflow 버전 0.11 :

모델을 저장하십시오.

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)

모델을 복원하십시오.

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 

이것과 몇 가지 고급 사용 사례가 여기에 잘 설명되어 있습니다.

Tensorflow 모델을 저장하고 복원하는 빠른 전체 자습서


3
+1 # 저장된 저장된 변수에 직접 접근 print (sess.run ( 'bias : 0')) # 이것은 우리가 저장 한 바이어스 값인 2를 인쇄합니다. 디버깅 목적으로 모델이 올바르게로드되었는지 확인하는 데 도움이됩니다. 변수는 "All_varaibles = tf.get_collection (tf.GraphKeys.GLOBAL_VARIABLES")을 사용하여 얻을 수 있으며 "sess.run (tf.global_variables_initializer ())"도 복원하기 전에 가져와야합니다.
LGG

1
global_variables_initializer를 다시 실행해야합니까? global_variable_initialization을 사용하여 그래프를 복원했으며 동일한 데이터에서 매번 다른 출력을 제공합니다. 그래서 초기화에 주석을 달고 그래프, 입력 변수 및 ops를 복원하면 정상적으로 작동합니다.
Aditya Shinde

@AdityaShinde 나는 항상 매번 다른 값을 얻는 이유를 얻지 못합니다. 그리고 복원을위한 변수 초기화 단계는 포함하지 않았습니다. 내 자신의 코드 btw를 사용하고 있습니다.
Chaine

@AdityaShinde : 값은 이미 복원 기능으로 초기화되었으므로 초기화하지 않아도되므로 제거하십시오. 그러나 init op를 사용하여 왜 다른 출력을 얻었는지 잘 모르겠습니다.
sankit

5
@sankit 텐서를 복원 할 때 왜 :0이름에 추가 합니까?
사 하르 라 비노 비츠

177

TensorFlow 버전 0.11.0RC1에서 (이후), 당신은 저장하고 호출하여 직접 모델을 복원 tf.train.export_meta_graph하고 tf.train.import_meta_graph에 따라 https://www.tensorflow.org/programmers_guide/meta_graph .

모델 저장

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

모델 복원

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_)

4
저장된 모델에서 변수를로드하는 방법? 다른 변수의 값을 복사하는 방법은 무엇입니까?
neel

9
이 코드를 작동시킬 수 없습니다. 모델이 저장되었지만 복원 할 수 없습니다. 이 오류가 발생합니다. <built-in function TF_Run> returned a result with an error set
Saad Qureshi

2
복원 후 위와 같이 변수에 액세스하면 작동합니다. 하지만 변수가 더 직접적으로 사용하여 얻을 수없는 tf.get_variable_scope().reuse_variables()다음 var = tf.get_variable("varname"). "ValueError : 변수 varname이 존재하지 않거나 tf.get_variable ()로 생성되지 않았습니다."라는 오류가 발생합니다. 왜? 이것이 불가능할까요?
Johann Petrak

4
이것은 변수에 대해서만 잘 작동하지만 그래프를 복원 한 후 자리 표시 자에 액세스하여 값을 피드 할 수있는 방법은 무엇입니까?
kbrose

11
변수를 복원하는 방법 만 보여줍니다. 네트워크를 재정의하지 않고 어떻게 전체 모델을 복원하고 새로운 데이터로 테스트 할 수 있습니까?
Chaine

127

TensorFlow 버전 <0.11.0RC1의 경우 :

저장된 검사 점에는 Variable모델 / 그래프 자체가 아니라 모델의 값이 포함되어 있으므로 검사 점을 복원 할 때 그래프가 동일해야합니다.

다음은 변수 체크 포인트를 저장하는 학습 루프와 이전 실행 및 계산 예측에 저장된 변수를 복원하는 평가 섹션이있는 선형 회귀 분석의 예입니다. 물론 원하는 경우 변수를 복원하고 교육을 계속할 수도 있습니다.

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})

다음은 저장 및 복원에 대한 문서 입니다 Variable. 그리고 여기 문서가 있습니다 가 있습니다 Saver.


1
플래그는 사용자 정의됩니다. 다음은이를 정의하는 예입니다. github.com/tensorflow/tensorflow/blob/master/tensorflow/…
Ryan Sepassi

어떤 형식으로 batch_x되어 있어야합니까? 이진? 너피 배열?
pepe

@pepe Numpy arrary는 괜찮을 것입니다. 그리고 요소의 유형은 자리 표시 자의 유형과 일치해야합니다. [link] tensorflow.org/versions/r0.9/api_docs/python/…
Donny

플래그가 오류를 발생시킵니다 undefined. 이 코드에 대해 FLAGS의 정의가 무엇인지 말해 줄 수 있습니까? @RyanSepassi
Muhammad Hannan

명시 적으로 보이려면 : 최신 버전의 Tensorflow 않는 모델 / 그래프를 저장할 수 있습니다. [해답의 어떤 측면이 <0.11 제약 조건에 적용되는지는 확실하지 않습니다. 다수의 공감대를 감안할 때, 나는이 일반적인 진술이 최근 버전에서도 여전히
옳다고 믿고 싶어했다

78

내 환경 : Python 3.6, Tensorflow 1.3.0

많은 솔루션이 있었지만 대부분 기반으로 tf.train.Saver합니다. 우리가로드 할 때 .ckpt구원 Saver, 우리는 하나 예를 들어, tensorflow 네트워크를 재정의 또는 어떤 이상하고 어려운 기억하고 이름을 사용해야합니다 'placehold_0:0', 'dense/Adam/Weight:0'. tf.saved_model아래에 주어진 가장 간단한 예 인 을 사용하는 것이 좋습니다 .TensorFlow 모델 제공에서 더 많은 것을 배울 수 있습니다 .

모델을 저장하십시오.

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()

모델을로드하십시오.

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})

4
SavedModel API의 좋은 예는 +1입니다. 그러나 모델 저장 섹션에 Ryan Sepassi의 답변과 같은 교육 루프가 표시 되기를 바랍니다 . 나는 이것이 오래된 질문이라는 것을 알고 있지만이 응답은 Google에서 찾은 SavedModel의 몇 가지 (그리고 귀중한) 예 중 하나입니다.
Dylan F

@Tom 이것은 훌륭한 답변입니다-새로운 SavedModel을 목표로 한 단 하나. 이 SavedModel 질문을 볼 수 있습니까? stackoverflow.com/questions/48540744/…
bluesummers

이제 TF Eager 모델에서 모두 올바르게 작동합니다. Google은 2018 년 프레젠테이션에서 모든 사람이 TF 그래프 코드를 피할 것을 권고했습니다.
Geoffrey Anderson

55

모델 에는 모델 디렉토리에서와 Supervisor같이 저장되는 모델 정의 graph.pbtxt와 텐서의 숫자 값과 같은 두 부분이 있습니다.model.ckpt-1003418 .

모델 정의는을 사용하여 복원 할 수 있으며 tf.import_graph_def가중치는Saver .

그러나 Saver모델 그래프에 첨부 된 변수의 특수 콜렉션 보유 목록을 사용하며,이 콜렉션은 import_graph_def를 사용하여 초기화되지 않으므로 현재 둘을 함께 사용할 수 없습니다 (로드맵에서 수정). 지금은 Ryan Sepassi의 접근 방식을 사용해야합니다. 노드 이름이 동일한 그래프를 수동으로 생성 Saver하고 가중치를로드하는 데 사용 합니다.

(또는를 사용하여 import_graph_def수동으로 변수를 생성 tf.add_to_collection(tf.GraphKeys.VARIABLES, variable)하고 각 변수에 대해 사용한 다음을 사용하여 해킹 할 수 있습니다 Saver)


inceptionv3을 사용하는 classify_image.py 예제에서는 graphdef 만로드됩니다. 이제 GraphDef에도 Variable이 포함되어 있습니까?
jrabary

1
@jrabary 모델이 정지 되었을 수 있습니다.
Eric Platon

1
야, 나는 tensorflow를 처음 사용하고 모델을 저장하는 데 문제가 있습니다. stackoverflow.com/questions/48083474/…를
Ruchir Baronia

39

이보다 쉬운 방법도 있습니다.

1 단계 : 모든 변수 초기화

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, .....

2 단계 : 세션을 모델 내부에 Saver저장하고 저장

model_saver = tf.train.Saver()

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

3 단계 : 모델 복원

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

4 단계 : 변수 확인

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

다른 파이썬 인스턴스에서 실행하는 동안

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)

안녕하세요, Caffe와 비슷한 3000 번 반복 한 후에 모델을 어떻게 저장할 수 있습니까? 나는 tensorflow가 모델과 반복 번호를 연결하여 모든 반복 중에서 구별하기 위해 마지막 모델 만 저장한다는 것을 알았습니다. 나는 model_3000.ckpt, model_6000.ckpt, --- model_100000.ckpt를 의미합니다. 왜 마지막 세 번의 반복 만 저장하지 않는지 친절하게 설명 할 수 있습니까?
khan


3
그래프 내에 저장된 모든 변수 / 연산 이름을 얻는 방법이 있습니까?
Moondra

21

대부분의 경우 a를 사용하여 디스크에서 저장 및 복원하는 tf.train.Saver것이 가장 좋습니다.

... # build your model
saver = tf.train.Saver()

with tf.Session() as sess:
    ... # train the model
    saver.save(sess, "/tmp/my_great_model")

with tf.Session() as sess:
    saver.restore(sess, "/tmp/my_great_model")
    ... # use the model

그래프 구조 자체를 저장 / 복원 할 수도 있습니다 (자세한 내용은 MetaGraph 설명서 참조). 기본적으로 Saver그래프 구조는 .meta파일 로 저장 됩니다. 전화 import_meta_graph()를 걸어 복원 할 수 있습니다 . 그래프 구조 Saver를 복원하고 모델 상태를 복원하는 데 사용할 수있는를 반환합니다 .

saver = tf.train.import_meta_graph("/tmp/my_great_model.meta")

with tf.Session() as sess:
    saver.restore(sess, "/tmp/my_great_model")
    ... # use the model

그러나 훨씬 더 빠른 것이 필요한 경우가 있습니다. 예를 들어, 조기 중지를 구현하는 경우 (검증 세트에서 측정 한대로) 훈련 중에 모델이 개선 될 때마다 체크 포인트를 저장 한 다음 일정 시간 동안 진행되지 않으면 최상의 모델로 롤백하려고합니다. 모델이 향상 될 때마다 모델을 디스크에 저장하면 훈련 속도가 엄청나게 느려집니다. 트릭은 변수 상태를 memory 에 저장 한 다음 나중에 복원하는 것입니다.

... # build your model

# get a handle on the graph nodes we need to save/restore the model
graph = tf.get_default_graph()
gvars = graph.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
assign_ops = [graph.get_operation_by_name(v.op.name + "/Assign") for v in gvars]
init_values = [assign_op.inputs[1] for assign_op in assign_ops]

with tf.Session() as sess:
    ... # train the model

    # when needed, save the model state to memory
    gvars_state = sess.run(gvars)

    # when needed, restore the model state
    feed_dict = {init_value: val
                 for init_value, val in zip(init_values, gvars_state)}
    sess.run(assign_ops, feed_dict=feed_dict)

간단한 설명 : 변수를 만들 때 XTensorFlow는 자동으로 할당 작업 X/Assign을 만들어 변수의 초기 값을 설정합니다. 자리 표시 자와 추가 할당 op (그래프를 복잡하게 만드는)를 만드는 대신 이러한 기존 할당 op를 사용합니다. 각 할당 op의 첫 번째 입력은 초기화해야하는 변수에 대한 참조이며 두 번째 입력 ( assign_op.inputs[1])은 초기 값입니다. 따라서 초기 값 대신 원하는 값을 설정하려면 a를 사용 feed_dict하고 초기 값을 바꿔야합니다. 예, TensorFlow를 사용하면 자리 표시 자뿐만 아니라 모든 op에 대한 값을 제공 할 수 있으므로 제대로 작동합니다.


답변 해주셔서 감사합니다. 단일 .ckpt 파일을 두 개의 .index 및 .data 파일로 변환하는 방법에 대한 비슷한 질문이 있습니다 (예 : tf.slim에서 사용 가능한 사전 훈련 된 시작 모델의 경우). 내 질문은 여기에 있습니다 : stackoverflow.com/questions/47762114/…
Amir

야, 나는 tensorflow를 처음 사용하고 모델을 저장하는 데 문제가 있습니다. stackoverflow.com/questions/48083474/…를
Ruchir Baronia

17

Yaroslav가 말했듯이 그래프를 가져오고 변수를 수동으로 만든 다음 Saver를 사용하여 graph_def 및 검사 점에서 복원을 해킹 할 수 있습니다.

나는 개인적인 용도로 이것을 구현했기 때문에 여기에서 코드를 공유 할 수는 있습니다.

링크 : https://gist.github.com/nikitakit/6ef3b72be67b86cb7868

(물론 이것은 해킹이므로이 방법으로 저장된 모델이 이후 버전의 TensorFlow에서 계속 읽을 수 있다고 보장 할 수 없습니다.)


14

내부 저장 모델 인 경우 모든 변수에 대해 복원자를 다음과 같이 지정하면됩니다.

restorer = tf.train.Saver(tf.all_variables())

현재 세션에서 변수를 복원하는 데 사용하십시오.

restorer.restore(self._sess, model_file)

외부 모델의 경우 변수 이름에서 변수 이름으로의 맵핑을 지정해야합니다. 명령을 사용하여 모델 변수 이름을 볼 수 있습니다

python /path/to/tensorflow/tensorflow/python/tools/inspect_checkpoint.py --file_name=/path/to/pretrained_model/model.ckpt

inspect_checkpoint.py 스크립트는 Tensorflow 소스의 './tensorflow/python/tools'폴더에 있습니다.

매핑을 지정하기 위해 Tensorflow-Worklab을 사용할 수 있습니다 . 여기에는 다양한 모델을 학습 및 재교육하는 클래스 및 스크립트 세트가 포함되어 있습니다. 여기에있는 ResNet 모델 재교육 예가 포함되어 있습니다 .


all_variables()더 이상 사용되지 않습니다
MiniQuark

야, 나는 tensorflow를 처음 사용하고 모델을 저장하는 데 문제가 있습니다. 당신이 나를 도울 수 있다면 정말 감사하겠습니다 stackoverflow.com/questions/48083474/...
Ruchir Baronia

12

다음은 파일에서 그래프를로드 할 것인지 런타임 중에 빌드 할 것인지에 대한 두 가지 기본 사례에 대한 간단한 해결책입니다.

이 답변은 Tensorflow 0.12 이상 (1.0 포함)에 적용됩니다.

코드에서 그래프 재구성

절약

graph = ... # build the graph
saver = tf.train.Saver()  # create the saver after the graph
with ... as sess:  # your session object
    saver.save(sess, 'my-model')

로딩

graph = ... # build the graph
saver = tf.train.Saver()  # create the saver after the graph
with ... as sess:  # your session object
    saver.restore(sess, tf.train.latest_checkpoint('./'))
    # now you can use the graph, continue training or whatever

파일에서 그래프도 불러 오기

이 기술을 사용할 때는 모든 레이어 / 변수에 고유 한 이름이 명시 적으로 설정되어 있는지 확인하십시오.그렇지 않으면 Tensorflow가 이름을 고유하게 만들어 파일에 저장된 이름과 다를 수 있습니다. 이전 기술에서는 문제가되지 않습니다. 이름은로드와 저장에서 같은 방식으로 "혼합"되기 때문입니다.

절약

graph = ... # build the graph

for op in [ ... ]:  # operators you want to use after restoring the model
    tf.add_to_collection('ops_to_restore', op)

saver = tf.train.Saver()  # create the saver after the graph
with ... as sess:  # your session object
    saver.save(sess, 'my-model')

로딩

with ... as sess:  # your session object
    saver = tf.train.import_meta_graph('my-model.meta')
    saver.restore(sess, tf.train.latest_checkpoint('./'))
    ops = tf.get_collection('ops_to_restore')  # here are your operators in the same order in which you saved them to the collection

-1 "여기에서 다른 모든 답변"을 무시하여 답변을 시작하는 것은 약간 어렵습니다. 즉, 다른 이유로 하향 투표했습니다. 훈련 가능한 변수뿐만 아니라 모든 전역 변수를 확실히 저장해야합니다. 예를 들어 global_step배치 정규화 의 변수 및 이동 평균은 훈련 할 수없는 변수이지만 둘 다 확실히 절약 할 가치가 있습니다. 또한 그래프 구성과 세션 실행을보다 명확하게 구분해야합니다. 예를 들어, 그래프를 실행할 Saver(...).save()때마다 새 노드가 생성됩니다. 아마 당신이 원하는 것이 아닙니다. 그리고 더 많은 ... : /
MiniQuark

@MiniQuark 좋아, 귀하의 의견에 감사드립니다, 귀하의 제안에 따라 답변을 편집하겠습니다;)
Martin Pecka

10

모델을 쉽게 관리하는 데 도움이되는 방법 과 방법을 제공하는 TensorFlow / skflow 에서 예제 를 확인할 수도 있습니다. 모델 백업 빈도를 제어 할 수있는 매개 변수도 있습니다.saverestore


9

tf.train.MonitoredTrainingSession 을 기본 세션으로 사용하는 경우 저장 / 복원을 위해 코드를 추가 할 필요가 없습니다. 검사 점 디렉토리 이름을 MonitoredTrainingSession의 생성자에게 전달하면 세션 후크를 사용하여 처리합니다.


tf.train.Supervisor 를 사용 하면 이러한 세션 생성을 처리하고보다 완벽한 솔루션을 제공합니다.
Mark

1
@Mark tf.train.Supervisor는 더 이상 사용되지 않습니다
Changming Sun

Supervisor가 더 이상 사용되지 않는다는 주장을 뒷받침하는 링크가 있습니까? 나는 이것이 사실임을 나타내는 것을 보지 못했습니다.
Mark


URL에 감사드립니다-나는 정보의 원본을 확인했으며 TF 1.x 시리즈가 끝날 때까지 주변에있을 것이라고 들었지만 그 이후에는 보장 할 수 없습니다.
Mark

8

여기에있는 모든 대답은 훌륭하지만 두 가지를 추가하고 싶습니다.

먼저 @ user7505159의 답변을 자세히 설명하려면 복원중인 파일 이름의 시작 부분에 "./"를 추가해야합니다.

예를 들어 파일 이름에 "./"가없는 그래프를 다음과 같이 저장할 수 있습니다.

# Some graph defined up here with specific names

saver = tf.train.Saver()
save_file = 'model.ckpt'

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    saver.save(sess, save_file)

그러나 그래프를 복원하려면 file_name 앞에 "./"를 추가해야합니다.

# Same graph defined up here

saver = tf.train.Saver()
save_file = './' + 'model.ckpt' # String addition used for emphasis

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    saver.restore(sess, save_file)

항상 "./"가 필요하지는 않지만 환경과 버전의 TensorFlow에 따라 문제가 발생할 수 있습니다.

또한 sess.run(tf.global_variables_initializer())세션을 복원하기 전에이 기능이 중요 할 수 있음 을 언급하고자합니다 .

저장된 세션을 복원하려고 할 때 초기화되지 않은 변수와 관련된 오류가 발생 sess.run(tf.global_variables_initializer())하면 saver.restore(sess, save_file)행 앞에 포함시켜야 합니다. 두통을 줄일 수 있습니다.


7

6255 호에 설명 된대로 :

use '**./**model_name.ckpt'
saver.restore(sess,'./my_model_final.ckpt')

대신에

saver.restore('my_model_final.ckpt')

7

새로운 Tensorflow 버전에 따르면 tf.train.Checkpoint모델을 저장하고 복원하는 가장 좋은 방법은 다음과 같습니다.

Checkpoint.saveCheckpoint.restore읽고 쓰기 기록하고 variable.name 기반 체크 포인트를 판독 tf.train.Saver 달리, 체크 포인트 오브젝트 기반. 객체 기반 검사 점은 명명 된 모서리를 가진 Python 객체 (Layers, Optimizer, Variables 등) 간의 종속성 그래프를 저장하며이 그래프는 검사 점을 복원 할 때 변수를 일치시키는 데 사용됩니다. Python 프로그램의 변경 사항에 대해보다 강력 할 수 있으며, 열심히 실행할 때 변수를 만들 때 복원시 지원할 수 있습니다. 선호 tf.train.Checkpoint이상 tf.train.Saver새로운 코드 .

예를 들면 다음과 같습니다.

import tensorflow as tf
import os

tf.enable_eager_execution()

checkpoint_directory = "/tmp/training_checkpoints"
checkpoint_prefix = os.path.join(checkpoint_directory, "ckpt")

checkpoint = tf.train.Checkpoint(optimizer=optimizer, model=model)
status = checkpoint.restore(tf.train.latest_checkpoint(checkpoint_directory))
for _ in range(num_training_steps):
  optimizer.minimize( ... )  # Variables will be restored on creation.
status.assert_consumed()  # Optional sanity checks.
checkpoint.save(file_prefix=checkpoint_prefix)

자세한 내용과 예는 여기에 있습니다.


7

들어 tensorflow 2.0 , 그것은이다 단순하게

# Save the model
model.save('path_to_my_model.h5')

복원하려면

new_model = tensorflow.keras.models.load_model('path_to_my_model.h5')

모델 객체의 일부가 아닌 모든 사용자 정의 tf 연산 및 변수는 어떻습니까? 모델에서 save ()를 호출하면 어떻게 든 저장됩니까? 추론 및 생성 네트워크에서 사용되는 다양한 사용자 정의 손실 및 tensorflow-probability 표현이 있지만 모델의 일부가 아닙니다. 내 keras 모델 객체에는 조밀하고 전환 레이어 만 포함되어 있습니다. TF 1에서는 방금 save 메소드를 호출했으며 그래프에 사용 된 모든 조작 및 텐서가 저장 될 것임을 확신 할 수있었습니다. TF2에서는 어떻게 든 keras 모델에 추가되지 않은 작업이 저장되는지 알 수 없습니다.
Kristof

TF 2.0의 모델 복원에 대한 추가 정보가 있습니까? 나는 C API를 통해 생성 된 체크 포인트 파일에서 가중치를 복원 할 수 없습니다, 참조 : stackoverflow.com/questions/57944786/...
jregalad


5

tf.keras로 모델 저장 TF2.0

TF1.x를 사용하여 모델을 저장하면 큰 답변을 볼 수 있습니다. tensorflow.keras모델을 저장하는 방법이 많기 때문에 모델을 저장하는 데 더 많은 포인터를 제공하고 싶습니다 .

여기에서는 현재 디렉토리 아래의 폴더에 tensorflow.keras모델을 저장하는 예를 제공합니다 model_path. 이것은 가장 최근의 tensorflow (TF2.0)에서 잘 작동합니다. 가까운 시일 내에 변경 사항이 있으면이 설명을 업데이트하겠습니다.

전체 모델 저장 및로드

import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist

#import data
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# create a model
def create_model():
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])
# compile the model
  model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
  return model

# Create a basic model instance
model=create_model()

model.fit(x_train, y_train, epochs=1)
loss, acc = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))

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

# Recreate the exact same model, including weights and optimizer.
new_model = keras.models.load_model('./model_path/my_model.h5')
loss, acc = new_model.evaluate(x_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

모델 무게 저장 및 불러 오기

모델 가중치 만 저장 한 다음 가중치를로드하여 모델을 복원하려는 경우

model.fit(x_train, y_train, epochs=5)
loss, acc = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))

# Save the weights
model.save_weights('./checkpoints/my_checkpoint')

# Restore the weights
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')

loss,acc = model.evaluate(x_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

keras 검사 점 콜백을 사용하여 저장 및 복원

# include the epoch in the file name. (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(
    checkpoint_path, verbose=1, save_weights_only=True,
    # Save weights, every 5-epochs.
    period=5)

model = create_model()
model.save_weights(checkpoint_path.format(epoch=0))
model.fit(train_images, train_labels,
          epochs = 50, callbacks = [cp_callback],
          validation_data = (test_images,test_labels),
          verbose=0)

latest = tf.train.latest_checkpoint(checkpoint_dir)

new_model = create_model()
new_model.load_weights(latest)
loss, acc = new_model.evaluate(test_images, test_labels)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

맞춤 측정 항목으로 모델 저장

import tensorflow as tf
from tensorflow import keras
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

# Custom Loss1 (for example) 
@tf.function() 
def customLoss1(yTrue,yPred):
  return tf.reduce_mean(yTrue-yPred) 

# Custom Loss2 (for example) 
@tf.function() 
def customLoss2(yTrue, yPred):
  return tf.reduce_mean(tf.square(tf.subtract(yTrue,yPred))) 

def create_model():
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),  
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])
  model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy', customLoss1, customLoss2])
  return model

# Create a basic model instance
model=create_model()

# Fit and evaluate model 
model.fit(x_train, y_train, epochs=1)
loss, acc,loss1, loss2 = model.evaluate(x_test, y_test,verbose=1)
print("Original model, accuracy: {:5.2f}%".format(100*acc))

model.save("./model.h5")

new_model=tf.keras.models.load_model("./model.h5",custom_objects={'customLoss1':customLoss1,'customLoss2':customLoss2})

맞춤형 조작으로 keras 모델 저장

다음 사례 ( tf.tile)와 같이 사용자 지정 작업이있는 경우 함수를 만들고 Lambda 레이어로 래핑해야합니다. 그렇지 않으면 모델을 저장할 수 없습니다.

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Lambda
from tensorflow.keras import Model

def my_fun(a):
  out = tf.tile(a, (1, tf.shape(a)[0]))
  return out

a = Input(shape=(10,))
#out = tf.tile(a, (1, tf.shape(a)[0]))
out = Lambda(lambda x : my_fun(x))(a)
model = Model(a, out)

x = np.zeros((50,10), dtype=np.float32)
print(model(x).numpy())

model.save('my_model.h5')

#load the model
new_model=tf.keras.models.load_model("my_model.h5")

tf.keras 모델을 저장하는 여러 가지 방법 중 일부를 다루었다고 생각합니다. 그러나 다른 많은 방법이 있습니다. 사용 사례가 위에서 다루지 않은 경우 아래에 의견을 보내주십시오. 감사!


3

tf.train.Saver를 사용하여 모델을 저장하고, 모델 크기를 줄이려면 var_list를 지정해야합니다. val_list는 tf.trainable_variables 또는 tf.global_variables 일 수 있습니다.


3

다음을 사용 하여 네트워크에 변수를 저장할 수 있습니다

saver = tf.train.Saver() 
saver.save(sess, 'path of save/fileName.ckpt')

나중에 또는 다른 스크립트에서 재사용 할 수 있도록 네트워크복원 하려면 다음을 사용하십시오.

saver = tf.train.Saver()
saver.restore(sess, tf.train.latest_checkpoint('path of save/')
sess.run(....) 

중요한 점 :

  1. sess 첫 번째 실행과 이후 실행 사이에 동일해야합니다 (일관된 구조).
  2. saver.restore 개별 파일 경로가 아닌 저장된 파일의 폴더 경로가 필요합니다.

2

모델을 저장하려는 모든 곳에서

self.saver = tf.train.Saver()
with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            ...
            self.saver.save(sess, filename)

tf.Variable나중에 이름을 사용하여 복원 할 수 있으므로 모든 이름이 있는지 확인하십시오 . 그리고 당신이 예측하고 싶은 곳,

saver = tf.train.import_meta_graph(filename)
name = 'name given when you saved the file' 
with tf.Session() as sess:
      saver.restore(sess, name)
      print(sess.run('W1:0')) #example to retrieve by variable name

보호기가 해당 세션 내에서 실행되는지 확인하십시오. 를 사용 tf.train.latest_checkpoint('./')하면 최신 확인 지점 만 사용됩니다.


2

나는 버전에 있습니다 :

tensorflow (1.13.1)
tensorflow-gpu (1.13.1)

간단한 방법은

저장:

model.save("model.h5")

복원:

model = tf.keras.models.load_model("model.h5")

2

텐서 플로우 2.0

매우 간단합니다.

import tensorflow as tf

저장

model.save("model_name")

복원

model = tf.keras.models.load_model('model_name')

1

@Vishnuvardhan Janapati의 답변에 따라 TensorFlow 2.0.0 에서 사용자 정의 레이어 / 메트릭 / 손실로 모델을 저장하고 다시로드하는 또 다른 방법이 있습니다.

import tensorflow as tf
from tensorflow.keras.layers import Layer
from tensorflow.keras.utils.generic_utils import get_custom_objects

# custom loss (for example)  
def custom_loss(y_true,y_pred):
  return tf.reduce_mean(y_true - y_pred)
get_custom_objects().update({'custom_loss': custom_loss}) 

# custom loss (for example) 
class CustomLayer(Layer):
  def __init__(self, ...):
      ...
  # define custom layer and all necessary custom operations inside custom layer

get_custom_objects().update({'CustomLayer': CustomLayer})  

이러한 방법으로, 당신은 코드를 실행하고, 일단 귀하의 모델을 저장 tf.keras.models.save_model하거나 model.save또는 ModelCheckpoint단순하게, 당신은, 정확한 사용자 정의 개체의 필요없이 모델을 다시로드 할 수 있습니다 콜백

new_model = tf.keras.models.load_model("./model.h5"})

0

tensorflow 2.0의 새 버전에서는 모델 저장 /로드 프로세스가 훨씬 쉽습니다. Keras API의 구현으로 인해 TensorFlow의 고급 API입니다.

모델을 저장하려면 다음을 참조하십시오. 설명서는 https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/save_model

tf.keras.models.save_model(model_name, filepath, save_format)

모델을로드하려면

https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/load_model

model = tf.keras.models.load_model(filepath)

0

여기에 사용하는 간단한 예입니다 Tensorflow 2.0 SavedModel의 형식 (권장 형식 인 워드 프로세서에 따라 ) 너무 많은 공상에 가지 않고 Keras 기능 API를 사용하여 간단한 MNIST 데이터 세트 분류기는 :

# Imports
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Flatten
from tensorflow.keras.models import Model
import matplotlib.pyplot as plt

# Load data
mnist = tf.keras.datasets.mnist # 28 x 28
(x_train,y_train), (x_test, y_test) = mnist.load_data()

# Normalize pixels [0,255] -> [0,1]
x_train = tf.keras.utils.normalize(x_train,axis=1)
x_test = tf.keras.utils.normalize(x_test,axis=1)

# Create model
input = Input(shape=(28,28), dtype='float64', name='graph_input')
x = Flatten()(input)
x = Dense(128, activation='relu')(x)
x = Dense(128, activation='relu')(x)
output = Dense(10, activation='softmax', name='graph_output', dtype='float64')(x)
model = Model(inputs=input, outputs=output)

model.compile(optimizer='adam',
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

# Train
model.fit(x_train, y_train, epochs=3)

# Save model in SavedModel format (Tensorflow 2.0)
export_path = 'model'
tf.saved_model.save(model, export_path)

# ... possibly another python program 

# Reload model
loaded_model = tf.keras.models.load_model(export_path) 

# Get image sample for testing
index = 0
img = x_test[index] # I normalized the image on a previous step

# Predict using the signature definition (Tensorflow 2.0)
predict = loaded_model.signatures["serving_default"]
prediction = predict(tf.constant(img))

# Show results
print(np.argmax(prediction['graph_output']))  # prints the class number
plt.imshow(x_test[index], cmap=plt.cm.binary)  # prints the image

무엇입니까 serving_default?

선택한 태그서명 정의 이름입니다 (이 경우 기본 serve태그가 선택됨). 또한, 여기에 사용하는 모델의 태그의 및 서명을 찾는 방법을 설명합니다 saved_model_cli.

면책

이것은 당신이 그것을 시작하고 실행하려는 경우에 단지 기본적인 예이지만, 결코 완전한 대답은 아닙니다-아마 나중에 업데이트 할 수 있습니다. 방금 간단한 예제를 사용하고 싶었습니다.SavedModel TF 2.0에서 왜냐하면이 단순한 곳조차도 보지 못했기 때문입니다.

@ Tom 의 대답은 SavedModel 예제이지만 불행히도 몇 가지 주요 변경 사항이 있기 때문에 Tensorflow 2.0에서는 작동하지 않습니다.

@ Vishnuvardhan Janapati 의 답변에 TF 2.0이 있지만 SavedModel 형식은 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.