টেনসরফ্লো: কীভাবে কোনও মডেল সংরক্ষণ / পুনরুদ্ধার করবেন?


552

টেনসরফ্লোতে আপনি কোনও মডেলকে প্রশিক্ষণ দেওয়ার পরে:

  1. আপনি প্রশিক্ষিত মডেলটি কীভাবে সংরক্ষণ করবেন?
  2. আপনি কীভাবে পরে এই সংরক্ষিত মডেলটি পুনরুদ্ধার করবেন?

আপনি কি ইনসেপশন মডেলটিতে ব্যবহৃত ভেরিয়েবলগুলি পুনরুদ্ধার করতে সক্ষম ছিলেন? আমিও ঠিক একই সমস্যাটি চেষ্টা করছি তবে আমি উদ্বোধনী মডেলটির প্রশিক্ষণ দেওয়ার সময় ব্যবহৃত ভেরিয়েবলগুলির সেট লিখতে অক্ষম (যার মধ্যে আমার সিসিপিটি ফাইল রয়েছে)
প্রাক্তন

আমি ইনসেপশন মডেলটি দিয়ে চেষ্টা করি নি। আপনার কি মডেলের নামগুলির সাথে নেটওয়ার্ক কাঠামো আছে? রায়ান ব্যাখ্যা করার সাথে সাথে আপনাকে নেটওয়ার্কটি প্রতিলিপি করতে হবে এবং তারপরে ওজন এবং বায়াসগুলি (সিসিপিপি ফাইল) লোড করতে হবে। নভেম্বরের ১৫ সালের পর থেকে কিছু পরিবর্তিত হয়েছে এবং এখন আরও সহজ সরল পদ্ধতি রয়েছে, আমি নিশ্চিত নই
গণিত

ঠিক আছে. আমি পূর্বে অন্যান্য প্রাক-প্রশিক্ষিত টেনসরফ্লো মডেলগুলি লোড করেছি তবে ইনসেপশন মডেলের পরিবর্তনশীল স্পেসিফিকেশন খুঁজছিলাম। ধন্যবাদ।
প্রাক্তন

1
আপনি যদি ট্রেন চালিয়ে যেতে পুনরুদ্ধার করেন তবে কেবল সেভার চেকপয়েন্টগুলি ব্যবহার করুন। যদি আপনি মডেলটিকে রেফারেন্স করতে সঞ্চয় করেন তবে কেবল টেনসরফ্লো সেভডমোডেল এপিআই।
এইচওয়াই জি

এছাড়াও আপনি যদি 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 সেন্ট যুক্ত করব: সাদামাটা_সেজ । এছাড়াও tf.data.Datasetএপিআই ব্যবহার করে একটি স্বতন্ত্র কোড উদাহরণ ।

পাইথন 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যা আমাদের মডেলের ইনপুট হিসাবে পরিবেশন করবে called
  2. মডেল নিজে থেকেই নির্মিত হয় input_tensor : একটি জিআরইউ-ভিত্তিক দ্বি নির্দেশিকা আরএনএন এবং তারপরে একটি ঘন শ্রেণিবদ্ধ রয়েছে। কারণ কেন নয়।
  3. ক্ষতি হ'ল একটি softmax_cross_entropy_with_logits, সাথে অনুকূলিত Adam। 2 যুগের পরে (প্রতিটি 2 টি ব্যাচের), আমরা "প্রশিক্ষিত" মডেলটি সংরক্ষণ করি tf.saved_model.simple_save। আপনি যদি কোডটি যেমন চালান তবে মডেলটি একটি ফোল্ডারে সংরক্ষণ করা হবেsimple/ আপনার বর্তমান কার্যকরী ডিরেক্টরিতে ।
  4. একটি নতুন গ্রাফে, আমরা তারপরে সংরক্ষিত মডেলটি পুনরুদ্ধার করি tf.saved_model.loader.load। আমরা স্থানধারক এবং লগিটগুলি graph.get_tensor_by_nameএবং এর সাথে Iteratorশুরু করার অপারেশনটি দখল করি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
আমি শিক্ষানবিশ এবং আমার আরও ব্যাখ্যা প্রয়োজন ...: আমার যদি সিএনএন মডেল থাকে তবে আমার কি কেবল ১ টি সঞ্চয় করা উচিত? নাকি সব মধ্যবর্তী tf.contrib.layers?
বৃষ্টি হচ্ছে

2
গ্রাফটি পুরোপুরি পুনরুদ্ধার করা হয়েছে। আপনি এটি চলমান চেক করতে পারে [n.name for n in graph2.as_graph_def().node]। ডকুমেন্টেশন যেমন বলেছে, সেন্সর সেভের লক্ষ্য টেনসরফ্লো পরিবেশনার সাথে মিথস্ক্রিয়াটিকে সহজতর করা, এটি আর্গুমেন্টের মূল বিষয়; অন্যান্য ভেরিয়েবলগুলি এখনও পুনরুদ্ধার করা হয়েছে, অন্যথায় অনুমানটি ঘটবে না। উদাহরণ হিসাবে আমি যেমন করেছি ঠিক তেমনভাবে আপনার আগ্রহের পরিবর্তনশীলগুলি ধরুন। ডকুমেন্টেশন
16:25 এ 12

@ted আমি কখন tf.saved_model.simple_save বনাম tf.train.Saver () ব্যবহার করব? আমার অন্তর্নিহিততা থেকে আমি প্রশিক্ষণের সময় tf.train.Saver () ব্যবহার করব এবং সময় মতো বিভিন্ন মুহুর্ত সংরক্ষণ করব। উত্পাদনে প্রশিক্ষণের জন্য প্রশিক্ষণ করা হলে আমি tf.saved_model.simple_save ব্যবহার করব। (আমি এখানেও একটি মন্তব্যে এটিই জিজ্ঞাসা করেছি )
লোকো.লুপ

1
আমার অনুমান ভাল, তবে এটি কি ইগার মোড মডেল এবং tfe.Saver এর সাথেও কাজ করে?
জেফ্রি অ্যান্ডারসন

1
global_stepতর্ক ছাড়াই , আপনি যদি থামেন তবে আবার প্রশিক্ষণ নেওয়ার চেষ্টা করুন, এটি আপনাকে এক ধাপ বলে মনে করবে। এটি আপনার টেনসরবোর্ড ভিজ্যুয়ালাইজেশনটি খুব কম সময়ে স্ক্রু করবে
মনিকা হেডডনেক

252

মডেলগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য আরও বিশদ যুক্ত করতে আমি আমার উত্তরকে উন্নত করছি।

(এবং পরে) টেনসরফ্লো সংস্করণ 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 

এটি এবং আরও কিছু উন্নত ব্যবহারের কেসগুলি এখানে খুব ভালভাবে ব্যাখ্যা করা হয়েছে।

টেনসরফ্লো মডেলগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য একটি দ্রুত সম্পূর্ণ টিউটোরিয়াল


3
এই অ্যাক্সেসের জন্য +1 টি সংরক্ষিত ভেরিয়েবলগুলি সরাসরি মুদ্রণ করুন (sess.run ('পক্ষপাত: 0')) # এটি 2 টি মুদ্রণ করবে, যা আমাদের সংরক্ষণ করা পক্ষপাতের মান। মডেলটি সঠিকভাবে লোড হয়েছে কিনা তা দেখতে এটি ডিবাগিংয়ের উদ্দেশ্যে অনেক সাহায্য করে। ভেরিয়েবলগুলি "All_varaabless = tf.get_colલેક્શન (tf.GraphKeys.GLOBAL_VARIABLES") দিয়ে পাওয়া যাবে। এছাড়াও, "sess.run (tf.global_variables_initializer ())" পুনরুদ্ধার করার আগে হতে হবে।
LGG

1
আপনি কি নিশ্চিত যে আমাদের আবার বিশ্বব্যাপী পরিবর্তনশীল_নিটিয়ালাইজার চালাতে হবে? আমি আমার গ্রাফকে বিশ্বব্যাপী পরিবর্তনযোগ্য_ইনাইটালাইজেশন দিয়ে পুনরুদ্ধার করেছি এবং এটি একই ডাটাতে প্রতিবার আমাকে আলাদা আউটপুট দেয়। সুতরাং আমি সূচনাটি মন্তব্য করেছিলাম এবং কেবল গ্রাফ, ইনপুট ভেরিয়েবল এবং অপ্সকে পুনরুদ্ধার করেছি এবং এখন এটি দুর্দান্ত কাজ করে।
আদিত্য শিন্ডে

@ আদিত্যশিন্দে আমি প্রতিবার কেন সবসময় বিভিন্ন মান পাই তা আমি পাই না। এবং আমি পুনরুদ্ধারের জন্য পরিবর্তনশীল সূচনা পদক্ষেপটি অন্তর্ভুক্ত করি নি। আমি আমার নিজস্ব কোড বিটিডাব্লু ব্যবহার করছি।
চেইন

@ আদিত্যশিন্দে: পুনরুদ্ধার ফাংশন দ্বারা মানগুলি ইতিমধ্যে শুরু করা হওয়ায় এটি অপসারণের দরকার নেই। তবে, আমি কেন জানি না কেন আপনি অপ টিপ ব্যবহার করে আলাদা আউটপুট পেয়েছিলেন।
সংগীত

5
@ সংকিট আপনি যখন টেনারগুলি পুনরুদ্ধার করবেন আপনি :0নামগুলিতে কেন যুক্ত করবেন ?
সাহার রবিনোভিজ

177

(এবং পরে) টেনসরফ্লো সংস্করণ 0.11.0RC1 এ, আপনি সরাসরি কল করে tf.train.export_meta_graphএবং https://www.tensorflow.org/programmers_guide/meta_ographictf.train.import_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
সংরক্ষিত মডেল থেকে ভেরিয়েবল লোড করবেন কীভাবে? অন্যান্য কিছু পরিবর্তনশীল মানগুলি কীভাবে অনুলিপি করবেন?
নীল

9
আমি এই কোডটি কাজ করতে অক্ষম। মডেলটি সংরক্ষণ হয় তবে আমি এটি পুনরুদ্ধার করতে পারি না। এটি আমাকে এই ত্রুটি দিচ্ছে। <built-in function TF_Run> returned a result with an error set
সাদ কুরেশি

2
পুনরুদ্ধার করার পরে আমি উপরে প্রদর্শিত মত চলক অ্যাক্সেস, এটি কাজ করে। তবে আমি tf.get_variable_scope().reuse_variables()অনুসরণ করে আরও সরাসরি ভেরিয়েবলগুলি পেতে পারি না var = tf.get_variable("varname")। এটি আমাকে ত্রুটি দেয়: "ভ্যালুএরর: চলক বর্ণটি বিদ্যমান নেই, বা tf.get_variable () দিয়ে তৈরি করা হয়নি।" কেন? এটা কি সম্ভব না?
জোহান পেট্রাক

4
এটি কেবল ভেরিয়েবলের জন্যই ভাল কাজ করে তবে গ্রাফটি পুনরুদ্ধার করার পরে আপনি কীভাবে কোনও স্থানধারক এবং ফিডের মানগুলিতে অ্যাক্সেস পেতে পারেন?
kbrose

11
এটি কেবল ভেরিয়েবলগুলি পুনরুদ্ধার করার পদ্ধতি দেখায়। আপনি কীভাবে পুরো মডেলটি পুনরুদ্ধার করতে পারবেন এবং নেটওয়ার্কটিকে নতুন করে সংজ্ঞায়িত না করে এটি নতুন ডেটাতে পরীক্ষা করতে পারবেন?
চেইন

127

টেনসরফ্লো সংস্করণ <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})

এখানে s এর জন্য দস্তাবেজগুলি রয়েছেVariable , যা সংরক্ষণ এবং পুনরুদ্ধারকে কভার করে। এবং এখানে দস্তাবেজগুলির জন্য রয়েছে Saver


1
FLAGS ব্যবহারকারী-সংজ্ঞায়িত। এখানে তাদের সংজ্ঞায়িত করার একটি উদাহরণ এখানে দেওয়া হয়েছে: github.com/tensorflow/tensorflow/blob/master/tensorflow/…
রায়ান সেপাসি ২

কোন বিন্যাসে হওয়া batch_xদরকার? বাইনারি? নম্পি অ্যারে?
পেপ

@ পেপ নম্পি অ্যারেটি ভাল থাকতে হবে। এবং উপাদানটির ধরণ স্থানধারকের ধরণের সাথে মিলিত হওয়া উচিত। [লিঙ্ক] tensorflow.org/versions/r0.9/api_docs/python/…
ডনি

ফ্ল্যাগস ত্রুটি দেয় undefined। আপনি কি আমাকে বলতে পারেন যে এই কোডটির জন্য কোনটি FLAGS এর ডিফ। @ রায়ানসেপ্যাসি
মুহাম্মদ হান্নান

Tensorflow সাম্প্রতিক সংস্করণ: এটা স্পষ্ট করতে পারি মডেল / গ্রাফ সঞ্চয়ের মঞ্জুরি দিচ্ছেন। [এটি আমার কাছে অস্পষ্ট ছিল, উত্তরের কোন দিকগুলি <0.11 সীমাবদ্ধতার ক্ষেত্রে প্রযোজ্য। বিপুল সংখ্যক উপাখ্যান পেয়ে আমি বিশ্বাস করতে প্ররোচিত হয়েছি যে সাম্প্রতিক সংস্করণগুলির জন্য এই সাধারণ বিবৃতিটি এখনও সত্য]]
bluenote10

78

আমার পরিবেশ: পাইথন 3.6, টেনসরফ্লো 1.3.0

যদিও অনেকগুলি সমাধান হয়েছে, তবে বেশিরভাগই ভিত্তিক tf.train.Saver। আমরা যখন লোড একটি .ckptদ্বারা সংরক্ষিত Saver, আমরা হয় tensorflow নেটওয়ার্কের পুনরায় সংজ্ঞায়িত বা কিছু অদ্ভুত এবং কঠিন মনে নাম ব্যবহার যেমন আছে 'placehold_0:0', 'dense/Adam/Weight:0'। এখানে আমি tf.saved_modelনীচে দেওয়া একটি সহজ উদাহরণ ব্যবহার করার পরামর্শ দিচ্ছি , আপনি টেনসরফ্লো মডেল পরিবেশন করা থেকে আরও শিখতে পারেন :

মডেলটি সংরক্ষণ করুন:

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
সেভডমোডেল এপিআই এর দুর্দান্ত উদাহরণের জন্য +1। তবে, আমি আশা করি আপনার সেভ মডেল বিভাগটি রায়ান সিপাসির উত্তরের মতো একটি প্রশিক্ষণ লুপ দেখিয়েছে! আমি বুঝতে পারি এটি একটি পুরানো প্রশ্ন, তবে গুগলে স্যাভডমোডেলের কয়েকটি (এবং মূল্যবান) উদাহরণগুলির মধ্যে এই প্রতিক্রিয়াটি।
ডিলান এফ

@ টম এটি দুর্দান্ত উত্তর - নতুন স্যাভডমোডেলকে লক্ষ্য করে কেবল একটি। আপনি কি এই সেভডমডেল প্রশ্নটি দেখতে পারেন? stackoverflow.com/questions/48540744/...
bluesummers

এখন এটি টিএফ ইজিার মডেলগুলির সাথে সঠিকভাবে কাজ করুন। গুগল তাদের 2018 টি উপস্থাপনায় প্রত্যেককে টিএফ গ্রাফ কোড থেকে দূরে থাকার পরামর্শ দিয়েছিল।
জেফ্রি অ্যান্ডারসন

55

মডেলটির দুটি অংশ রয়েছে, মডেল সংজ্ঞা, মডেল ডিরেক্টরি Supervisorহিসাবে graph.pbtxtসংরক্ষণ করা হয়েছে এবং টেঞ্জারগুলির সংখ্যাগত মানগুলি, যেমন চেকপয়েন্ট ফাইলগুলিতে সংরক্ষণ করা হয়model.ckpt-1003418

মডেল সংজ্ঞা ব্যবহার করে পুনরুদ্ধার করা যেতে পারে tf.import_graph_def, এবং ওজনগুলি ব্যবহার করে পুনরুদ্ধার করা হবেSaver

তবে Saverমডেল গ্রাফের সাথে সংযুক্ত ভেরিয়েবলগুলির বিশেষ সংগ্রহের হোল্ডিং তালিকা ব্যবহার করুন এবং এই সংগ্রহটি আমদানি_গ্রাফিক_ডিফ ব্যবহার করে আরম্ভ করা হয়নি, তাই আপনি এই মুহুর্তে দুটি একসাথে ব্যবহার করতে পারবেন না (এটি ঠিক করার জন্য এটি আমাদের রোডম্যাপে রয়েছে)। আপাতত, আপনাকে রায়ান সেপাসির পদ্ধতির ব্যবহার করতে হবে - ম্যানুয়ালি অভিন্ন নোডের নাম সহ একটি গ্রাফ তৈরি করুন এবং এর Saverমধ্যে ওজন লোড করতে ব্যবহার করুন ।

(বিকল্পভাবে আপনি এটি ব্যবহার করে import_graph_defম্যানুয়ালি ভেরিয়েবল তৈরি করে tf.add_to_collection(tf.GraphKeys.VARIABLES, variable)এবং প্রতিটি ভেরিয়েবলের জন্য ব্যবহার করে এটি হ্যাক করতে পারেন Saver)


Classif_image.py উদাহরণে যা ইনসেপশনভি 3 ব্যবহার করে, কেবল গ্রাফডিফ লোড হয়। এর অর্থ কি এখন গ্রাফ ডেফেও ভেরিয়েবল রয়েছে?
জারবারি

1
@ জারাবাড়ি মডেলটি সম্ভবত হিমশীতল হয়ে গেছে
এরিক প্লাটোন

1
আরে, আমি টেনস্রোফায় নতুন এবং আমার মডেলটি সংরক্ষণ করতে সমস্যা হচ্ছে। আপনি যদি আমাকে আমাকে স্ট্যাকওভারফ্লো.com
রুচির বড়োনিয়া

39

আপনি এই সহজ উপায় নিতে পারেন।

পদক্ষেপ 1: আপনার সমস্ত ভেরিয়েবল শুরু করুন ize

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)

হাই, আমি ক্যাফের মতো 3000 পুনরাবৃত্তির পরে মডেলটি কীভাবে সংরক্ষণ করতে পারি? আমি জানতে পেরেছিলাম যে টেনস্রফ্লো কেবল সর্বশেষ মডেলগুলিকে সংরক্ষণ করে যদিও আমি সমস্ত পুনরাবৃত্তির মধ্যে আলাদা করার জন্য মডেলটির সাথে পুনরাবৃত্তি সংখ্যাটি সম্মতি করি। আমি মডেল 2004000.ckpt, মডেল_6000.ckpt, --- Model_100000.ckpt বলতে চাইছি। আপনি কেন দয়া করে ব্যাখ্যা করতে পারেন যে এটি সমস্ত সংরক্ষণ করে না কেন কেবল শেষ 3 টি পুনরাবৃত্তিগুলি সংরক্ষণ করে।
খান


3
গ্রাফের মধ্যে সমস্ত ভেরিয়েবল / অপারেশন নামগুলি সংরক্ষণ করার কোনও পদ্ধতি আছে কি?
মুন্দ্রা

21

বেশিরভাগ ক্ষেত্রে, ডিস্কটি ব্যবহার করে সংরক্ষণ এবং পুনরুদ্ধার 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

আপনি নিজে গ্রাফ কাঠামো সংরক্ষণ / পুনরুদ্ধার করতে পারেন ( বিশদ বিবরণের জন্য মেটাগ্রাফ ডকুমেন্টেশন দেখুন)। ডিফল্টরূপে, 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

তবে এমন কিছু ঘটনা রয়েছে যেখানে আপনার খুব দ্রুত প্রয়োজন হয় something উদাহরণস্বরূপ, আপনি যদি তাড়াতাড়ি থামানো বাস্তবায়ন করেন, প্রতিবার প্রশিক্ষণের সময় মডেলটির উন্নতি হওয়ার সময় আপনি চেকপয়েন্টগুলি সংরক্ষণ করতে চান (যাচাইকরণের সেট অনুসারে পরিমাপ করা হয়), তবে যদি কিছু সময়ের জন্য কোনও অগ্রগতি না ঘটে তবে আপনি সেরা মডেলটিতে ফিরে যেতে চান। যদি আপনি প্রতিটি সময় উন্নতি করে মডেলটিকে ডিস্কে সংরক্ষণ করেন তবে এটি প্রশিক্ষণটি প্রচন্ডভাবে কমিয়ে দেবে। কৌশলটি হ'ল পরিবর্তনশীল রাজ্যগুলিকে মেমোরিতে সংরক্ষণ করা , তবে কেবল সেগুলি পরে পুনরুদ্ধার করুন:

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

একটি দ্রুত ব্যাখ্যা: আপনি যখন একটি ভেরিয়েবল তৈরি করেন X, টেনসরফ্লো স্বয়ংক্রিয়ভাবে X/Assignভেরিয়েবলের প্রাথমিক মান সেট করার জন্য একটি অ্যাসাইনমেন্ট অপারেশন তৈরি করে । স্থানধারক এবং অতিরিক্ত অ্যাসাইনমেন্ট অপ্স তৈরি করার পরিবর্তে (যা কেবল গ্রাফকে অশ্লীল করে তুলবে), আমরা কেবলমাত্র এই বিদ্যমান অ্যাসাইনমেন্ট অপ্স ব্যবহার করি। প্রতিটি অ্যাসাইনমেন্ট অপের প্রথম ইনপুটটি সেই ভেরিয়েবলটির assign_op.inputs[1]প্রারম্ভিক হয় যা এটি আরম্ভ করার কথা ছিল এবং দ্বিতীয় ইনপুট ( ) প্রাথমিক মান। সুতরাং আমরা যে কোনও মান সেট করতে (প্রাথমিক মানের পরিবর্তে) সেট করতে, আমাদের একটি ব্যবহার করতে হবে feed_dictএবং প্রাথমিক মানটি প্রতিস্থাপন করতে হবে। হ্যাঁ, টেনসরফ্লো আপনাকে কেবল স্থানধারকদের জন্য নয়, কোনও অপের জন্য একটি মান ফিড করতে দেয়, তাই এটি দুর্দান্ত কাজ করে।


উত্তরের জন্য ধন্যবাদ. আমি একটি একক .ckpt ফাইলকে দুটি .index এবং .data ফাইলে কীভাবে রূপান্তর করতে পারি সে সম্পর্কে আমি একই ধরণের প্রশ্ন পেয়েছি (tf.slim এ উপলব্ধ প্রাক-প্রশিক্ষিত ইনসেপশন মডেলগুলির জন্য বলুন)। আমার প্রশ্নটি এখানে: stackoverflow.com/questions/47762114/…
আমির

আরে, আমি টেনস্রোফায় নতুন এবং আমার মডেলটি সংরক্ষণ করতে সমস্যা হচ্ছে। আপনি যদি আমাকে আমাকে স্ট্যাকওভারফ্লো.com
রুচির বড়োনিয়া

17

ইয়ারোস্লাভ যেমন বলেছিলেন, আপনি গ্রাফটি আমদানি করে, ম্যানুয়ালি ভেরিয়েবলগুলি তৈরি করে এবং তারপরে সেভার ব্যবহার করে গ্রাফ_ডিফ এবং চেকপয়েন্ট থেকে পুনরুদ্ধার হ্যাক করতে পারেন।

আমি এটি আমার ব্যক্তিগত ব্যবহারের জন্য প্রয়োগ করেছি, তাই আমি যদিও কোডটি এখানে ভাগ করে নিই।

লিঙ্ক: https://gist.github.com/nikitakit/6ef3b72be67b86cb7868

(এটি অবশ্যই একটি হ্যাক এবং কোনও গ্যারান্টি নেই যে এইভাবে সংরক্ষণ করা মডেলগুলি টেনসরফ্লোয়ের ভবিষ্যতের সংস্করণগুলিতে পাঠযোগ্য হবে))


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

টেস্টরফ্লো উত্সের './tensorflow/python/tools' ফোল্ডারে পরিদর্শন_চেকপয়েন্ট.পি স্ক্রিপ্ট পাওয়া যাবে।

ম্যাপিং নির্দিষ্ট করতে, আপনি আমার টেনসরফ্লো-ওয়ার্ল্যাব ব্যবহার করতে পারেন , যা বিভিন্ন মডেলকে প্রশিক্ষণ ও পুনরায় প্রশিক্ষণের জন্য ক্লাস এবং স্ক্রিপ্টগুলির একটি সেট রয়েছে। এটা তোলে পুনরায়োজন ResNet মডেলের একটি উদাহরণ, অবস্থিত অন্তর্ভুক্ত এখানে


all_variables()এখন
অবহিত করা

আরে, আমি টেনস্রোফায় নতুন এবং আমার মডেলটি সংরক্ষণ করতে সমস্যা হচ্ছে। আমি সত্যিই এটা প্রশংসা যদি আপনাকে সাহায্য করতে পারে আমাকে হবে stackoverflow.com/questions/48083474/...
রুচির Baronia

12

আপনি দুটি গ্রাফ ফাইল থেকে ফাইল লোড করতে চান বা রানটাইম চলাকালীন এটি নির্মাণ করতে চান কিনা তা নিয়ে পৃথক দুটি মৌলিক মামলার জন্য এখানে আমার সহজ সমাধান।

এই উত্তরটি টেনসরফ্লো 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

একটি ফাইল থেকে গ্রাফও লোড হচ্ছে

এই কৌশলটি ব্যবহার করার সময়, নিশ্চিত হয়ে নিন যে আপনার সমস্ত স্তর / ভেরিয়েবলগুলি স্পষ্টভাবে অনন্য নাম সেট করেছে।অন্যথায় টেনসরফ্লো নামগুলিকে নিজেরাই অনন্য করে তুলবে এবং সেগুলি ফাইলে সংরক্ষিত নামের থেকে আলাদা হবে। এটি আগের কৌশলটিতে কোনও সমস্যা নয়, কারণ নামগুলি লোডিং এবং সেভিং উভয় ক্ষেত্রে একইভাবে "ম্যাঙ্গলেড" are

সেভিং

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

@ মিনিকিওয়ার্ক ঠিক আছে, আপনার মতামতের জন্য ধন্যবাদ, আমি আপনার পরামর্শ অনুসারে উত্তরটি সম্পাদনা করব;)
মার্টিন পেক্কা

10

এছাড়াও আপনি চেক আউট করতে পারেন উদাহরণ মধ্যে TensorFlow / skflow যা অফার, saveএবং restoreপদ্ধতি আপনি সহজেই আপনার মডেল পরিচালনা করতে সহায়তা করতে পারেন। এটির প্যারামিটার রয়েছে যা আপনি আপনার মডেলটিকে কতবার ব্যাকআপ করতে চান তাও নিয়ন্ত্রণ করতে পারেন।


9

আপনি যদি ডিফল্ট অধিবেশন হিসাবে tf.train.MonitoredTrainingSession ব্যবহার করেন তবে জিনিসগুলি সংরক্ষণ / পুনরুদ্ধার করতে আপনার অতিরিক্ত কোড যুক্ত করার দরকার নেই। মনিটোরড ট্রেনিংসেশন কনস্ট্রাক্টরকে কেবল একটি চেকপয়েন্ট দিরের নামটি দিন, এটি এগুলি পরিচালনা করতে সেশন হুক ব্যবহার করবে।


tf.train.Supervisor ব্যবহার করে আপনার জন্য এই জাতীয় অধিবেশন তৈরি পরিচালনা করবে এবং আরও একটি সম্পূর্ণ সমাধান সরবরাহ করবে।
চিহ্নিত করুন

1
@ মার্ক টিএফ.ট্রেইন.সপভাইজারকে অবহেলা করা হয়েছে
সান

সুপারভাইজার অবমূল্যায়ন করা হয়েছে দাবি দাবী করে আপনার কি কোনও লিঙ্ক আছে? আমি এমন কিছু দেখিনি যা এটিকে কেস হিসাবে চিহ্নিত করে।
চিহ্নিত করুন


ইউআরএল-এর জন্য ধন্যবাদ - আমি তথ্যের মূল উত্সটি যাচাই করেছিলাম এবং বলা হয়েছিল যে এটি সম্ভবত টিএফ 1.x সিরিজ শেষ হওয়ার আগেই থাকবে তবে এর পরে কোনও গ্যারান্টি নেই।
চিহ্নিত করুন

8

এখানে সমস্ত উত্তর দুর্দান্ত, তবে আমি দুটি জিনিস যুক্ত করতে চাই।

প্রথমত, @ ব্যবহারকারী 7505159 এর উত্তরটি বিশদভাবে জানাতে, "./" আপনার পুনরুদ্ধার করা ফাইলটির নামের শুরুতে যুক্ত করা গুরুত্বপূর্ণ।

উদাহরণস্বরূপ, আপনি ফাইলের নামে "./" সহ কোনও গ্রাফ সংরক্ষণ করতে পারেন:

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

তবে গ্রাফটি পুনরুদ্ধার করার জন্য আপনার ফাইল_নামে "./" চাপ দিতে হবে:

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

আপনার সর্বদা "./" লাগবে না, তবে এটি আপনার পরিবেশ এবং টেনসরফ্লো সংস্করণের উপর নির্ভর করে সমস্যার কারণ হতে পারে।

এটি আরও উল্লেখ করতে চাই যে sess.run(tf.global_variables_initializer())অধিবেশন পুনরুদ্ধারের আগে গুরুত্বপূর্ণ হতে পারে be

যদি আপনি কোনও সংরক্ষিত সেশনটি পুনরুদ্ধার করার চেষ্টা করার সময় অবিচ্ছিন্ন ভেরিয়েবলগুলি সম্পর্কিত কোনও ত্রুটি পেয়ে থাকেন 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

নতুন টেনসরফ্লো সংস্করণ অনুসারে, tf.train.Checkpointকোনও মডেল সংরক্ষণ এবং পুনরুদ্ধার করার সর্বোত্তম উপায়:

Checkpoint.saveএবং Checkpoint.restoreলিখতে এবং পঠিত বস্তুর ভিত্তিক চেকপয়েন্ট, tf.train.Saver বিপরীতে যা লিখেছেন এবং variable.name ভিত্তিক চেকপয়েন্ট সার্চ হবে। অবজেক্ট-ভিত্তিক চেকপয়েন্টটি নামযুক্ত প্রান্তগুলি দিয়ে পাইথন অবজেক্টের (স্তর, অপ্টিমাইজার, ভেরিয়েবলস, ইত্যাদি) মধ্যে নির্ভরতার গ্রাফ সংরক্ষণ করে এবং এই গ্রাফটি একটি চেকপয়েন্ট পুনরুদ্ধার করার সময় ভেরিয়েবলের সাথে মেলে ব্যবহার করা হয়। পাইথন প্রোগ্রামে পরিবর্তনগুলি আরও শক্তিশালী হতে পারে এবং আগ্রহের সাথে সম্পাদন করার সময় ভেরিয়েবলের জন্য পুনরুদ্ধার পুনরুদ্ধারে সহায়তা করতে সহায়তা করে। নতুন কোডের জন্য বেশি পছন্দ করুনtf.train.Checkpointtf.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

টেনসরফ্লো ২.০ এর জন্য এটি যতটা সহজ

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

পুনঃস্থাপন করা:

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

মডেল অবজেক্টের অংশ নয় এমন সমস্ত কাস্টম টিএফ অপারেশন এবং ভেরিয়েবল সম্পর্কে কী বলা যায়? আপনি যখন মডেলটিতে সেভ () কে কল করবেন তখন কি তারা কোনওভাবে বাঁচবে? আমার কাছে বিভিন্ন কাস্টম লস এবং টেনসরফ্লো-সম্ভাবনা এক্সপ্রেশন রয়েছে যা অনুমান এবং প্রজন্মের নেটওয়ার্কে ব্যবহৃত হয় তবে সেগুলি আমার মডেলের অংশ নয়। আমার কেরাস মডেল অবজেক্টটিতে কেবল ঘন এবং প্রত্যয় স্তর থাকে। টিএফ 1 এ আমি কেবল সংরক্ষণের পদ্ধতিটি কল করেছি এবং আমি নিশ্চিত হতে পারি যে আমার গ্রাফে ব্যবহৃত প্রতিটি ক্রিয়াকলাপ এবং টেনারগুলি সেভ হবে। টিএফ 2-তে আমি দেখতে পাচ্ছি না যে কেরাস মডেলটিতে কোনওভাবে যুক্ত না করা অপারেশনগুলি কীভাবে সংরক্ষণ হবে।
ক্রিস্টফ

টিএফ 2.0 তে মডেলগুলি পুনরুদ্ধার করার জন্য আরও কোনও তথ্য আছে? আমি সি API এর মাধ্যমে উত্পন্ন চেকপয়েন্ট ফাইল থেকে ওজন পুনঃস্থাপন করতে পারি না, দেখুন: stackoverflow.com/questions/57944786/...
jregalad

@ জগ্রালাদ: এটি জটিল। আমার প্রশ্নগুলি সম্ভবত স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 636340০৪৫০২/২ স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 5555৫৯৯৩০৯/২ স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 8৫৮৯৯৯৩৩ / st স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 82৮৮২৯০৩৩/২ এবং স্ট্যাকওভারফ্লো / প্রশ্ন / 55490885/… সহায়তা করতে পারে
serv-inc

5

tf.keras এর সাথে মডেল সাশ্রয় TF2.0

আমি TF1.x ব্যবহার করে মডেলগুলি সংরক্ষণের দুর্দান্ত উত্তরগুলি দেখতে পাচ্ছি আমি সংরক্ষণে আরও কয়েকটি পয়েন্টার সরবরাহ করতে চাইtensorflow.keras মডেলগুলি যা কিছুটা জটিল কারণ কোনও মডেল সংরক্ষণের বিভিন্ন উপায় রয়েছে।

এখানে আমি বর্তমান ডিরেক্টরিতে ফোল্ডারে একটি tensorflow.kerasমডেল সংরক্ষণের উদাহরণ সরবরাহ করছি model_path। এটি সর্বাধিক সাম্প্রতিক টেনসরফ্লো (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))

কেরাস চেকপয়েন্ট কলব্যাক ব্যবহার করে সংরক্ষণ এবং পুনরুদ্ধার

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

কাস্টম অপ্সের সাহায্যে কেরাস মডেল সংরক্ষণ করা হচ্ছে

যখন আমাদের নিম্নোক্ত ক্ষেত্রে ( tf.tile) এর মতো কাস্টম অপ্স থাকে, তখন আমাদের একটি ফাংশন তৈরি করতে এবং ল্যাম্বডা স্তরটি মোড়ানো প্রয়োজন। অন্যথায়, মডেল সংরক্ষণ করা যায় না।

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 নির্দিষ্ট করতে হবে। ভাল_লিস্টটি 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 একটি পৃথক ফাইল পথ নয়, সংরক্ষণ করা ফাইলগুলির ফোল্ডারের পথ প্রয়োজন folder

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

নিশ্চিত করুন যে সেভারটি সংশ্লিষ্ট সেশনের অভ্যন্তরে চলছে runs মনে রাখবেন, আপনি যদি এটি ব্যবহার করেন 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

টেনসরফ্লো -২.০ এর জন্য

এটা খুবই সাধারণ.

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

টেনসরফ্লো 2.0 এর নতুন সংস্করণে, কোনও মডেল সংরক্ষণ / লোড করার প্রক্রিয়াটি অনেক সহজ। কেরাস এপিআই বাস্তবায়নের কারণে, টেনসরফ্লোয়ের জন্য একটি উচ্চ-স্তরের এপিআই।

একটি মডেল সংরক্ষণ করতে: রেফারেন্সের জন্য ডকুমেন্টেশন চেক করুন: 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.