Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
Setelah Anda memigrasikan model Anda dari grafik dan sesi TensorFlow 1 ke API TensorFlow 2, seperti tf.function
, tf.Module
, dan tf.keras.Model
, Anda dapat memigrasikan kode penyimpanan dan pemuatan model. Notebook ini memberikan contoh bagaimana Anda dapat menyimpan dan memuat dalam format SavedModel di TensorFlow 1 dan TensorFlow 2. Berikut ini ikhtisar singkat tentang perubahan API terkait untuk migrasi dari TensorFlow 1 ke TensorFlow 2:
TensorFlow 1 | Migrasi ke TensorFlow 2 | |
---|---|---|
Penghematan | tf.compat.v1.saved_model.Builder tf.compat.v1.saved_model.simple_save | tf.saved_model.save Keras: tf.keras.models.save_model |
Memuat | tf.compat.v1.saved_model.load | tf.saved_model.load Keras: tf.keras.models.load_model |
Tanda tangan : satu set input dan output tensor yang dapat digunakan untuk menjalankan | Dihasilkan menggunakan *.signature_def utils(misalnya tf.compat.v1.saved_model.predict_signature_def ) | Tulis fungsi tf.function dan ekspor menggunakan argumen signatures di tf.saved_model.save . |
Klasifikasi dan regresi : jenis tanda tangan khusus | Dihasilkan dengantf.compat.v1.saved_model.classification_signature_def ,tf.compat.v1.saved_model.regression_signature_def ,dan ekspor Penaksir tertentu. | Kedua jenis tanda tangan ini telah dihapus dari TensorFlow 2. Jika pustaka penyajian memerlukan nama metode ini, tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater . |
Untuk penjelasan pemetaan yang lebih mendalam, lihat bagian Perubahan dari TensorFlow 1 ke TensorFlow 2 di bawah ini.
Mempersiapkan
Contoh di bawah menunjukkan cara mengekspor dan memuat model TensorFlow dummy yang sama (didefinisikan sebagai add_two
di bawah) ke format SavedModel menggunakan API TensorFlow 1 dan TensorFlow 2. Mulailah dengan mengatur fungsi impor dan utilitas:
import tensorflow as tf
import tensorflow.compat.v1 as tf1
import shutil
def remove_dir(path):
try:
shutil.rmtree(path)
except:
pass
def add_two(input):
return input + 2
TensorFlow 1: Simpan dan ekspor SavedModel
Di TensorFlow 1, Anda menggunakan tf.compat.v1.saved_model.Builder
, tf.compat.v1.saved_model.simple_save
, dan tf.estimator.Estimator.export_saved_model
API untuk membuat, menyimpan, dan mengekspor grafik dan sesi TensorFlow:
1. Simpan grafik sebagai SavedModel dengan SavedModelBuilder
remove_dir("saved-model-builder")
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=[])
output = add_two(input)
print("add two output: ", sess.run(output, {input: 3.}))
# Save with SavedModelBuilder
builder = tf1.saved_model.Builder('saved-model-builder')
sig_def = tf1.saved_model.predict_signature_def(
inputs={'input': input},
outputs={'output': output})
builder.add_meta_graph_and_variables(
sess, tags=["serve"], signature_def_map={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig_def
})
builder.save()
add two output: 5.0 WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:208: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info. INFO:tensorflow:No assets to save. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: saved-model-builder/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
Traceback (most recent call last): File "/tmpfs/src/tf_docs_env/bin/saved_model_cli", line 8, in <module> sys.exit(main()) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 1211, in main args.func(args) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 769, in run init_tpu=args.init_tpu, tf_debug=args.tf_debug) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 417, in run_saved_model_with_feed_dict tag_set) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 117, in get_meta_graph_def saved_model = read_saved_model(saved_model_dir) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 55, in read_saved_model raise IOError("SavedModel file does not exist at: %s" % saved_model_dir) OSError: SavedModel file does not exist at: simple-save
2. Bangun Model Tersimpan untuk disajikan
remove_dir("simple-save")
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=[])
output = add_two(input)
print("add_two output: ", sess.run(output, {input: 3.}))
tf1.saved_model.simple_save(
sess, 'simple-save',
inputs={'input': input},
outputs={'output': output})
add_two output: 5.0 WARNING:tensorflow:From /tmp/ipykernel_26511/250978412.py:12: simple_save (from tensorflow.python.saved_model.simple_save) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.simple_save. INFO:tensorflow:Assets added to graph. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: simple-save/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Result for output key output: 12.0
3. Ekspor grafik inferensi Penaksir sebagai Model Tersimpan
Dalam definisi Estimator model_fn
(didefinisikan di bawah), Anda dapat menentukan tanda tangan dalam model Anda dengan mengembalikan export_outputs
di tf.estimator.EstimatorSpec
. Ada berbagai jenis output:
-
tf.estimator.export.ClassificationOutput
-
tf.estimator.export.RegressionOutput
-
tf.estimator.export.PredictOutput
Ini akan menghasilkan klasifikasi, regresi, dan tipe tanda tangan prediksi, masing-masing.
Ketika estimator diekspor dengan tf.estimator.Estimator.export_saved_model
, tanda tangan ini akan disimpan dengan model.
def model_fn(features, labels, mode):
output = add_two(features['input'])
step = tf1.train.get_global_step()
return tf.estimator.EstimatorSpec(
mode,
predictions=output,
train_op=step.assign_add(1),
loss=tf.constant(0.),
export_outputs={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: \
tf.estimator.export.PredictOutput({'output': output})})
est = tf.estimator.Estimator(model_fn, 'estimator-checkpoints')
# Train for one step to create a checkpoint.
def train_fn():
return tf.data.Dataset.from_tensors({'input': 3.})
est.train(train_fn, steps=1)
# This utility function `build_raw_serving_input_receiver_fn` takes in raw
# tensor features and builds an "input serving receiver function", which
# creates placeholder inputs to the model.
serving_input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(
{'input': tf.constant(3.)}) # Pass in a dummy input batch.
estimator_path = est.export_saved_model('exported-estimator', serving_input_fn)
# Estimator's export_saved_model creates a time stamped directory. Move this
# to a set path so it can be inspected with `saved_model_cli` in the cell below.
!rm -rf estimator-model
import shutil
shutil.move(estimator_path, 'estimator-model')
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'estimator-checkpoints', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:401: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version. Instructions for updating: Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into estimator-checkpoints/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.0, step = 1 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1... INFO:tensorflow:Saving checkpoints for 1 into estimator-checkpoints/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1... INFO:tensorflow:Loss for final step: 0.0. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Signatures INCLUDED in export for Classify: None INFO:tensorflow:Signatures INCLUDED in export for Regress: None INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default'] INFO:tensorflow:Signatures INCLUDED in export for Train: None INFO:tensorflow:Signatures INCLUDED in export for Eval: None INFO:tensorflow:Restoring parameters from estimator-checkpoints/model.ckpt-1 INFO:tensorflow:Assets added to graph. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: exported-estimator/temp-1636162129/saved_model.pb 'estimator-model'
!saved_model_cli run --dir estimator-model --tag_set serve \
--signature_def serving_default --input_exprs input=[10]
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from estimator-model/variables/variables Result for output key output: [12.]
TensorFlow 2: Simpan dan ekspor SavedModel
Simpan dan ekspor SavedModel yang ditentukan dengan tf.Module
Untuk mengekspor model Anda di TensorFlow 2, Anda harus menentukan tf.Module
atau tf.keras.Model
untuk menampung semua variabel dan fungsi model Anda. Kemudian, Anda dapat memanggil tf.saved_model.save
untuk membuat SavedModel. Lihat Menyimpan model kustom di panduan Menggunakan format SavedModel untuk mempelajari lebih lanjut.
class MyModel(tf.Module):
@tf.function
def __call__(self, input):
return add_two(input)
model = MyModel()
@tf.function
def serving_default(input):
return {'output': model(input)}
signature_function = serving_default.get_concrete_function(
tf.TensorSpec(shape=[], dtype=tf.float32))
tf.saved_model.save(
model, 'tf2-save', signatures={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_function})
INFO:tensorflow:Assets written to: tf2-save/assets 2021-11-06 01:28:53.105391: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
!saved_model_cli run --dir tf2-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from tf2-save/variables/variables Result for output key output: 12.0
Simpan dan ekspor SavedModel yang ditentukan dengan Keras
Keras API untuk menyimpan dan mengekspor— Mode.save
atau tf.keras.models.save_model
—dapat mengekspor SavedModel dari tf.keras.Model
. Lihat model Simpan dan muat Keras untuk lebih jelasnya.
inp = tf.keras.Input(3)
out = add_two(inp)
model = tf.keras.Model(inputs=inp, outputs=out)
@tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
def serving_default(input):
return {'output': model(input)}
model.save('keras-model', save_format='tf', signatures={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: serving_default})
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model. WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (). INFO:tensorflow:Assets written to: keras-model/assets
!saved_model_cli run --dir keras-model --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from keras-model/variables/variables Result for output key output: 12.0
Memuat Model Tersimpan
SavedModel yang disimpan dengan salah satu API di atas dapat dimuat menggunakan TensorFlow 1 atau TensorFlow API.
SavedModel TensorFlow 1 umumnya dapat digunakan untuk inferensi saat dimuat ke TensorFlow 2, tetapi pelatihan (menghasilkan gradien) hanya dimungkinkan jika SavedModel berisi variabel sumber daya . Anda dapat memeriksa dtype dari variabel—jika variabel dtype berisi "_ref", maka itu adalah variabel referensi.
TensorFlow 2 SavedModel dapat dimuat dan dieksekusi dari TensorFlow 1 selama SavedModel disimpan dengan tanda tangan.
Bagian di bawah ini berisi contoh kode yang menunjukkan cara memuat SavedModels yang disimpan di bagian sebelumnya, dan memanggil tanda tangan yang diekspor.
TensorFlow 1: Muat SavedModel dengan tf.saved_model.load
Di TensorFlow 1, Anda dapat mengimpor SavedModel langsung ke grafik dan sesi saat ini menggunakan tf.saved_model.load
. Anda dapat memanggil Session.run
dengan nama input dan output tensor:
def load_tf1(path, input):
print('Loading from', path)
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
meta_graph = tf1.saved_model.load(sess, ["serve"], path)
sig_def = meta_graph.signature_def[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
input_name = sig_def.inputs['input'].name
output_name = sig_def.outputs['output'].name
print(' Output with input', input, ': ',
sess.run(output_name, feed_dict={input_name: input}))
load_tf1('saved-model-builder', 5.)
load_tf1('simple-save', 5.)
load_tf1('estimator-model', [5.]) # Estimator's input must be batched.
load_tf1('tf2-save', 5.)
load_tf1('keras-model', 5.)
Loading from saved-model-builder WARNING:tensorflow:From /tmp/ipykernel_26511/1548963983.py:5: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Output with input 5.0 : 7.0 Loading from simple-save INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Output with input 5.0 : 7.0 Loading from estimator-model INFO:tensorflow:Restoring parameters from estimator-model/variables/variables Output with input [5.0] : [7.] Loading from tf2-save INFO:tensorflow:Restoring parameters from tf2-save/variables/variables Output with input 5.0 : 7.0 Loading from keras-model INFO:tensorflow:Restoring parameters from keras-model/variables/variables Output with input 5.0 : 7.0
TensorFlow 2: Muat model yang disimpan dengan tf.saved_model
Di TensorFlow 2, objek dimuat ke objek Python yang menyimpan variabel dan fungsi. Ini kompatibel dengan model yang disimpan dari TensorFlow 1.
Lihat tf.saved_model.load
API docs dan Loading and using custom model section dari Using the SavedModel format guide untuk detailnya.
def load_tf2(path, input):
print('Loading from', path)
loaded = tf.saved_model.load(path)
out = loaded.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](
tf.constant(input))['output']
print(' Output with input', input, ': ', out)
load_tf2('saved-model-builder', 5.)
load_tf2('simple-save', 5.)
load_tf2('estimator-model', [5.]) # Estimator's input must be batched.
load_tf2('tf2-save', 5.)
load_tf2('keras-model', 5.)
Loading from saved-model-builder INFO:tensorflow:Saver not created because there are no variables in the graph to restore Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from simple-save INFO:tensorflow:Saver not created because there are no variables in the graph to restore Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from estimator-model Output with input [5.0] : tf.Tensor([7.], shape=(1,), dtype=float32) Loading from tf2-save Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from keras-model Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32)
Model yang disimpan dengan TensorFlow 2 API juga dapat mengakses tf.function
s dan variabel yang dilampirkan ke model (bukan yang diekspor sebagai tanda tangan). Sebagai contoh:
loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
restored __call__: <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x7f30cc940990> output with input 5. tf.Tensor(7.0, shape=(), dtype=float32)
TensorFlow 2: Muat model yang disimpan dengan Keras
API pemuatan tf.keras.models.load_model
—memungkinkan Anda memuat ulang model yang disimpan kembali ke objek Model Keras. Perhatikan bahwa ini hanya memungkinkan Anda untuk memuat SavedModels yang disimpan dengan Keras ( Model.save
atau tf.keras.models.save_model
).
Model yang disimpan dengan tf.saved_model.save
harus dimuat dengan tf.saved_model.load
. Anda dapat memuat model Keras yang disimpan dengan Model.save
menggunakan tf.saved_model.load
tetapi Anda hanya akan mendapatkan grafik TensorFlow. Lihat dokumen API tf.keras.models.load_model
dan Simpan dan muat panduan model Keras untuk detailnya.
loaded_model = tf.keras.models.load_model('keras-model')
loaded_model.predict_on_batch(tf.constant([1, 3, 4]))
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually. WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (3,). array([3., 5., 6.], dtype=float32)
GraphDef dan MetaGraphDef
Tidak ada cara langsung untuk memuat GraphDef
MetaGraphDef
ke TF2. Namun, Anda dapat mengonversi kode TF1 yang mengimpor grafik menjadi TF2 concrete_function
menggunakan v1.wrap_function
.
Pertama, simpan MetaGraphDef:
# Save a simple multiplication computation:
with tf.Graph().as_default() as g:
x = tf1.placeholder(tf.float32, shape=[], name='x')
v = tf.Variable(3.0, name='v')
y = tf.multiply(x, v, name='y')
with tf1.Session() as sess:
sess.run(v.initializer)
print(sess.run(y, feed_dict={x: 5}))
s = tf1.train.Saver()
s.export_meta_graph('multiply.pb', as_text=True)
s.save(sess, 'multiply_values.ckpt')
15.0
Menggunakan TF1 API, Anda dapat menggunakan tf1.train.import_meta_graph
untuk mengimpor grafik dan memulihkan nilainya:
with tf.Graph().as_default() as g:
meta = tf1.train.import_meta_graph('multiply.pb')
x = g.get_tensor_by_name('x:0')
y = g.get_tensor_by_name('y:0')
with tf1.Session() as sess:
meta.restore(sess, 'multiply_values.ckpt')
print(sess.run(y, feed_dict={x: 5}))
INFO:tensorflow:Restoring parameters from multiply_values.ckpt 15.0
Tidak ada API TF2 untuk memuat grafik, tetapi Anda masih dapat mengimpornya ke dalam fungsi konkret yang dapat dijalankan dalam mode bersemangat:
def import_multiply():
# Any graph-building code is allowed here.
tf1.train.import_meta_graph('multiply.pb')
# Creates a tf.function with all the imported elements in the function graph.
wrapped_import = tf1.wrap_function(import_multiply, [])
import_graph = wrapped_import.graph
x = import_graph.get_tensor_by_name('x:0')
y = import_graph.get_tensor_by_name('y:0')
# Restore the variable values.
tf1.train.Saver(wrapped_import.variables).restore(
sess=None, save_path='multiply_values.ckpt')
# Create a concrete function by pruning the wrap_function (similar to sess.run).
multiply_fn = wrapped_import.prune(feeds=x, fetches=y)
# Run this function
multiply_fn(tf.constant(5.)) # inputs to concrete functions must be Tensors.
WARNING:tensorflow:Saver is deprecated, please switch to tf.train.Checkpoint or tf.keras.Model.save_weights for training checkpoints. When executing eagerly variables do not necessarily have unique names, and so the variable.name-based lookups Saver performs are error-prone. INFO:tensorflow:Restoring parameters from multiply_values.ckpt <tf.Tensor: shape=(), dtype=float32, numpy=15.0>
Perubahan dari TensorFlow 1 ke TensorFlow 2
Bagian ini mencantumkan istilah penyimpanan dan pemuatan utama dari TensorFlow 1, yang setara dengan TensorFlow 2, dan apa yang telah berubah.
Model Tersimpan
SavedModel adalah format yang menyimpan program TensorFlow lengkap dengan parameter dan komputasi. Ini berisi tanda tangan yang digunakan oleh platform yang melayani untuk menjalankan model.
Format file itu sendiri tidak berubah secara signifikan, sehingga SavedModels dapat dimuat dan disajikan menggunakan API TensorFlow 1 atau TensorFlow 2.
Perbedaan antara TensorFlow 1 dan TensorFlow 2
Kasus penggunaan penyajian dan inferensi belum diperbarui di TensorFlow 2, selain dari perubahan API—peningkatan diperkenalkan pada kemampuan untuk menggunakan kembali dan membuat model yang dimuat dari SavedModel.
Di TensorFlow 2, program diwakili oleh objek seperti tf.Variable
, tf.Module
, atau model Keras tingkat tinggi ( tf.keras.Model
) dan lapisan ( tf.keras.layers
). Tidak ada lagi variabel global yang memiliki nilai yang disimpan dalam sebuah sesi, dan grafiknya sekarang ada di tf.function
s yang berbeda. Akibatnya, selama ekspor model, SavedModel menyimpan setiap komponen dan grafik fungsi secara terpisah.
Saat Anda menulis program TensorFlow dengan TensorFlow Python API, Anda harus membuat objek untuk mengelola variabel, fungsi, dan sumber daya lainnya. Umumnya, ini dilakukan dengan menggunakan API Keras, tetapi Anda juga dapat membangun objek dengan membuat atau tf.Module
.
Model keras ( tf.keras.Model
) dan tf.Module
secara otomatis melacak variabel dan fungsi yang menyertainya. SavedModel menyimpan koneksi ini antara modul, variabel, dan fungsi, sehingga mereka dapat dipulihkan saat memuat.
Tanda tangan
Tanda tangan adalah titik akhir dari SavedModel—tanda tangan memberi tahu pengguna cara menjalankan model dan input apa yang diperlukan.
Di TensorFlow 1, tanda tangan dibuat dengan mencantumkan tensor input dan output. Di TensorFlow 2, tanda tangan dihasilkan dengan meneruskan fungsi konkret . (Baca selengkapnya tentang fungsi TensorFlow di Pengantar grafik dan panduan fungsi tf.) Singkatnya, fungsi konkret dihasilkan dari tf.function
:
# Option 1: Specify an input signature.
@tf.function(input_signature=[...])
def fn(...):
...
return outputs
tf.saved_model.save(model, path, signatures={
'name': fn
})
# Option 2: Call `get_concrete_function`
@tf.function
def fn(...):
...
return outputs
tf.saved_model.save(model, path, signatures={
'name': fn.get_concrete_function(...)
})
Session.run
Di TensorFlow 1, Anda dapat memanggil Session.run
dengan grafik yang diimpor selama Anda sudah mengetahui nama tensornya. Ini memungkinkan Anda untuk mengambil nilai variabel yang dipulihkan, atau menjalankan bagian dari model yang tidak diekspor dalam tanda tangan.
Di TensorFlow 2, Anda dapat langsung mengakses variabel, seperti matriks bobot ( kernel
):
model = tf.Module()
model.dense_layer = tf.keras.layers.Dense(...)
tf.saved_model.save('my_saved_model')
loaded = tf.saved_model.load('my_saved_model')
loaded.dense_layer.kernel
atau panggil tf.function
s yang dilampirkan ke objek model: misalnya, loaded.__call__
.
Tidak seperti TF1, tidak ada cara untuk mengekstrak bagian dari suatu fungsi dan mengakses nilai antara. Anda harus mengekspor semua fungsionalitas yang diperlukan dalam objek yang disimpan.
Catatan migrasi TensorFlow Melayani
SavedModel awalnya dibuat untuk bekerja dengan TensorFlow Serving . Platform ini menawarkan berbagai jenis permintaan prediksi: mengklasifikasikan, mundur, dan memprediksi.
TensorFlow 1 API memungkinkan Anda membuat jenis tanda tangan ini dengan utilitas:
-
tf.compat.v1.saved_model.classification_signature_def
-
tf.compat.v1.saved_model.regression_signature_def
-
tf.compat.v1.saved_model.predict_signature_def
Klasifikasi ( classification_signature_def
) dan regresi ( regression_signature_def
) membatasi input dan output, jadi input harus berupa tf.Example
, dan output harus berupa classes
, scores
, atau prediction
. Sementara itu, tanda tangan prediksi ( predict_signature_def
) tidak memiliki batasan.
SavedModels yang diekspor dengan TensorFlow 2 API kompatibel dengan TensorFlow Serving, tetapi hanya akan berisi tanda tangan prediksi. Tanda tangan klasifikasi dan regresi telah dihapus.
Jika Anda memerlukan penggunaan tanda tangan klasifikasi dan regresi, Anda dapat memodifikasi SavedModel yang diekspor menggunakan tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
.
Langkah selanjutnya
Untuk mempelajari lebih lanjut tentang SavedModels di TensorFlow 2, lihat panduan berikut:
Jika Anda menggunakan TensorFlow Hub, Anda mungkin menemukan panduan ini berguna: