TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | GitHub'da görüntüle | Not defterini indir |
genel bakış
Bu kılavuz, tf.compat.v1.Saver
ile kontrol noktalarını kaydeden ve yükleyen bir modeliniz olduğunu ve kodu TF2 tf.train.Checkpoint
API'sini kullanarak geçirmek veya TF2 modelinizde önceden var olan kontrol noktalarını kullanmak istediğinizi varsayar.
Aşağıda karşılaşabileceğiniz bazı yaygın senaryolar yer almaktadır:
Senaryo 1
TF2'ye yüklenmesi veya dönüştürülmesi gereken önceki eğitim çalıştırmalarından mevcut TF1 kontrol noktaları vardır.
- TF1 kontrol noktasını TF2'ye yüklemek için, TF2'de bir TF1 kontrol noktası yükleyin snippet'ine bakın.
- Kontrol noktasını TF2'ye dönüştürmek için bkz. Kontrol noktası dönüştürme .
Senaryo 2
Modelinizi, değişken adlarını ve yollarını değiştirme riskini alacak şekilde ayarlıyorsunuz (örneğin, aşamalı olarak get_variable
açık tf.Variable
oluşturmaya geçiş yaparken) ve yol boyunca mevcut kontrol noktalarının kaydedilmesini/yüklenmesini sürdürmek istiyorsunuz.
Model geçişi sırasında kontrol noktası uyumluluğu nasıl korunur bölümüne bakın
Senaryo 3
Eğitim kodunuzu ve kontrol noktalarınızı TF2'ye geçiriyorsunuz, ancak çıkarım hattınız şimdilik TF1 kontrol noktaları gerektirmeye devam ediyor (üretim kararlılığı için).
seçenek 1
Antrenman sırasında hem TF1 hem de TF2 kontrol noktalarını kaydedin.
seçenek 2
TF2 kontrol noktasını TF1'e dönüştürün.
Aşağıdaki örnekler, TF1/TF2'deki tüm kaydetme ve yükleme kontrol noktaları kombinasyonlarını gösterir, böylece modelinizi nasıl taşıyacağınızı belirleme konusunda biraz esnekliğe sahip olursunuz.
Kurmak
import tensorflow as tf
import tensorflow.compat.v1 as tf1
def print_checkpoint(save_path):
reader = tf.train.load_checkpoint(save_path)
shapes = reader.get_variable_to_shape_map()
dtypes = reader.get_variable_to_dtype_map()
print(f"Checkpoint at '{save_path}':")
for key in shapes:
print(f" (key='{key}', shape={shapes[key]}, dtype={dtypes[key].name}, "
f"value={reader.get_tensor(key)})")
TF1'den TF2'ye değişiklikler
TF1 ve TF2 arasında nelerin değiştiğini ve "isim tabanlı" (TF1) ve "nesne tabanlı" (TF2) kontrol noktaları ile ne demek istediğimizi merak ediyorsanız bu bölüm eklenmiştir.
İki tür kontrol noktası aslında aynı biçimde kaydedilir; bu, esasen bir anahtar/değer tablosudur. Fark, anahtarların nasıl oluşturulduğunda yatmaktadır.
Adlandırılmış tabanlı denetim noktalarındaki anahtarlar , değişkenlerin adlarıdır . Nesne tabanlı kontrol noktalarındaki anahtarlar , kök nesneden değişkene giden yola atıfta bulunur (aşağıdaki örnekler bunun ne anlama geldiğini daha iyi anlamanıza yardımcı olacaktır).
İlk olarak, bazı kontrol noktalarını kaydedin:
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
c = tf1.get_variable('scoped/c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.Session() as sess:
saver = tf1.train.Saver()
sess.run(a.assign(1))
sess.run(b.assign(2))
sess.run(c.assign(3))
saver.save(sess, 'tf1-ckpt')
print_checkpoint('tf1-ckpt')
Checkpoint at 'tf1-ckpt': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0)yer tutucu3 l10n-yer
a = tf.Variable(5.0, name='a')
b = tf.Variable(6.0, name='b')
with tf.name_scope('scoped'):
c = tf.Variable(7.0, name='c')
ckpt = tf.train.Checkpoint(variables=[a, b, c])
save_path_v2 = ckpt.save('tf2-ckpt')
print_checkpoint(save_path_v2)
Checkpoint at 'tf2-ckpt-1': (key='variables/2/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=7.0) (key='variables/0/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=5.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n!\n\r\x08\x01\x12\tvariables\n\x10\x08\x02\x12\x0csave_counter\n\x15\n\x05\x08\x03\x12\x010\n\x05\x08\x04\x12\x011\n\x05\x08\x05\x12\x012\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\n=\x12;\n\x0eVARIABLE_VALUE\x12\x01a\x1a&variables/0/.ATTRIBUTES/VARIABLE_VALUE\n=\x12;\n\x0eVARIABLE_VALUE\x12\x01b\x1a&variables/1/.ATTRIBUTES/VARIABLE_VALUE\nD\x12B\n\x0eVARIABLE_VALUE\x12\x08scoped/c\x1a&variables/2/.ATTRIBUTES/VARIABLE_VALUE") (key='variables/1/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=6.0) (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1)
tf2-ckpt
içindeki anahtarlara bakarsanız, hepsi her bir değişkenin nesne yollarına atıfta bulunur. Örneğin, a
değişkeni, variables
listesindeki ilk öğedir, bu nedenle anahtarı variables/0/...
olur (.ATTRIBUTES/VARIABLE_VALUE sabitini yok saymaktan çekinmeyin).
Aşağıdaki Checkpoint
nesnesinin daha yakından incelenmesi:
a = tf.Variable(0.)
b = tf.Variable(0.)
c = tf.Variable(0.)
root = ckpt = tf.train.Checkpoint(variables=[a, b, c])
print("root type =", type(root).__name__)
print("root.variables =", root.variables)
print("root.variables[0] =", root.variables[0])
tutucu6 l10n-yerroot type = Checkpoint root.variables = ListWrapper([<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.0>, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.0>, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.0>]) root.variables[0] = <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.0>
Aşağıdaki pasajı denemeyi deneyin ve kontrol noktası anahtarlarının nesne yapısıyla nasıl değiştiğini görün:
module = tf.Module()
module.d = tf.Variable(0.)
test_ckpt = tf.train.Checkpoint(v={'a': a, 'b': b},
c=c,
module=module)
test_ckpt_path = test_ckpt.save('root-tf2-ckpt')
print_checkpoint(test_ckpt_path)
tutucu8 l10n-yerCheckpoint at 'root-tf2-ckpt-1': (key='v/a/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=0.0) (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1) (key='v/b/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=0.0) (key='module/d/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=0.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n,\n\x05\x08\x01\x12\x01c\n\n\x08\x02\x12\x06module\n\x05\x08\x03\x12\x01v\n\x10\x08\x04\x12\x0csave_counter\n:\x128\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a\x1cc/.ATTRIBUTES/VARIABLE_VALUE\n\x07\n\x05\x08\x05\x12\x01d\n\x0e\n\x05\x08\x06\x12\x01a\n\x05\x08\x07\x12\x01b\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\nA\x12?\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a#module/d/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a\x1ev/a/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a\x1ev/b/.ATTRIBUTES/VARIABLE_VALUE") (key='c/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=0.0)
TF2 neden bu mekanizmayı kullanıyor?
TF2'de artık global grafik olmadığı için değişken isimleri güvenilmezdir ve programlar arasında tutarsız olabilir. TF2, değişkenlerin katmanlara ve katmanların bir modele ait olduğu nesne yönelimli modelleme yaklaşımını teşvik eder:
variable = tf.Variable(...)
layer.variable_name = variable
model.layer_name = layer
Model geçişi sırasında kontrol noktası uyumluluğu nasıl korunur
Geçiş sürecindeki önemli bir adım , tüm değişkenlerin doğru değerlere başlatılmasını sağlamaktır, bu da işlemlerin/işlevlerin doğru hesaplamaları yaptığını doğrulamanıza olanak tanır. Bunu başarmak için, geçişin çeşitli aşamalarındaki modeller arasındaki kontrol noktası uyumluluğunu göz önünde bulundurmalısınız. Esasen bu bölüm , modeli değiştirirken aynı kontrol noktasını nasıl kullanmaya devam edebilirim sorusuna cevap verir.
Aşağıda, esnekliği artırmak için kontrol noktası uyumluluğunu korumanın üç yolu bulunmaktadır:
- Model, öncekiyle aynı değişken adlarına sahiptir.
- Modelin farklı değişken adları vardır ve kontrol noktasındaki değişken adlarını yeni adlara eşleyen bir atama haritası tutar.
- Modelin farklı değişken adları vardır ve tüm değişkenleri depolayan bir TF2 Checkpoint nesnesini korur.
Değişken isimleri eşleştiğinde
Uzun başlık: Değişken adları eşleştiğinde kontrol noktaları nasıl yeniden kullanılır.
Kısa cevap: Önceden var olan kontrol noktasını tf1.train.Saver
veya tf.train.Checkpoint
ile doğrudan yükleyebilirsiniz.
tf.compat.v1.keras.utils.track_tf1_style_variables
kullanıyorsanız, model değişken adlarınızın öncekiyle aynı olmasını sağlayacaktır. Değişken adlarının eşleşmesini manuel olarak da sağlayabilirsiniz.
Geçirilen modellerde değişken adları eşleştiğinde, kontrol noktasını yüklemek için doğrudan tf.train.Checkpoint
veya tf.compat.v1.train.Saver
kullanabilirsiniz. Her iki API de istekli ve grafik moduyla uyumludur, böylece bunları geçişin herhangi bir aşamasında kullanabilirsiniz.
Aşağıda aynı kontrol noktasının farklı modellerle kullanımına ilişkin örnekler verilmiştir. İlk önce, tf1.train.Saver
ile bir TF1 kontrol noktası kaydedin:
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
c = tf1.get_variable('scoped/c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.Session() as sess:
saver = tf1.train.Saver()
sess.run(a.assign(1))
sess.run(b.assign(2))
sess.run(c.assign(3))
save_path = saver.save(sess, 'tf1-ckpt')
print_checkpoint(save_path)
tutucu11 l10n-yerCheckpoint at 'tf1-ckpt': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0)
Aşağıdaki örnek, istekli moddayken kontrol noktasını yüklemek için tf.compat.v1.Saver
kullanır:
a = tf.Variable(0.0, name='a')
b = tf.Variable(0.0, name='b')
with tf.name_scope('scoped'):
c = tf.Variable(0.0, name='c')
# With the removal of collections in TF2, you must pass in the list of variables
# to the Saver object:
saver = tf1.train.Saver(var_list=[a, b, c])
saver.restore(sess=None, save_path=save_path)
print(f"loaded values of [a, b, c]: [{a.numpy()}, {b.numpy()}, {c.numpy()}]")
# Saving also works in eager (sess must be None).
path = saver.save(sess=None, save_path='tf1-ckpt-saved-in-eager')
print_checkpoint(path)
tutucu13 l10n-yerWARNING: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 tf1-ckpt loaded values of [a, b, c]: [1.0, 2.0, 3.0] Checkpoint at 'tf1-ckpt-saved-in-eager': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0)
Sonraki snippet, TF2 API tf.train.Checkpoint
kullanarak kontrol noktasını yükler:
a = tf.Variable(0.0, name='a')
b = tf.Variable(0.0, name='b')
with tf.name_scope('scoped'):
c = tf.Variable(0.0, name='c')
# Without the name_scope, name="scoped/c" works too:
c_2 = tf.Variable(0.0, name='scoped/c')
print("Variable names: ")
print(f" a.name = {a.name}")
print(f" b.name = {b.name}")
print(f" c.name = {c.name}")
print(f" c_2.name = {c_2.name}")
# Restore the values with tf.train.Checkpoint
ckpt = tf.train.Checkpoint(variables=[a, b, c, c_2])
ckpt.restore(save_path)
print(f"loaded values of [a, b, c, c_2]: [{a.numpy()}, {b.numpy()}, {c.numpy()}, {c_2.numpy()}]")
tutucu15 l10n-yerVariable names: a.name = a:0 b.name = b:0 c.name = scoped/c:0 c_2.name = scoped/c:0 WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/tracking/util.py:1345: NameBasedSaverStatus.__init__ (from tensorflow.python.training.tracking.util) is deprecated and will be removed in a future version. Instructions for updating: Restoring a name-based tf.train.Saver checkpoint using the object-based restore API. This mode uses global names to match variables, and so is somewhat fragile. It also adds new restore ops to the graph each time it is called when graph building. Prefer re-encoding training checkpoints in the object-based format: run save() on the object-based saver (the same one this message is coming from) and use that checkpoint in the future. loaded values of [a, b, c, c_2]: [1.0, 2.0, 3.0, 3.0]
TF2'de değişken isimleri
- Değişkenlerin hepsinde hala ayarlayabileceğiniz bir
name
argümanı vardır. - Keras modelleri, değişkenleri için önek olarak belirledikleri bir
name
bağımsız değişkeni de alır. -
v1.name_scope
işlevi, değişken adı öneklerini ayarlamak için kullanılabilir. Bu,tf.variable_scope
çok farklıdır. Yalnızca adları etkiler ve değişkenleri izlemez ve yeniden kullanmaz.
tf.compat.v1.keras.utils.track_tf1_style_variables
dekoratörü, tf.variable_scope
ve tf.compat.v1.get_variable
adlandırma ve yeniden kullanım semantiğini değiştirmeden, değişken adlarını ve TF1 kontrol noktası uyumluluğunu korumanıza yardımcı olan bir ayardır. Daha fazla bilgi için Model eşleme kılavuzuna bakın.
Not 1: Şimi kullanıyorsanız, kontrol noktalarınızı yüklemek için TF2 API'lerini kullanın (önceden eğitilmiş TF1 kontrol noktalarını kullanırken bile).
Kontrol Noktası Keras bölümüne bakın.
Not 2: tf.Variable
get_variable
:
Altlık süslemeli katmanınız veya modülünüz, tf.Variable
yerine tf.compat.v1.get_variable
ve özellikler olarak eklenen/nesne yönelimli bir şekilde izlenen bazı değişkenlerden (veya Keras katmanlarından/modellerinden) oluşuyorsa, bunların farklı özellikleri olabilir. TF1.x grafiklerinde/oturumlarında değişken adlandırma semantiği ile istekli yürütme sırasındaki karşılaştırma.
Kısacası, isimler TF2'de çalışırken beklediğiniz gibi olmayabilir .
Atama haritalarının bakımı
Atama haritaları, ağırlıkları TF1 modelleri arasında aktarmak için yaygın olarak kullanılır ve değişken adları değişirse model geçişiniz sırasında da kullanılabilir.
Bu haritaları tf.compat.v1.train.init_from_checkpoint
, tf.compat.v1.train.Saver
ve tf.train.load_checkpoint
ile değişken veya kapsam adlarının değişmiş olabileceği modellere ağırlık yüklemek için kullanabilirsiniz.
Bu bölümdeki örneklerde önceden kaydedilmiş bir kontrol noktası kullanılacaktır:
print_checkpoint('tf1-ckpt')
tutucu17 l10n-yerCheckpoint at 'tf1-ckpt': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0)
init_from_checkpoint
ile yükleme
tf1.train.init_from_checkpoint
Grafik/Oturum sırasında çağrılmalıdır, çünkü değerleri bir atama işlemi oluşturmak yerine değişken başlatıcılara yerleştirir.
Değişkenlerin nasıl yükleneceğini yapılandırmak için assignment_map
bağımsız değişkenini kullanabilirsiniz. Belgelerden:
Atama haritası aşağıdaki söz dizimini destekler:
-
'checkpoint_scope_name/': 'scope_name/'
- mevcutscope_name
içindeki tüm değişkenleri, eşleşen tensör adlarıylacheckpoint_scope_name
öğesinden yükler. -
'checkpoint_scope_name/some_other_variable': 'scope_name/variable_name'
-checkpoint_scope_name/some_other_variable
scope_name/variable_name
değişkenini başlatır. -
'scope_variable_name': variable
- verilentf.Variable
nesnesini kontrol noktasından 'scope_variable_name' tensörü ile başlatır. -
'scope_variable_name': list(variable)
- bölümlenmiş değişkenlerin listesini kontrol noktasından 'scope_variable_name' tensörü ile başlatır. -
'/': 'scope_name/'
- geçerliscope_name
içindeki tüm değişkenleri kontrol noktasının kökünden yükler (örn. kapsam yok).
# Restoring with tf1.train.init_from_checkpoint:
# A new model with a different scope for the variables.
with tf.Graph().as_default() as g:
with tf1.variable_scope('new_scope'):
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
c = tf1.get_variable('scoped/c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.Session() as sess:
# The assignment map will remap all variables in the checkpoint to the
# new scope:
tf1.train.init_from_checkpoint(
'tf1-ckpt',
assignment_map={'/': 'new_scope/'})
# `init_from_checkpoint` adds the initializers to these variables.
# Use `sess.run` to run these initializers.
sess.run(tf1.global_variables_initializer())
print("Restored [a, b, c]: ", sess.run([a, b, c]))
tutucu19 l10n-yerRestored [a, b, c]: [1.0, 2.0, 3.0]
tf1.train.Saver
ile yükleme
init_from_checkpoint
aksine, tf.compat.v1.train.Saver
hem grafik hem de istekli modda çalışır. var_list
bağımsız değişkeni isteğe bağlı olarak bir sözlüğü kabul eder, ancak değişken adlarını tf.Variable
nesnesiyle eşleştirmesi gerekir.
# Restoring with tf1.train.Saver (works in both graph and eager):
# A new model with a different scope for the variables.
with tf1.variable_scope('new_scope'):
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
c = tf1.get_variable('scoped/c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
# Initialize the saver with a dictionary with the original variable names:
saver = tf1.train.Saver({'a': a, 'b': b, 'scoped/c': c})
saver.restore(sess=None, save_path='tf1-ckpt')
print("Restored [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
tutucu21 l10n-yerWARNING: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 tf1-ckpt Restored [a, b, c]: [1.0, 2.0, 3.0]
tf.train.load_checkpoint
ile yükleme
Değişken değerleri üzerinde hassas kontrole ihtiyacınız varsa bu seçenek tam size göre. Yine, bu hem grafik hem de istekli modlarda çalışır.
# Restoring with tf.train.load_checkpoint (works in both graph and eager):
# A new model with a different scope for the variables.
with tf.Graph().as_default() as g:
with tf1.variable_scope('new_scope'):
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
c = tf1.get_variable('scoped/c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.Session() as sess:
# It may be easier writing a loop if your model has a lot of variables.
reader = tf.train.load_checkpoint('tf1-ckpt')
sess.run(a.assign(reader.get_tensor('a')))
sess.run(b.assign(reader.get_tensor('b')))
sess.run(c.assign(reader.get_tensor('scoped/c')))
print("Restored [a, b, c]: ", sess.run([a, b, c]))
tutucu23 l10n-yerRestored [a, b, c]: [1.0, 2.0, 3.0]
Bir TF2 Checkpoint nesnesinin bakımı
Değişken ve kapsam adları geçiş sırasında çok değişebilirse, tf.train.Checkpoint
ve TF2 kontrol noktalarını kullanın. TF2, değişken adları yerine nesne yapısını kullanır (daha fazla ayrıntı TF1'den TF2'ye Değişiklikler'de ).
Kısacası, kontrol noktalarını kaydetmek veya geri yüklemek için bir tf.train.Checkpoint
oluştururken, aynı sıralamayı (listeler için) ve anahtarları ( Checkpoint
başlatıcısına yönelik sözlükler ve anahtar kelime argümanları için) kullandığından emin olun. Bazı kontrol noktası uyumluluğu örnekleri:
ckpt = tf.train.Checkpoint(foo=[var_a, var_b])
# compatible with ckpt
tf.train.Checkpoint(foo=[var_a, var_b])
# not compatible with ckpt
tf.train.Checkpoint(foo=[var_b, var_a])
tf.train.Checkpoint(bar=[var_a, var_b])
Aşağıdaki kod örnekleri, farklı adlara sahip değişkenleri yüklemek için "aynı" tf.train.Checkpoint
nasıl kullanılacağını gösterir. İlk önce, bir TF2 kontrol noktası kaydedin:
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(1))
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(2))
with tf1.variable_scope('scoped'):
c = tf1.get_variable('c', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(3))
with tf1.Session() as sess:
sess.run(tf1.global_variables_initializer())
print("[a, b, c]: ", sess.run([a, b, c]))
# Save a TF2 checkpoint
ckpt = tf.train.Checkpoint(unscoped=[a, b], scoped=[c])
tf2_ckpt_path = ckpt.save('tf2-ckpt')
print_checkpoint(tf2_ckpt_path)
tutucu26 l10n-yer[a, b, c]: [1.0, 2.0, 3.0] Checkpoint at 'tf2-ckpt-1': (key='unscoped/1/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=2.0) (key='unscoped/0/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=1.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n,\n\n\x08\x01\x12\x06scoped\n\x0c\x08\x02\x12\x08unscoped\n\x10\x08\x03\x12\x0csave_counter\n\x07\n\x05\x08\x04\x12\x010\n\x0e\n\x05\x08\x05\x12\x010\n\x05\x08\x06\x12\x011\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\nA\x12?\n\x0eVARIABLE_VALUE\x12\x08scoped/c\x1a#scoped/0/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01a\x1a%unscoped/0/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01b\x1a%unscoped/1/.ATTRIBUTES/VARIABLE_VALUE") (key='scoped/0/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=3.0) (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1)
Değişken/kapsam adları değişse bile tf.train.Checkpoint
kullanmaya devam edebilirsiniz:
with tf.Graph().as_default() as g:
a = tf1.get_variable('a_different_name', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
b = tf1.get_variable('b_different_name', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.variable_scope('different_scope'):
c = tf1.get_variable('c', shape=[], dtype=tf.float32,
initializer=tf1.zeros_initializer())
with tf1.Session() as sess:
sess.run(tf1.global_variables_initializer())
print("Initialized [a, b, c]: ", sess.run([a, b, c]))
ckpt = tf.train.Checkpoint(unscoped=[a, b], scoped=[c])
# `assert_consumed` validates that all checkpoint objects are restored from
# the checkpoint. `run_restore_ops` is required when running in a TF1
# session.
ckpt.restore(tf2_ckpt_path).assert_consumed().run_restore_ops()
# Removing `assert_consumed` is fine if you want to skip the validation.
# ckpt.restore(tf2_ckpt_path).run_restore_ops()
print("Restored [a, b, c]: ", sess.run([a, b, c]))
tutucu28 l10n-yerInitialized [a, b, c]: [0.0, 0.0, 0.0] Restored [a, b, c]: [1.0, 2.0, 3.0]
Ve istekli modunda:
a = tf.Variable(0.)
b = tf.Variable(0.)
c = tf.Variable(0.)
print("Initialized [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
# The keys "scoped" and "unscoped" are no longer relevant, but are used to
# maintain compatibility with the saved checkpoints.
ckpt = tf.train.Checkpoint(unscoped=[a, b], scoped=[c])
ckpt.restore(tf2_ckpt_path).assert_consumed().run_restore_ops()
print("Restored [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
tutucu30 l10n-yerInitialized [a, b, c]: [0.0, 0.0, 0.0] Restored [a, b, c]: [1.0, 2.0, 3.0]
Tahmincide TF2 kontrol noktaları
Yukarıdaki bölümler, modelinizi taşırken kontrol noktası uyumluluğunu nasıl koruyacağınızı açıklar. Kontrol noktasının kaydedilme/yüklenme şekli biraz farklı olsa da, bu kavramlar Tahminci modelleri için de geçerlidir. Tahminci modelinizi TF2 API'lerini kullanmak üzere geçirirken, model tahminciyi kullanmaya devam ederken TF1'den TF2 kontrol noktalarına geçmek isteyebilirsiniz. Bu bölümlerde bunun nasıl yapılacağı gösterilmektedir.
tf.estimator.Estimator
ve MonitoredSession
, bir tf.compat.v1.train.Scaffold
nesnesi olan scaffold
adı verilen bir kaydetme mekanizmasına sahiptir. Scaffold
, Estimator
ve MonitoredSession
TF1 veya TF2 tarzı kontrol noktalarını kaydetmesini sağlayan bir tf1.train.Saver
veya tf.train.Checkpoint
içerebilir.
# A model_fn that saves a TF1 checkpoint
def model_fn_tf1_ckpt(features, labels, mode):
# This model adds 2 to the variable `v` in every train step.
train_step = tf1.train.get_or_create_global_step()
v = tf1.get_variable('var', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
return tf.estimator.EstimatorSpec(
mode,
predictions=v,
train_op=tf.group(v.assign_add(2), train_step.assign_add(1)),
loss=tf.constant(1.),
scaffold=None
)
!rm -rf est-tf1
est = tf.estimator.Estimator(model_fn_tf1_ckpt, 'est-tf1')
def train_fn():
return tf.data.Dataset.from_tensor_slices(([1,2,3], [4,5,6]))
est.train(train_fn, steps=1)
latest_checkpoint = tf.train.latest_checkpoint('est-tf1')
print_checkpoint(latest_checkpoint)
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'est-tf1', '_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 est-tf1/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 1.0, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1... INFO:tensorflow:Saving checkpoints for 1 into est-tf1/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1... INFO:tensorflow:Loss for final step: 1.0. Checkpoint at 'est-tf1/model.ckpt-1': (key='var', shape=[], dtype=float32, value=2.0) (key='global_step', shape=[], dtype=int64, value=1)yer tutucu33 l10n-yer
# A model_fn that saves a TF2 checkpoint
def model_fn_tf2_ckpt(features, labels, mode):
# This model adds 2 to the variable `v` in every train step.
train_step = tf1.train.get_or_create_global_step()
v = tf1.get_variable('var', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
ckpt = tf.train.Checkpoint(var_list={'var': v}, step=train_step)
return tf.estimator.EstimatorSpec(
mode,
predictions=v,
train_op=tf.group(v.assign_add(2), train_step.assign_add(1)),
loss=tf.constant(1.),
scaffold=tf1.train.Scaffold(saver=ckpt)
)
!rm -rf est-tf2
est = tf.estimator.Estimator(model_fn_tf2_ckpt, 'est-tf2',
warm_start_from='est-tf1')
def train_fn():
return tf.data.Dataset.from_tensor_slices(([1,2,3], [4,5,6]))
est.train(train_fn, steps=1)
latest_checkpoint = tf.train.latest_checkpoint('est-tf2')
print_checkpoint(latest_checkpoint)
assert est.get_variable_value('var_list/var/.ATTRIBUTES/VARIABLE_VALUE') == 4
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'est-tf2', '_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} INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='est-tf1', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={}) INFO:tensorflow:Warm-starting from: est-tf1 INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES. INFO:tensorflow:Warm-started 1 variables. 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 est-tf2/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 1.0, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1... INFO:tensorflow:Saving checkpoints for 1 into est-tf2/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1... INFO:tensorflow:Loss for final step: 1.0. Checkpoint at 'est-tf2/model.ckpt-1': (key='var_list/var/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=4.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n\x18\n\x08\x08\x01\x12\x04step\n\x0c\x08\x02\x12\x08var_list\n@\x12>\n\x0eVARIABLE_VALUE\x12\x0bglobal_step\x1a\x1fstep/.ATTRIBUTES/VARIABLE_VALUE\n\t\n\x07\x08\x03\x12\x03var\n@\x12>\n\x0eVARIABLE_VALUE\x12\x03var\x1a'var_list/var/.ATTRIBUTES/VARIABLE_VALUE") (key='step/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1)
v
son değeri, est-tf1
sıcak başlatıldıktan sonra, 5 adım daha eğitildikten sonra 16
olmalıdır. Tren adımı değeri, warm_start
kontrol noktasından taşınmaz.
Kontrol Noktası Keras
Keras ile oluşturulan modeller, önceden var olan ağırlıkları yüklemek için hala tf1.train.Saver
ve tf.train.Checkpoint
kullanır. Modeliniz tamamen geçirildiğinde, özellikle eğitim sırasında ModelCheckpoint
geri aramasını kullanıyorsanız model.save_weights
ve model.load_weights
kullanımına geçin.
Kontrol noktaları ve Keras hakkında bilmeniz gereken bazı şeyler:
Başlatma vs Bina
Keras modelleri ve katmanları tam olarak oluşturulmadan önce iki adımdan geçmelidir. Birincisi Python nesnesinin başlatılmasıdır : layer = tf.keras.layers.Dense(x)
. İkincisi, ağırlıkların çoğunun gerçekten oluşturulduğu derleme adımıdır: layer.build(input_shape)
. Ayrıca onu çağırarak veya tek bir train
, eval
veya predict
adımı çalıştırarak da bir model oluşturabilirsiniz (yalnızca ilk kez).
model.load_weights(path).assert_consumed()
öğesinin bir hata oluşturduğunu tespit ederseniz, büyük olasılıkla model/katmanlar oluşturulmamıştır.
Keras, TF2 kontrol noktalarını kullanır
tf.train.Checkpoint(model).write
, model.save_weights
ile eşdeğerdir. tf.train.Checkpoint(model).read
ve model.load_weights
ile aynı. Checkpoint(model) != Checkpoint(model=model)
olduğuna dikkat edin.
TF2 kontrol noktaları, Keras'ın build()
adımıyla çalışır
tf.train.Checkpoint.restore
, değişken henüz oluşturulmamışsa tf.Module
ve Keras nesnelerinin değişken değerlerini depolamasına izin veren ertelenmiş geri yükleme adı verilen bir mekanizmaya sahiptir. Bu, başlatılmış modellerin ağırlıkları yüklemesine ve sonra oluşturmasına olanak tanır.
m = YourKerasModel()
status = m.load_weights(path)
# This call builds the model. The variables are created with the restored
# values.
m.predict(inputs)
status.assert_consumed()
Bu mekanizma nedeniyle, Keras modelleriyle TF2 kontrol noktası yükleme API'lerini kullanmanızı şiddetle tavsiye ediyoruz (önceden var olan TF1 kontrol noktalarını model eşleme şimlerine geri yüklerken bile). Daha fazlasını kontrol noktası kılavuzunda görün.
Kod parçacıkları
Aşağıdaki parçacıklar, kontrol noktası kaydetme API'lerinde TF1/TF2 sürüm uyumluluğunu gösterir.
TF2'de bir TF1 kontrol noktası kaydedin
a = tf.Variable(1.0, name='a')
b = tf.Variable(2.0, name='b')
with tf.name_scope('scoped'):
c = tf.Variable(3.0, name='c')
saver = tf1.train.Saver(var_list=[a, b, c])
path = saver.save(sess=None, save_path='tf1-ckpt-saved-in-eager')
print_checkpoint(path)
tutucu37 l10n-yerWARNING: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. Checkpoint at 'tf1-ckpt-saved-in-eager': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0)
TF2'de bir TF1 kontrol noktası yükleyin
a = tf.Variable(0., name='a')
b = tf.Variable(0., name='b')
with tf.name_scope('scoped'):
c = tf.Variable(0., name='c')
print("Initialized [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
saver = tf1.train.Saver(var_list=[a, b, c])
saver.restore(sess=None, save_path='tf1-ckpt-saved-in-eager')
print("Restored [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
tutucu39 l10n-yerInitialized [a, b, c]: [0.0, 0.0, 0.0] 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 tf1-ckpt-saved-in-eager Restored [a, b, c]: [1.0, 2.0, 3.0]
TF1'de bir TF2 kontrol noktası kaydedin
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(1))
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(2))
with tf1.variable_scope('scoped'):
c = tf1.get_variable('c', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(3))
with tf1.Session() as sess:
sess.run(tf1.global_variables_initializer())
ckpt = tf.train.Checkpoint(
var_list={v.name.split(':')[0]: v for v in tf1.global_variables()})
tf2_in_tf1_path = ckpt.save('tf2-ckpt-saved-in-session')
print_checkpoint(tf2_in_tf1_path)
tutucu41 l10n-yerCheckpoint at 'tf2-ckpt-saved-in-session-1': (key='var_list/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=3.0) (key='var_list/b/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=2.0) (key='var_list/a/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=1.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n \n\x0c\x08\x01\x12\x08var_list\n\x10\x08\x02\x12\x0csave_counter\n\x1c\n\x05\x08\x03\x12\x01a\n\x05\x08\x04\x12\x01b\n\x0c\x08\x05\x12\x08scoped/c\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01a\x1a%var_list/a/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01b\x1a%var_list/b/.ATTRIBUTES/VARIABLE_VALUE\nK\x12I\n\x0eVARIABLE_VALUE\x12\x08scoped/c\x1a-var_list/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE") (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1)
TF1'de bir TF2 kontrol noktası yükleyin
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
with tf1.variable_scope('scoped'):
c = tf1.get_variable('c', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
with tf1.Session() as sess:
sess.run(tf1.global_variables_initializer())
print("Initialized [a, b, c]: ", sess.run([a, b, c]))
ckpt = tf.train.Checkpoint(
var_list={v.name.split(':')[0]: v for v in tf1.global_variables()})
ckpt.restore('tf2-ckpt-saved-in-session-1').run_restore_ops()
print("Restored [a, b, c]: ", sess.run([a, b, c]))
tutucu43 l10n-yerInitialized [a, b, c]: [0.0, 0.0, 0.0] Restored [a, b, c]: [1.0, 2.0, 3.0]
Kontrol noktası dönüştürme
Kontrol noktalarını yükleyip yeniden kaydederek kontrol noktalarını TF1 ve TF2 arasında dönüştürebilirsiniz. Bir alternatif, aşağıdaki kodda gösterilen tf.train.load_checkpoint
.
TF1 kontrol noktasını TF2'ye dönüştürün
def convert_tf1_to_tf2(checkpoint_path, output_prefix):
"""Converts a TF1 checkpoint to TF2.
To load the converted checkpoint, you must build a dictionary that maps
variable names to variable objects.
```
ckpt = tf.train.Checkpoint(vars={name: variable})
ckpt.restore(converted_ckpt_path)
```
Args:
checkpoint_path: Path to the TF1 checkpoint.
output_prefix: Path prefix to the converted checkpoint.
Returns:
Path to the converted checkpoint.
"""
vars = {}
reader = tf.train.load_checkpoint(checkpoint_path)
dtypes = reader.get_variable_to_dtype_map()
for key in dtypes.keys():
vars[key] = tf.Variable(reader.get_tensor(key))
return tf.train.Checkpoint(vars=vars).save(output_prefix)
```
Convert the checkpoint saved in the snippet `Save a TF1 checkpoint in TF2`:
```python
# Make sure to run the snippet in `Save a TF1 checkpoint in TF2`.
print_checkpoint('tf1-ckpt-saved-in-eager')
converted_path = convert_tf1_to_tf2('tf1-ckpt-saved-in-eager',
'converted-tf1-to-tf2')
print("\n[Converted]")
print_checkpoint(converted_path)
# Try loading the converted checkpoint.
a = tf.Variable(0.)
b = tf.Variable(0.)
c = tf.Variable(0.)
ckpt = tf.train.Checkpoint(vars={'a': a, 'b': b, 'scoped/c': c})
ckpt.restore(converted_path).assert_consumed()
print("\nRestored [a, b, c]: ", [a.numpy(), b.numpy(), c.numpy()])
tutucu45 l10n-yerCheckpoint at 'tf1-ckpt-saved-in-eager': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0) [Converted] Checkpoint at 'converted-tf1-to-tf2-1': (key='vars/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=3.0) (key='vars/b/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=2.0) (key='vars/a/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=1.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n\x1c\n\x08\x08\x01\x12\x04vars\n\x10\x08\x02\x12\x0csave_counter\n\x1c\n\x0c\x08\x03\x12\x08scoped/c\n\x05\x08\x04\x12\x01a\n\x05\x08\x05\x12\x01b\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\nG\x12E\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a)vars/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE\n?\x12=\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a!vars/a/.ATTRIBUTES/VARIABLE_VALUE\n?\x12=\n\x0eVARIABLE_VALUE\x12\x08Variable\x1a!vars/b/.ATTRIBUTES/VARIABLE_VALUE") (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1) Restored [a, b, c]: [1.0, 2.0, 3.0]
TF2 kontrol noktasını TF1'e dönüştürün
def convert_tf2_to_tf1(checkpoint_path, output_prefix):
"""Converts a TF2 checkpoint to TF1.
The checkpoint must be saved using a
`tf.train.Checkpoint(var_list={name: variable})`
To load the converted checkpoint with `tf.compat.v1.Saver`:
```
saver = tf.compat.v1.train.Saver(var_list={name: variable})
# An alternative, if the variable names match the keys:
saver = tf.compat.v1.train.Saver(var_list=[variables])
saver.restore(sess, output_path)
```
"""
vars = {}
reader = tf.train.load_checkpoint(checkpoint_path)
dtypes = reader.get_variable_to_dtype_map()
for key in dtypes.keys():
# Get the "name" from the
if key.startswith('var_list/'):
var_name = key.split('/')[1]
# TF2 checkpoint keys use '/', so if they appear in the user-defined name,
# they are escaped to '.S'.
var_name = var_name.replace('.S', '/')
vars[var_name] = tf.Variable(reader.get_tensor(key))
return tf1.train.Saver(var_list=vars).save(sess=None, save_path=output_prefix)
```
Convert the checkpoint saved in the snippet `Save a TF2 checkpoint in TF1`:
```python
# Make sure to run the snippet in `Save a TF2 checkpoint in TF1`.
print_checkpoint('tf2-ckpt-saved-in-session-1')
converted_path = convert_tf2_to_tf1('tf2-ckpt-saved-in-session-1',
'converted-tf2-to-tf1')
print("\n[Converted]")
print_checkpoint(converted_path)
# Try loading the converted checkpoint.
with tf.Graph().as_default() as g:
a = tf1.get_variable('a', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
b = tf1.get_variable('b', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
with tf1.variable_scope('scoped'):
c = tf1.get_variable('c', shape=[], dtype=tf.float32,
initializer=tf1.constant_initializer(0))
with tf1.Session() as sess:
saver = tf1.train.Saver([a, b, c])
saver.restore(sess, converted_path)
print("\nRestored [a, b, c]: ", sess.run([a, b, c]))
tutucu47 l10n-yerCheckpoint at 'tf2-ckpt-saved-in-session-1': (key='var_list/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=3.0) (key='var_list/b/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=2.0) (key='var_list/a/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=float32, value=1.0) (key='_CHECKPOINTABLE_OBJECT_GRAPH', shape=[], dtype=string, value=b"\n \n\x0c\x08\x01\x12\x08var_list\n\x10\x08\x02\x12\x0csave_counter\n\x1c\n\x05\x08\x03\x12\x01a\n\x05\x08\x04\x12\x01b\n\x0c\x08\x05\x12\x08scoped/c\nI\x12G\n\x0eVARIABLE_VALUE\x12\x0csave_counter\x1a'save_counter/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01a\x1a%var_list/a/.ATTRIBUTES/VARIABLE_VALUE\n<\x12:\n\x0eVARIABLE_VALUE\x12\x01b\x1a%var_list/b/.ATTRIBUTES/VARIABLE_VALUE\nK\x12I\n\x0eVARIABLE_VALUE\x12\x08scoped/c\x1a-var_list/scoped.Sc/.ATTRIBUTES/VARIABLE_VALUE") (key='save_counter/.ATTRIBUTES/VARIABLE_VALUE', shape=[], dtype=int64, value=1) 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. [Converted] Checkpoint at 'converted-tf2-to-tf1': (key='scoped/c', shape=[], dtype=float32, value=3.0) (key='a', shape=[], dtype=float32, value=1.0) (key='b', shape=[], dtype=float32, value=2.0) INFO:tensorflow:Restoring parameters from converted-tf2-to-tf1 Restored [a, b, c]: [1.0, 2.0, 3.0]