টেনসরফ্লোতে আপনি কোনও মডেলকে প্রশিক্ষণ দেওয়ার পরে:
- আপনি প্রশিক্ষিত মডেলটি কীভাবে সংরক্ষণ করবেন?
- আপনি কীভাবে পরে এই সংরক্ষিত মডেলটি পুনরুদ্ধার করবেন?
টেনসরফ্লোতে আপনি কোনও মডেলকে প্রশিক্ষণ দেওয়ার পরে:
উত্তর:
সম্পূর্ণ এবং দরকারী টিউটোরিয়াল -> https://www.tensorflow.org/guide/saved_model
মডেলগুলি সংরক্ষণ করার জন্য কেরাস বিশদ গাইড -> https://www.tensorflow.org/guide/keras/save_and_serialize
ডক্স থেকে:
# 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())
এটি এখনও বিটা তাই আমি আপাতত এর বিরুদ্ধে পরামর্শ দেব। আপনি যদি এখনও সেই রাস্তায় যেতে চান তবে এটি tf.saved_model
ব্যবহারের গাইড
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
})
নীচের কোডটি বিক্ষোভের স্বার্থে এলোমেলো ডেটা উত্পন্ন করে।
Dataset
এবং তারপরে এটি তৈরি করবIterator
। আমরা পুনরাবৃত্তির উত্পন্ন টেনসর পেয়েছি, input_tensor
যা আমাদের মডেলের ইনপুট হিসাবে পরিবেশন করবে calledinput_tensor
: একটি জিআরইউ-ভিত্তিক দ্বি নির্দেশিকা আরএনএন এবং তারপরে একটি ঘন শ্রেণিবদ্ধ রয়েছে। কারণ কেন নয়।softmax_cross_entropy_with_logits
, সাথে অনুকূলিত Adam
। 2 যুগের পরে (প্রতিটি 2 টি ব্যাচের), আমরা "প্রশিক্ষিত" মডেলটি সংরক্ষণ করি tf.saved_model.simple_save
। আপনি যদি কোডটি যেমন চালান তবে মডেলটি একটি ফোল্ডারে সংরক্ষণ করা হবেsimple/
আপনার বর্তমান কার্যকরী ডিরেক্টরিতে ।tf.saved_model.loader.load
। আমরা স্থানধারক এবং লগিটগুলি graph.get_tensor_by_name
এবং এর সাথে Iterator
শুরু করার অপারেশনটি দখল করিgraph.get_operation_by_name
।কোড:
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
tf.contrib.layers
?
[n.name for n in graph2.as_graph_def().node]
। ডকুমেন্টেশন যেমন বলেছে, সেন্সর সেভের লক্ষ্য টেনসরফ্লো পরিবেশনার সাথে মিথস্ক্রিয়াটিকে সহজতর করা, এটি আর্গুমেন্টের মূল বিষয়; অন্যান্য ভেরিয়েবলগুলি এখনও পুনরুদ্ধার করা হয়েছে, অন্যথায় অনুমানটি ঘটবে না। উদাহরণ হিসাবে আমি যেমন করেছি ঠিক তেমনভাবে আপনার আগ্রহের পরিবর্তনশীলগুলি ধরুন। ডকুমেন্টেশন
global_step
তর্ক ছাড়াই , আপনি যদি থামেন তবে আবার প্রশিক্ষণ নেওয়ার চেষ্টা করুন, এটি আপনাকে এক ধাপ বলে মনে করবে। এটি আপনার টেনসরবোর্ড ভিজ্যুয়ালাইজেশনটি খুব কম সময়ে স্ক্রু করবে
মডেলগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য আরও বিশদ যুক্ত করতে আমি আমার উত্তরকে উন্নত করছি।
(এবং পরে) টেনসরফ্লো সংস্করণ 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
এটি এবং আরও কিছু উন্নত ব্যবহারের কেসগুলি এখানে খুব ভালভাবে ব্যাখ্যা করা হয়েছে।
টেনসরফ্লো মডেলগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য একটি দ্রুত সম্পূর্ণ টিউটোরিয়াল
:0
নামগুলিতে কেন যুক্ত করবেন ?
(এবং পরে) টেনসরফ্লো সংস্করণ 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_)
<built-in function TF_Run> returned a result with an error set
tf.get_variable_scope().reuse_variables()
অনুসরণ করে আরও সরাসরি ভেরিয়েবলগুলি পেতে পারি না var = tf.get_variable("varname")
। এটি আমাকে ত্রুটি দেয়: "ভ্যালুএরর: চলক বর্ণটি বিদ্যমান নেই, বা tf.get_variable () দিয়ে তৈরি করা হয়নি।" কেন? এটা কি সম্ভব না?
টেনসরফ্লো সংস্করণ <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
।
batch_x
দরকার? বাইনারি? নম্পি অ্যারে?
undefined
। আপনি কি আমাকে বলতে পারেন যে এই কোডটির জন্য কোনটি FLAGS এর ডিফ। @ রায়ানসেপ্যাসি
আমার পরিবেশ: পাইথন 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})
মডেলটির দুটি অংশ রয়েছে, মডেল সংজ্ঞা, মডেল ডিরেক্টরি 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
)
আপনি এই সহজ উপায় নিতে পারেন।
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, .....
Saver
এবং এটি সংরক্ষণ করুনmodel_saver = tf.train.Saver()
# Train the model and save it in the end
model_saver.save(session, "saved_models/CNN_New.ckpt")
with tf.Session(graph=graph_cnn) as session:
model_saver.restore(session, "saved_models/CNN_New.ckpt")
print("Model restored.")
print('Initialized')
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)
বেশিরভাগ ক্ষেত্রে, ডিস্কটি ব্যবহার করে সংরক্ষণ এবং পুনরুদ্ধার 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
এবং প্রাথমিক মানটি প্রতিস্থাপন করতে হবে। হ্যাঁ, টেনসরফ্লো আপনাকে কেবল স্থানধারকদের জন্য নয়, কোনও অপের জন্য একটি মান ফিড করতে দেয়, তাই এটি দুর্দান্ত কাজ করে।
ইয়ারোস্লাভ যেমন বলেছিলেন, আপনি গ্রাফটি আমদানি করে, ম্যানুয়ালি ভেরিয়েবলগুলি তৈরি করে এবং তারপরে সেভার ব্যবহার করে গ্রাফ_ডিফ এবং চেকপয়েন্ট থেকে পুনরুদ্ধার হ্যাক করতে পারেন।
আমি এটি আমার ব্যক্তিগত ব্যবহারের জন্য প্রয়োগ করেছি, তাই আমি যদিও কোডটি এখানে ভাগ করে নিই।
লিঙ্ক: https://gist.github.com/nikitakit/6ef3b72be67b86cb7868
(এটি অবশ্যই একটি হ্যাক এবং কোনও গ্যারান্টি নেই যে এইভাবে সংরক্ষণ করা মডেলগুলি টেনসরফ্লোয়ের ভবিষ্যতের সংস্করণগুলিতে পাঠযোগ্য হবে))
যদি এটি অভ্যন্তরীণভাবে সংরক্ষিত মডেল হয় তবে আপনি কেবল সমস্ত ভেরিয়েবলের জন্য একটি পুনরুদ্ধারকারী নির্দিষ্ট করে
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()
এখন
আপনি দুটি গ্রাফ ফাইল থেকে ফাইল লোড করতে চান বা রানটাইম চলাকালীন এটি নির্মাণ করতে চান কিনা তা নিয়ে পৃথক দুটি মৌলিক মামলার জন্য এখানে আমার সহজ সমাধান।
এই উত্তরটি টেনসরফ্লো 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
global_step
ব্যাচের সাধারণকরণের চলক এবং চলমান গড়গুলি অ প্রশিক্ষণযোগ্য ভেরিয়েবল, তবে উভয়ই অবশ্যই সঞ্চয়যোগ্য। এছাড়াও, আপনার আরও স্পষ্টভাবে গ্রাফের নির্মাণটি অধিবেশন পরিচালনার থেকে পৃথক করা উচিত, উদাহরণস্বরূপ Saver(...).save()
আপনি যখনই এটি চালাবেন তখন প্রতিটি নোড তৈরি করবেন। সম্ভবত আপনি যা চান তা নয়। এবং আরও রয়েছে ...: /
এছাড়াও আপনি চেক আউট করতে পারেন উদাহরণ মধ্যে TensorFlow / skflow যা অফার, save
এবং restore
পদ্ধতি আপনি সহজেই আপনার মডেল পরিচালনা করতে সহায়তা করতে পারেন। এটির প্যারামিটার রয়েছে যা আপনি আপনার মডেলটিকে কতবার ব্যাকআপ করতে চান তাও নিয়ন্ত্রণ করতে পারেন।
আপনি যদি ডিফল্ট অধিবেশন হিসাবে tf.train.MonitoredTrainingSession ব্যবহার করেন তবে জিনিসগুলি সংরক্ষণ / পুনরুদ্ধার করতে আপনার অতিরিক্ত কোড যুক্ত করার দরকার নেই। মনিটোরড ট্রেনিংসেশন কনস্ট্রাক্টরকে কেবল একটি চেকপয়েন্ট দিরের নামটি দিন, এটি এগুলি পরিচালনা করতে সেশন হুক ব্যবহার করবে।
এখানে সমস্ত উত্তর দুর্দান্ত, তবে আমি দুটি জিনিস যুক্ত করতে চাই।
প্রথমত, @ ব্যবহারকারী 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)
লাইনের আগে আপনি অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন । এটি আপনার মাথাব্যথা বাঁচাতে পারে।
নতুন টেনসরফ্লো সংস্করণ অনুসারে, tf.train.Checkpoint
কোনও মডেল সংরক্ষণ এবং পুনরুদ্ধার করার সর্বোত্তম উপায়:
Checkpoint.save
এবংCheckpoint.restore
লিখতে এবং পঠিত বস্তুর ভিত্তিক চেকপয়েন্ট, tf.train.Saver বিপরীতে যা লিখেছেন এবং variable.name ভিত্তিক চেকপয়েন্ট সার্চ হবে। অবজেক্ট-ভিত্তিক চেকপয়েন্টটি নামযুক্ত প্রান্তগুলি দিয়ে পাইথন অবজেক্টের (স্তর, অপ্টিমাইজার, ভেরিয়েবলস, ইত্যাদি) মধ্যে নির্ভরতার গ্রাফ সংরক্ষণ করে এবং এই গ্রাফটি একটি চেকপয়েন্ট পুনরুদ্ধার করার সময় ভেরিয়েবলের সাথে মেলে ব্যবহার করা হয়। পাইথন প্রোগ্রামে পরিবর্তনগুলি আরও শক্তিশালী হতে পারে এবং আগ্রহের সাথে সম্পাদন করার সময় ভেরিয়েবলের জন্য পুনরুদ্ধার পুনরুদ্ধারে সহায়তা করতে সহায়তা করে। নতুন কোডের জন্য বেশি পছন্দ করুন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)
টেনসরফ্লো ২.০ এর জন্য এটি যতটা সহজ
# Save the model model.save('path_to_my_model.h5')
পুনঃস্থাপন করা:
new_model = tensorflow.keras.models.load_model('path_to_my_model.h5')
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 মডেলটি সংরক্ষণের বিভিন্ন উপায়ের কয়েকটি আমি কভার করেছি। তবে আরও অনেক উপায় রয়েছে। আপনার ব্যবহারের কেসটি উপরে বর্ণিত না দেখলে দয়া করে নীচে মন্তব্য করুন। ধন্যবাদ!
আপনি ব্যবহার করে নেটওয়ার্কে ভেরিয়েবলগুলি সংরক্ষণ করতে পারেন
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(....)
গুরুত্বপূর্ণ বিষয়:
sess
প্রথম এবং পরবর্তী রান (সুসংগত কাঠামো) এর মধ্যে অবশ্যই একই হতে হবে। saver.restore
একটি পৃথক ফাইল পথ নয়, সংরক্ষণ করা ফাইলগুলির ফোল্ডারের পথ প্রয়োজন folder আপনি যেখানেই মডেলটি সংরক্ষণ করতে চান,
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('./')
তবে কেবলমাত্র সর্বশেষতম চেক পয়েন্ট ব্যবহার করা হবে।
টেনসরফ্লো -২.০ এর জন্য
এটা খুবই সাধারণ.
import tensorflow as tf
model.save("model_name")
model = tf.keras.models.load_model('model_name')
@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"})
টেনসরফ্লো 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)