![]() | ![]() | ![]() | ![]() |
Bu kılavuz, düşük seviyeli TensorFlow API'leri kullanıcıları içindir. Üst düzey API'leri ( tf.keras
) kullanıyorsanız, kodunuzu tamamen TensorFlow 2.x uyumlu hale getirmek için yapmanız gereken çok az işlem olabilir veya hiç işlem olmayabilir:
- Optimize edicinizin varsayılan öğrenme oranını kontrol edin.
- Metriklerin günlüğe kaydedildiği "adın" değişmiş olabileceğini unutmayın .
TensorFlow 2.x'te 1.x kodunu değiştirilmemiş (katkılar hariç ) çalıştırmak hala mümkündür:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Ancak bu, TensorFlow 2.x'te yapılan iyileştirmelerin çoğundan yararlanmanıza izin vermez. Bu kılavuz, kodunuzu yükseltmenize, daha basit, daha performanslı ve bakımı daha kolay hale getirmenize yardımcı olacaktır.
Otomatik dönüşüm komut dosyası
Bu kılavuzda açıklanan değişiklikleri uygulamaya başlamadan önceki ilk adım, yükseltme komut dosyasını çalıştırmayı denemektir.
Bu, kodunuzu TensorFlow 2.x'e yükseltirken ilk geçişi gerçekleştirir, ancak kodunuzu v2'ye deyimsel yapamaz. Kodunuz yine de yer tutuculara, oturumlara, koleksiyonlara ve diğer 1.x-stili işlevlere erişmek için tf.compat.v1
uç noktalarını kullanabilir.
Üst düzey davranış değişiklikleri
Kodunuz tf.compat.v1.disable_v2_behavior kullanarak tf.compat.v1.disable_v2_behavior
2.x'te çalışıyorsa, çözmeniz gereken genel davranış değişiklikleri hala vardır. Önemli değişiklikler şunlardır:
v1.enable_eager_execution()
çalıştırma,v1.enable_eager_execution()
: Örtük olaraktf.Graph
kullanan herhangi bir kod.tf.Graph
başarısız olacaktır. Bu koduwith tf.Graph().as_default()
bağlamıylawith tf.Graph().as_default()
emin olun.Kaynak değişkenleri,
v1.enable_resource_variables()
: Bazı kodlar, TensorFlow referans değişkenleri tarafından etkinleştirilen deterministik olmayan davranışlara bağlı olabilir. Kaynak değişkenleri yazılırken kilitlenir ve bu nedenle daha sezgisel tutarlılık garantileri sağlar.- Bu, uç durumlarda davranışı değiştirebilir.
- Bu fazladan kopyalar oluşturabilir ve daha yüksek bellek kullanımına sahip olabilir.
- Bu,
tf.Variable
yapıcısınause_resource=False
devre dışı bırakılabilir.
Tensor şekilleri,
v1.enable_v2_tensorshape()
: TensorFlow 2.x, tensör şekillerinin davranışını basitleştirir. Yerinet.shape[0].value
diyebilirsinizt.shape[0]
. Bu değişiklikler küçük olmalı ve bunları hemen düzeltmek mantıklı. Örnekler için TensorShape bölümüne bakın.Kontrol akışı,
v1.enable_control_flow_v2()
: TensorFlow 2.x kontrol akışı uygulaması basitleştirilmiştir ve bu nedenle farklı grafik gösterimleri üretir. Lütfen herhangi bir sorun için hataları bildirin.
TensorFlow 2.x için kod oluşturun
Bu kılavuz, TensorFlow 1.x kodunu TensorFlow 2.x'e dönüştürmenin birkaç örneğini inceleyecektir. Bu değişiklikler, kodunuzun performans optimizasyonlarından ve basitleştirilmiş API çağrılarından yararlanmasına olanak tanır.
Her durumda model şu şekildedir:
1. v1.Session.run
çağrılarını değiştirin
Her v1.Session.run
çağrısı bir Python işlevi ile değiştirilmelidir.
-
feed_dict
vev1.placeholder
s, fonksiyon argümanları haline gelir. -
fetches
, fonksiyonun dönüş değeri haline gelir. - Dönüşüm sırasında istekli yürütme,
pdb
gibi standart Python araçlarıyla kolay hata ayıklamaya izin verir.
Bundan sonra, grafikte verimli çalışmasını sağlamak için bir tf.function
dekoratörü ekleyin. Bunun nasıl çalıştığı hakkında daha fazla bilgi için İmza kılavuzuna bakın.
Bunu not et:
v1.Session.run
farklıv1.Session.run
, birtf.function
sabit bir dönüş imzası vardır ve her zaman tüm çıktıları döndürür. Bu performans sorunlarına neden oluyorsa, iki ayrı işlev oluşturun.Bir
tf.control_dependencies
veya benzer işlemlere gerek yoktur: Birtf.function
, yazılan sırayla çalıştırılmış gibi davranır. Örneğin,tf.Variable
atamalar vetf.assert
s, otomatik olarak yürütülür.
Dönüştürme modelleri bölümü , bu dönüştürme işleminin çalışan bir örneğini içerir.
2. Değişkenleri ve kayıpları izlemek için Python nesnelerini kullanın
Tüm isme dayalı değişken izleme TensorFlow 2.x'te kesinlikle önerilmez. Değişkenleri izlemek için Python nesnelerini kullanın.
Kullanım tf.Variable
yerine v1.get_variable
.
Her v1.variable_scope
bir Python nesnesine dönüştürülmelidir. Tipik olarak bu şunlardan biri olacaktır:
Değişken listelerini toplamanız gerekiyorsa ( tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
), Layer
ve Model
nesnelerinin .variables
ve .trainable_variables
niteliklerini kullanın.
Bu Layer
ve Model
sınıfları, genel koleksiyonlara duyulan ihtiyacı ortadan kaldıran diğer birçok özelliği uygular. .losses
özelliği, tf.GraphKeys.LOSSES
koleksiyonunun yerini alabilir.
Daha fazla ayrıntı için Keras kılavuzlarına bakın.
3. Egzersiz döngülerinizi yükseltin
Kullanım alanınız için çalışan en üst düzey API'yi kullanın. Kendi eğitim döngülerinizi oluşturmak yerine tf.keras.Model.fit
tercih tf.keras.Model.fit
.
Bu üst düzey işlevler, kendi eğitim döngünüzü yazarsanız gözden kaçırmanız kolay olabilecek birçok alt düzey ayrıntıyı yönetir. Örneğin, düzenleme kayıplarını otomatik olarak toplarlar ve modeli çağırırken training=True
argümanını ayarlarlar.
4. Veri giriş ardışık düzenlerinizi yükseltin
Veri girişi için tf.data
veri kümelerini kullanın. Bu nesneler etkilidir, ifade edicidir ve tensorflow ile iyi bir şekilde bütünleşir.
Doğrudan tf.keras.Model.fit
yöntemine geçirilebilirler.
model.fit(dataset, epochs=5)
Doğrudan standart Python üzerinden yinelenebilirler:
for example_batch, label_batch in dataset:
break
5. compat.v1
sembollerini compat.v1
tf.compat.v1
modülü, orijinal semantiğiyle birlikte eksiksiz TensorFlow 1.x API'sini içerir.
TensorFlow 2.x yükseltme betiği , böyle bir dönüştürme güvenliyse, yani TensorFlow 2.x sürümünün davranışının tam olarak eşdeğer olduğunu belirleyebiliyorsa (örneğin, v1.arg_max
adını değiştirecekse) sembolleri v2 eşdeğerlerine dönüştürür tf.argmax
, çünkü bunlar aynı işlevdir).
Yükseltme betiği bir kod parçasıyla yapıldıktan sonra, büyük olasılıkla compat.v1
birçok kez bahsedilmektedir. Kodu gözden geçirmeye ve bunları manuel olarak v2 eşdeğerine dönüştürmeye değer (varsa, günlükte belirtilmelidir).
Modelleri dönüştürme
Düşük seviyeli değişkenler ve operatör yürütme
Düşük seviyeli API kullanımına örnekler şunları içerir:
- Yeniden kullanımı kontrol etmek için değişken kapsamları kullanma.
-
v1.get_variable
ile değişkenler oluşturma. - Koleksiyonlara açıkça erişim.
Koleksiyonlara örtük olarak aşağıdaki yöntemlerle erişim:
Grafik girişlerini ayarlamak için
v1.placeholder
kullanma.Session.run
ile grafiklerin yürütülmesi.Değişkenleri manuel olarak başlatmak.
Dönüştürmeden önce
İşte bu kalıplar TensorFlow 1.x kullanan kodda nasıl görünebilir.
import tensorflow as tf
import tensorflow.compat.v1 as v1
import tensorflow_datasets as tfds
g = v1.Graph()
with g.as_default():
in_a = v1.placeholder(dtype=v1.float32, shape=(2))
in_b = v1.placeholder(dtype=v1.float32, shape=(2))
def forward(x):
with v1.variable_scope("matmul", reuse=v1.AUTO_REUSE):
W = v1.get_variable("W", initializer=v1.ones(shape=(2,2)),
regularizer=lambda x:tf.reduce_mean(x**2))
b = v1.get_variable("b", initializer=v1.zeros(shape=(2)))
return W * x + b
out_a = forward(in_a)
out_b = forward(in_b)
reg_loss=v1.losses.get_regularization_loss(scope="matmul")
with v1.Session(graph=g) as sess:
sess.run(v1.global_variables_initializer())
outs = sess.run([out_a, out_b, reg_loss],
feed_dict={in_a: [1, 0], in_b: [0, 1]})
print(outs[0])
print()
print(outs[1])
print()
print(outs[2])
[[1. 0.] [1. 0.]] [[0. 1.] [0. 1.]] 1.0
Dönüştürdükten sonra
Dönüştürülen kodda:
- Değişkenler yerel Python nesneleridir.
-
forward
işlevi hala hesaplamayı tanımlar. -
Session.run
çağrısı,forward
bir çağrı ile değiştirilir. - Performans için isteğe bağlı
tf.function
dekoratörü eklenebilir. - Düzenlemeler, herhangi bir genel koleksiyona bakılmaksızın manuel olarak hesaplanır.
- Oturumların veya yer tutucuların kullanımı yoktur .
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")
@tf.function
def forward(x):
return W * x + b
out_a = forward([1,0])
print(out_a)
tf.Tensor( [[1. 0.] [1. 0.]], shape=(2, 2), dtype=float32)
out_b = forward([0,1])
regularizer = tf.keras.regularizers.l2(0.04)
reg_loss=regularizer(W)
tf.layers
dayalı modeller
v1.layers
modülü, değişkenleri tanımlamak ve yeniden kullanmak için v1.variable_scope
dayanan katman işlevlerini v1.variable_scope
için kullanılır.
Dönüştürmeden önce
def model(x, training, scope='model'):
with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
x = v1.layers.conv2d(x, 32, 3, activation=v1.nn.relu,
kernel_regularizer=lambda x:0.004*tf.reduce_mean(x**2))
x = v1.layers.max_pooling2d(x, (2, 2), 1)
x = v1.layers.flatten(x)
x = v1.layers.dropout(x, 0.1, training=training)
x = v1.layers.dense(x, 64, activation=v1.nn.relu)
x = v1.layers.batch_normalization(x, training=training)
x = v1.layers.dense(x, 10)
return x
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
test_out = model(test_data, training=False)
print(train_out)
print()
print(test_out)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:414: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead. warnings.warn('`tf.layers.conv2d` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py:2273: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead. warnings.warn('`layer.apply` is deprecated and ' tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32) tf.Tensor( [[ 0.379358 -0.55901194 0.48704922 0.11619566 0.23902717 0.01691487 0.07227738 0.14556988 0.2459927 0.2501198 ]], shape=(1, 10), dtype=float32) /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/pooling.py:310: UserWarning: `tf.layers.max_pooling2d` is deprecated and will be removed in a future version. Please use `tf.keras.layers.MaxPooling2D` instead. warnings.warn('`tf.layers.max_pooling2d` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:329: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead. warnings.warn('`tf.layers.flatten` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:268: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead. warnings.warn('`tf.layers.dropout` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:171: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead. warnings.warn('`tf.layers.dense` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/normalization.py:308: UserWarning: `tf.layers.batch_normalization` is deprecated and will be removed in a future version. Please use `tf.keras.layers.BatchNormalization` instead. In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation). '`tf.layers.batch_normalization` is deprecated and '
Dönüştürdükten sonra
- Basit katman yığını,
tf.keras.Sequential
düzgün bir şekildetf.keras.Sequential
. (Daha karmaşık modeller için, özel katmanlara ve modellere ve işlevsel API kılavuzlarına göz atın.) - Model, değişkenleri ve düzenlilik kayıplarını izler.
-
v1.layers
doğrudan bir eşleme olduğu için dönüşümtf.keras.layers
.
Çoğu argüman aynı kaldı. Ancak farklılıklara dikkat edin:
-
training
argümanı, çalıştığında model tarafından her katmana iletilir. - Orijinal
model
işlevinin ilk argümanı (x
girdisi) gitti. Bunun nedeni, nesne katmanlarının, modeli oluşturmayı modeli çağırmaktan ayırmasıdır.
Ayrıca şunları da unutmayın:
-
tf.contrib
düzenleyiciler veya başlatıcılartf.contrib
, bunların diğerlerinden daha fazla bağımsız değişken değişikliği vardır. - Kod artık koleksiyonlara
v1.losses.get_regularization_loss
, bu nedenlev1.losses.get_regularization_loss
gibi işlevler artık bu değerleri döndürmeyecek ve potansiyel olarak eğitim döngüleriniziv1.losses.get_regularization_loss
.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.04),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
print(train_out)
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)
test_out = model(test_data, training=False)
print(test_out)
tf.Tensor( [[-0.2145557 -0.22979769 -0.14968733 0.01208701 -0.07569927 0.3475932 0.10718458 0.03482988 -0.04309493 -0.10469118]], shape=(1, 10), dtype=float32)
# Here are all the trainable variables
len(model.trainable_variables)
8
# Here is the regularization loss
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.08174552>]
Karışık değişkenler ve v1.layers
Mevcut kod genellikle daha düşük seviyeli TensorFlow 1.x değişkenlerini ve işlemleri daha yüksek seviyeli v1.layers
.
Dönüştürmeden önce
def model(x, training, scope='model'):
with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
W = v1.get_variable(
"W", dtype=v1.float32,
initializer=v1.ones(shape=x.shape),
regularizer=lambda x:0.004*tf.reduce_mean(x**2),
trainable=True)
if training:
x = x + W
else:
x = x + W * 0.5
x = v1.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
x = v1.layers.max_pooling2d(x, (2, 2), 1)
x = v1.layers.flatten(x)
return x
train_out = model(train_data, training=True)
test_out = model(test_data, training=False)
Dönüştürdükten sonra
Bu kodu dönüştürmek için, önceki örnekte olduğu gibi katmanları eşleme katmanlarını izleyin.
Genel model şöyledir:
- İçinde toplayın katman parametreleri
__init__
. - Değişkenleri derlemede
build
. -
call
sırasında hesaplamaları yürütün ve sonucu döndürün.
v1.variable_scope
aslında kendi katmanıdır. Öyleyse tf.keras.layers.Layer
olarak yeniden tf.keras.layers.Layer
. Ayrıntılar için Alt sınıflandırma yoluyla yeni Katmanlar ve Modeller Oluşturma kılavuzuna bakın.
# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):
def __init__(self, *args, **kwargs):
super(CustomLayer, self).__init__(*args, **kwargs)
def build(self, input_shape):
self.w = self.add_weight(
shape=input_shape[1:],
dtype=tf.float32,
initializer=tf.keras.initializers.ones(),
regularizer=tf.keras.regularizers.l2(0.02),
trainable=True)
# Call method will sometimes get used in graph mode,
# training will get turned into a tensor
@tf.function
def call(self, inputs, training=None):
if training:
return inputs + self.w
else:
return inputs + self.w * 0.5
custom_layer = CustomLayer()
print(custom_layer([1]).numpy())
print(custom_layer([1], training=True).numpy())
[1.5] [2.]
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
# Build the model including the custom layer
model = tf.keras.Sequential([
CustomLayer(input_shape=(28, 28, 1)),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
])
train_out = model(train_data, training=True)
test_out = model(test_data, training=False)
Dikkat edilmesi gereken bazı noktalar:
Alt sınıflı Keras modellerinin ve katmanlarının hem v1 grafiklerinde (otomatik kontrol bağımlılıkları yok) hem de istekli modda çalışması gerekir:
- İmza ve otomatik kontrol bağımlılıklarını almak için
call
birtf.function
sarın.
- İmza ve otomatik kontrol bağımlılıklarını almak için
Aşağıdakileri
call
için birtraining
argümanını kabul etmeyi unutmayın:- Bazen bir
tf.Tensor
- Bazen bir Python mantıksaldır
- Bazen bir
Model.build
veyaModel.build
kullanarak model değişkenleri oluşturun:-
Model.build
giriş şekline erişebilirsiniz, böylece eşleşen şekle sahip ağırlıklar oluşturabilirsiniz -
tf.keras.layers.Layer.add_weight
kullanılması,tf.keras.layers.Layer.add_weight
değişkenleri ve düzenleme kayıplarını izlemesine olanak tanır
-
tf.Tensors
nesnelerinizdetf.Tensors
:- Ya bir
tf.function
ya da istekli bir bağlamda yaratılmış olabilirler ve bu tensörler farklı şekilde davranırlar. -
tf.Variable
kullanın.tf.Variable
durum için, her zaman her iki bağlamda da kullanılabilirler. -
tf.Tensors
yalnızca ara değerler içindir
- Ya bir
Slim ve Contrib.layers hakkında bir not
Büyük TensorFlow 1.x kod büyük bir miktarı kullanan ince olarak TensorFlow 1.x ile birlikte verilen kütüphane, tf.contrib.layers
. Bir itibariyle contrib
modülü, bu bile, TensorFlow 2.x artık mevcut değil tf.compat.v1
. Slim'i kullanarak kodu TensorFlow 2.x'e dönüştürmek, v1.layers
. v1.layers
kullanan depoları dönüştürmekten daha v1.layers
. Aslında, Slim kodunuzu önce v1.layers
. v1.layers
, ardından v1.layers
dönüştürmek mantıklı olabilir.
-
arg_scopes
kaldırın, tümarg_scopes
açık olması gerekir. - Bunları kullanırsanız,
normalizer_fn
veactivation_fn
kendi katmanlarına bölün. - Ayrılabilir dönüşüm katmanları, bir veya daha fazla farklı Keras katmanıyla (derinlemesine, noktasal ve ayrılabilir Keras katmanları) eşlenir.
- Slim ve
v1.layers
farklı bağımsız değişken adlarına ve varsayılan değerlere sahiptir. - Bazı bağımsız değişkenlerin farklı ölçekleri vardır.
- Eğer İnce modelleri eğitimli önceden kullanıyorsanız, gelen keras öncesi traimed modellerini denemek
tf.keras.applications
veya TF Hub orijinal İnce kodundan ihraç 'ın TensorFlow 2.x SavedModels.
Bazı tf.contrib
katmanları çekirdek TensorFlow'a taşınmamış olabilir, bunun yerine TensorFlow Eklentileri paketine taşınmış olabilir.
Eğitim
Bir tf.keras
modeline veri beslemenin birçok yolu vardır. Python üreteçlerini ve Numpy dizilerini girdi olarak kabul edecekler.
Verileri bir modele beslemenin önerilen yolu, verileri işlemek için yüksek performans sınıflarının bir koleksiyonunu içeren tf.data
paketini kullanmaktır.
Hala tf.queue
kullanıyorsanız, bunlar artık yalnızca veri yapıları olarak destekleniyor, giriş ardışık tf.queue
olarak desteklenmiyor.
TensorFlow Veri Kümelerini Kullanma
TensorFlow Veri Kümeleri paketi ( tfds
), önceden tanımlanmış veri kümelerinitf.data.Dataset
nesneleri olaraktf.data.Dataset
için yardımcı programlar içerir.
Bu örnek için, MNIST veri kümesini tfds
kullanarak tfds
:
datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1... WARNING:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your local data directory. If you'd instead prefer to read directly from our public GCS bucket (recommended if you're running on GCP), you can instead pass `try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`. Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.
Ardından verileri eğitim için hazırlayın:
- Her görüntüyü yeniden ölçeklendirin.
- Örneklerin sırasını karıştırın.
- Resim ve etiket yığınlarını toplayın.
BUFFER_SIZE = 10 # Use a much larger value for real code
BATCH_SIZE = 64
NUM_EPOCHS = 5
def scale(image, label):
image = tf.cast(image, tf.float32)
image /= 255
return image, label
Örneği kısa tutmak için, veri kümesini yalnızca 5 grup döndürecek şekilde kırpın:
train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
test_data = mnist_test.map(scale).batch(BATCH_SIZE)
STEPS_PER_EPOCH = 5
train_data = train_data.take(STEPS_PER_EPOCH)
test_data = test_data.take(STEPS_PER_EPOCH)
image_batch, label_batch = next(iter(train_data))
Keras eğitim döngülerini kullanın
Eğitim sürecinizde düşük düzeyli kontrole ihtiyacınız yoksa, Keras'ın yerleşik fit
, evaluate
ve predict
yöntemlerini kullanmanız önerilir. Bu yöntemler, uygulamadan (sıralı, işlevsel veya alt sınıflara ayrılmış) bağımsız olarak modeli eğitmek için tek tip bir arayüz sağlar.
Bu yöntemlerin avantajları şunları içerir:
- Numpy dizilerini, Python jeneratörlerini ve tf.data.Datasets'i kabul
tf.data.Datasets
. - Düzenlileştirme ve aktivasyon kayıplarını otomatik olarak uygularlar.
- Çok cihazlı eğitim için
tf.distribute
desteklerler. - Kayıplar ve ölçümler olarak keyfi çağrılabilirleri desteklerler.
-
tf.keras.callbacks.TensorBoard
gibi geri aramaları ve özel geri aramaları desteklerler. - TensorFlow grafiklerini kullanarak otomatik olarak performans gösterirler.
Aşağıda, bir Dataset
kullanarak bir modeli eğitmenin bir örneği verilmiştir. (Bunun nasıl çalıştığına dair ayrıntılar için eğitimler bölümüne bakın.)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.02),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
# Model is the full model w/o custom layers
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)
print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5 5/5 [==============================] - 1s 9ms/step - loss: 2.0191 - accuracy: 0.3608 Epoch 2/5 5/5 [==============================] - 0s 9ms/step - loss: 0.4736 - accuracy: 0.9059 Epoch 3/5 5/5 [==============================] - 0s 8ms/step - loss: 0.2973 - accuracy: 0.9626 Epoch 4/5 5/5 [==============================] - 0s 9ms/step - loss: 0.2108 - accuracy: 0.9911 Epoch 5/5 5/5 [==============================] - 0s 8ms/step - loss: 0.1791 - accuracy: 0.9874 5/5 [==============================] - 0s 6ms/step - loss: 1.5504 - accuracy: 0.7500 Loss 1.5504140853881836, Accuracy 0.75
Kendi döngünüzü yazın
Keras modelinin eğitim adımı sizin için çalışıyorsa, ancak bu adımın dışında daha fazla kontrole ihtiyacınız varsa, kendi veri yineleme tf.keras.Model.train_on_batch
yöntemini kullanmayı düşünün.
Unutmayın: Birçok şey tf.keras.callbacks.Callback
olarak uygulanabilir.
Bu yöntem, önceki bölümde bahsedilen yöntemlerin birçok avantajına sahiptir, ancak kullanıcıya dış döngünün kontrolünü verir.
Eğitim sırasında performansı kontrol etmek için tf.keras.Model.test_on_batch
veya tf.keras.Model.evaluate
da kullanabilirsiniz.
Yukarıdaki modeli eğitmeye devam etmek için:
# Model is the full model w/o custom layers
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
for epoch in range(NUM_EPOCHS):
# Reset the metric accumulators
model.reset_metrics()
for image_batch, label_batch in train_data:
result = model.train_on_batch(image_batch, label_batch)
metrics_names = model.metrics_names
print("train: ",
"{}: {:.3f}".format(metrics_names[0], result[0]),
"{}: {:.3f}".format(metrics_names[1], result[1]))
for image_batch, label_batch in test_data:
result = model.test_on_batch(image_batch, label_batch,
# Return accumulated metrics
reset_metrics=False)
metrics_names = model.metrics_names
print("\neval: ",
"{}: {:.3f}".format(metrics_names[0], result[0]),
"{}: {:.3f}".format(metrics_names[1], result[1]))
train: loss: 0.138 accuracy: 1.000 train: loss: 0.161 accuracy: 1.000 train: loss: 0.159 accuracy: 0.969 train: loss: 0.241 accuracy: 0.953 train: loss: 0.172 accuracy: 0.969 eval: loss: 1.550 accuracy: 0.800 train: loss: 0.086 accuracy: 1.000 train: loss: 0.094 accuracy: 1.000 train: loss: 0.090 accuracy: 1.000 train: loss: 0.119 accuracy: 0.984 train: loss: 0.099 accuracy: 1.000 eval: loss: 1.558 accuracy: 0.841 train: loss: 0.076 accuracy: 1.000 train: loss: 0.068 accuracy: 1.000 train: loss: 0.061 accuracy: 1.000 train: loss: 0.076 accuracy: 1.000 train: loss: 0.076 accuracy: 1.000 eval: loss: 1.536 accuracy: 0.841 train: loss: 0.059 accuracy: 1.000 train: loss: 0.056 accuracy: 1.000 train: loss: 0.058 accuracy: 1.000 train: loss: 0.054 accuracy: 1.000 train: loss: 0.055 accuracy: 1.000 eval: loss: 1.497 accuracy: 0.863 train: loss: 0.053 accuracy: 1.000 train: loss: 0.049 accuracy: 1.000 train: loss: 0.044 accuracy: 1.000 train: loss: 0.049 accuracy: 1.000 train: loss: 0.045 accuracy: 1.000 eval: loss: 1.463 accuracy: 0.878
Eğitim adımını özelleştirin
Daha fazla esnekliğe ve kontrole ihtiyacınız varsa, kendi eğitim döngünüzü uygulayarak buna sahip olabilirsiniz. Üç adım vardır:
- Bir Python oluşturucuyu veya
tf.data.Dataset
toplu örnekler elde edin. tf.GradientTape
toplamak içintf.GradientTape
kullanın.- Modelin değişkenlerine ağırlık güncellemelerini uygulamak için
tf.keras.optimizers
birini kullanın.
Hatırlamak:
- Alt sınıflandırılmış katmanların ve modellerin
call
yöntemine her zaman birtraining
argümanı ekleyin. - Modeli,
training
bağımsız değişkeni doğru ayarlanmış olarak çağırdığınızdan emin olun. - Kullanıma bağlı olarak, model değişkenleri, model bir veri yığını üzerinde çalıştırılıncaya kadar mevcut olmayabilir.
- Model için düzenlilik kayıpları gibi şeyleri manuel olarak halletmeniz gerekir.
V1'e göre basitleştirmelere dikkat edin:
- Değişken başlatıcıları çalıştırmaya gerek yoktur. Değişkenler yaratılırken başlatılır.
- Manuel kontrol bağımlılıkları eklemeye gerek yoktur.
tf.function
bile, istekli modda olduğu gibi işlev görür.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.02),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
@tf.function
def train_step(inputs, labels):
with tf.GradientTape() as tape:
predictions = model(inputs, training=True)
regularization_loss=tf.math.add_n(model.losses)
pred_loss=loss_fn(labels, predictions)
total_loss=pred_loss + regularization_loss
gradients = tape.gradient(total_loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
for epoch in range(NUM_EPOCHS):
for inputs, labels in train_data:
train_step(inputs, labels)
print("Finished epoch", epoch)
Finished epoch 0 Finished epoch 1 Finished epoch 2 Finished epoch 3 Finished epoch 4
Yeni tarz ölçümler ve kayıplar
TensorFlow 2.x'te metrikler ve kayıplar nesnelerdir. Bunlar hem hevesle hem de tf.function
.
Bir kayıp nesnesi çağrılabilir ve (y_true, y_pred) 'i argüman olarak bekler:
cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815
Bir metrik nesne aşağıdaki yöntemlere sahiptir:
-
Metric.update_state()
: yeni gözlemler ekleyin. -
Metric.result()
: Gözlenen değerler verildiğinde metriğin mevcut sonucunu alın. -
Metric.reset_states()
: tüm gözlemleri temizle.
Nesnenin kendisi çağrılabilir. Çağrı, durumu update_state
ile olduğu gibi yeni gözlemlerle günceller ve metriğin yeni sonucunu döndürür.
Bir metriğin değişkenlerini manuel olarak başlatmak zorunda değilsiniz ve TensorFlow 2.x otomatik kontrol bağımlılıklarına sahip olduğundan, bunlar için de endişelenmenize gerek yok.
Aşağıdaki kod, özel bir eğitim döngüsü içinde gözlemlenen ortalama kaybı takip etmek için bir metrik kullanır.
# Create the metrics
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
@tf.function
def train_step(inputs, labels):
with tf.GradientTape() as tape:
predictions = model(inputs, training=True)
regularization_loss=tf.math.add_n(model.losses)
pred_loss=loss_fn(labels, predictions)
total_loss=pred_loss + regularization_loss
gradients = tape.gradient(total_loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
# Update the metrics
loss_metric.update_state(total_loss)
accuracy_metric.update_state(labels, predictions)
for epoch in range(NUM_EPOCHS):
# Reset the metrics
loss_metric.reset_states()
accuracy_metric.reset_states()
for inputs, labels in train_data:
train_step(inputs, labels)
# Get the metric results
mean_loss=loss_metric.result()
mean_accuracy = accuracy_metric.result()
print('Epoch: ', epoch)
print(' loss: {:.3f}'.format(mean_loss))
print(' accuracy: {:.3f}'.format(mean_accuracy))
Epoch: 0 loss: 0.139 accuracy: 0.997 Epoch: 1 loss: 0.116 accuracy: 1.000 Epoch: 2 loss: 0.105 accuracy: 0.997 Epoch: 3 loss: 0.089 accuracy: 1.000 Epoch: 4 loss: 0.078 accuracy: 1.000
Keras metrik adları
TensorFlow 2.x'te, Keras modelleri metrik adlarını işleme konusunda daha tutarlıdır.
Şimdi, metrikler listesinde bir dize ilettiğinizde, bu tam dize, metriğin name
olarak kullanılır. Bu adlar model.fit
tarafından döndürülen geçmiş nesnesinde ve keras.callbacks
iletilen günlüklerde keras.callbacks
. metrik listesinde geçirdiğiniz dizeye ayarlanır.
model.compile(
optimizer = tf.keras.optimizers.Adam(0.001),
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics = ['acc', 'accuracy', tf.keras.metrics.SparseCategoricalAccuracy(name="my_accuracy")])
history = model.fit(train_data)
5/5 [==============================] - 1s 8ms/step - loss: 0.0901 - acc: 0.9923 - accuracy: 0.9923 - my_accuracy: 0.9923
history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])
Bu, metrics=["accuracy"]
dict_keys(['loss', 'acc'])
sonuçlandığı önceki sürümlerden farklıdır.
Keras iyileştiricileri
v1.train.AdamOptimizer
ve v1.train.GradientDescentOptimizer
gibi v1.train.AdamOptimizer
optimize v1.train
, v1.train.GradientDescentOptimizer
eşdeğerlere tf.keras.optimizers
.
v1.train
keras.optimizers
dönüştürün
Optimize edicilerinizi dönüştürürken aklınızda bulundurmanız gereken noktalar şunlardır:
- Optimize edicilerinizi yükseltmek, eski kontrol noktalarını uyumsuz hale getirebilir .
- Tüm epsilonlar şimdi varsayılan
1e-7
yerine1e-8
(çoğu kullanım durumları ihmal edilebilir düzeydedir). -
v1.train.GradientDescentOptimizer
şirketinden ile ikame edilmiş olabilirtf.keras.optimizers.SGD
. -
v1.train.MomentumOptimizer
, momentum argümanı kullanılarak doğrudanSGD
iyileştirici ile değiştirilebilir:tf.keras.optimizers.SGD(..., momentum=...)
. -
v1.train.AdamOptimizer
kullanmak dönüştürülebilirtf.keras.optimizers.Adam
.beta1
vebeta2
bağımsız değişkenleribeta_1
vebeta_2
olarak yeniden adlandırıldı. -
v1.train.RMSPropOptimizer
dönüştürülebilirtf.keras.optimizers.RMSprop
.decay
argümanı,rho
olarak yeniden adlandırıldı. -
v1.train.AdadeltaOptimizer
doğrudantf.keras.optimizers.Adadelta
dönüştürülebilir. -
tf.train.AdagradOptimizer
doğrudantf.keras.optimizers.Adagrad
dönüştürülebilir. -
tf.train.FtrlOptimizer
doğrudantf.keras.optimizers.Ftrl
dönüştürülebilir.accum_name
velinear_name
bağımsız değişkenleri kaldırıldı. -
tf.contrib.AdamaxOptimizer
vetf.contrib.NadamOptimizer
doğrudan sırasıylatf.keras.optimizers.Adamax
vetf.keras.optimizers.Nadam
dönüştürülebilir.beta1
vebeta2
bağımsız değişkenleribeta_1
vebeta_2
olarak yeniden adlandırıldı.
Bazı tf.keras.optimizers
için yeni varsayılanlar
optimizers.SGD
, optimizers.Adam
veya optimizers.RMSprop
için herhangi bir değişiklik yoktur.
Aşağıdaki varsayılan öğrenme oranları değişti:
-
optimizers.Adagrad
. 0,01 ile 0,001 arasında adagrad -
optimizers.Adadelta
1.0'dan 0.001'e -
optimizers.Adamax
ediciler. 0,002 ile 0,001 arasında Adamax -
optimizers.Nadam
0,002 ile 0,001 arasında
TensorBoard
TensorFlow 2.x, tf.summary
görselleştirme için özet verileri yazmak için kullanılan tf.summary
API'sinde önemli değişiklikler içerir. Yeni tf.summary
genel bir giriş için, TensorFlow 2.x API'sini kullanan birkaç öğretici bulunmaktadır . Bu, bir TensorBoard TensorFlow 2.x geçiş kılavuzunu içerir .
Kaydetme ve yükleme
Denetim noktası uyumluluğu
TensorFlow 2.x, nesne tabanlı denetim noktaları kullanır.
Dikkatli olursanız, eski tarz isme dayalı kontrol noktaları yine de yüklenebilir. Kod dönüştürme işlemi, değişken adı değişikliklerine neden olabilir, ancak geçici çözümler vardır.
En basit yaklaşım, yeni modelin adlarını kontrol noktasındaki adlarla aynı hizaya getirmektir:
- Değişkenlerin hepsinde yine de ayarlayabileceğiniz bir
name
bağımsız değişkeni 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 isimleri etkiler ve değişkenleri ve yeniden kullanımı izlemez.
Bu sizin kullanım durumunuz için işe yaramazsa, v1.train.init_from_checkpoint
işlevini deneyin. Eski adlardan yeni adlara eşlemeyi belirten bir assignment_map
argümanı alır.
TensorFlow Estimator deposu , önceden hazırlanmış tahmin ediciler için kontrol noktalarını TensorFlow 1.x'ten 2.0'a yükseltmek için bir dönüştürme aracı içerir. Benzer bir kullanım durumu için bir aracın nasıl oluşturulacağına bir örnek olarak hizmet edebilir.
Kaydedilen model uyumluluğu
Kaydedilen modeller için önemli uyumluluk endişeleri yoktur.
- TensorFlow 1.x kaydedilen modeller TensorFlow 2.x'te çalışır.
- TensorFlow 2.x Saved_models, tüm işlemler destekleniyorsa TensorFlow 1.x'te çalışır.
Bir Graph.pb veya Graph.pbtxt
Ham bir Graph.pb
dosyasını TensorFlow Graph.pb
yükseltmenin kolay bir yolu yoktur. En iyi bahsiniz, dosyayı oluşturan kodu yükseltmektir.
Eğer bir "donmuş grafiği" (a varsa Ama tf.Graph
değişkenler sabitler haline getirilmiştir), o zaman bu dönüştürmek mümkündür concrete_function
kullanarak v1.wrap_function
:
def wrap_frozen_graph(graph_def, inputs, outputs):
def _imports_graph_def():
tf.compat.v1.import_graph_def(graph_def, name="")
wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])
import_graph = wrapped_import.graph
return wrapped_import.prune(
tf.nest.map_structure(import_graph.as_graph_element, inputs),
tf.nest.map_structure(import_graph.as_graph_element, outputs))
Örneğin, 2016'dan itibaren Inception v1 için donmuş bir grafik aşağıda verilmiştir:
path = tf.keras.utils.get_file(
'inception_v1_2016_08_28_frozen.pb',
'http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz',
untar=True)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz 24698880/24695710 [==============================] - 1s 0us/step
tf.GraphDef
yükleyin:
graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())
concrete_function
bir işlevin içine sarın:
inception_func = wrap_frozen_graph(
graph_def, inputs='input:0',
outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')
Girdi olarak bir tensör geçirin:
input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
TensorShape([1, 28, 28, 96])
Tahminciler
Tahmincilerle Eğitim
Tahmin ediciler TensorFlow 2.x'te desteklenmektedir.
Tahmin edicileri kullandığınızda, tf.estimator.TrainSpec
input_fn
, tf.estimator.TrainSpec
ve tf.estimator.EvalSpec
kullanabilirsiniz.
Burada, input_fn
trenle kullanan bir örnek ve özellikleri değerlendir.
İnput_fn ve eğitme / değerlendirme özelliklerini oluşturma
# Define the estimator's input_fn
def input_fn():
datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
BUFFER_SIZE = 10000
BATCH_SIZE = 64
def scale(image, label):
image = tf.cast(image, tf.float32)
image /= 255
return image, label[..., tf.newaxis]
train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
return train_data.repeat()
# Define train and eval specs
train_spec = tf.estimator.TrainSpec(input_fn=input_fn,
max_steps=STEPS_PER_EPOCH * NUM_EPOCHS)
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn,
steps=STEPS_PER_EPOCH)
Keras model tanımı kullanma
TensorFlow 2.x'te tahmin edicilerinizi nasıl oluşturacağınız konusunda bazı farklılıklar vardır.
Modelinizi tf.keras.estimator.model_to_estimator
kullanarak tanımlamanız, ardından modelinizi bir tahminciye dönüştürmek için tf.keras.estimator.model_to_estimator
yardımcı programını kullanmanız tf.keras.estimator.model_to_estimator
. Aşağıdaki kod, bir tahminci oluştururken ve eğitirken bu yardımcı programın nasıl kullanılacağını gösterir.
def make_model():
return tf.keras.Sequential([
tf.keras.layers.Conv2D(32, 3, activation='relu',
kernel_regularizer=tf.keras.regularizers.l2(0.02),
input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(10)
])
model = make_model()
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
estimator = tf.keras.estimator.model_to_estimator(
keras_model = model
)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2 INFO:tensorflow:Using the Keras model provided. INFO:tensorflow:Using the Keras model provided. /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/backend.py:434: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model. warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and ' INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_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:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_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:Not using Distribute Coordinator. INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: 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. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: 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:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp0erq3im2/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={}) INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp0erq3im2/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={}) INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/keras/keras_model.ckpt INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/keras/keras_model.ckpt INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES. INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES. INFO:tensorflow:Warm-started 8 variables. INFO:tensorflow:Warm-started 8 variables. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 2.4717796, step = 0 INFO:tensorflow:loss = 2.4717796, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:2325: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically. warnings.warn('`Model.state_updates` will be removed in a future version. ' INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Inference Time : 0.86556s INFO:tensorflow:Inference Time : 0.86556s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.37597787. INFO:tensorflow:Loss for final step: 0.37597787. ({'accuracy': 0.6, 'loss': 1.6160676, 'global_step': 25}, [])
Özel bir model_fn
kullanma
model_fn
yapmanız gereken mevcut bir özel tahmin model_fn
varsa, model_fn
bir model_fn
modeli kullanmak için dönüştürebilirsiniz.
Bununla birlikte, uyumluluk nedenlerinden ötürü, özel bir model_fn
, 1.x stili grafik modunda çalışmaya devam edecektir. Bu, istekli bir yürütme olmadığı ve otomatik kontrol bağımlılıkları olmadığı anlamına gelir.
Minimum değişiklikle özel model_fn
Özel model_fn
çalışmasını sağlamak için, mevcut kodda minimum değişiklikleri tercih tf.compat.v1
, optimizers
tf.compat.v1
ve metrics
gibi tf.compat.v1
sembolleri kullanılabilir.
Özel model_fn
bir model_fn
modeli kullanmak, onu özel bir eğitim döngüsünde kullanmaya benzer:
-
mode
argümanına göretraining
aşamasını uygun şekilde ayarlayın. - Modelin
trainable_variables
optimizetrainable_variables
açıkçatrainable_variables
.
Ancak özel bir döngüye göre önemli farklılıklar vardır:
-
Model.losses
kullanmak yerine,Model.losses
kullanarak kayıplarıModel.get_losses_for
. -
Model.get_updates_for
kullanarak modelin güncellemeleriniModel.get_updates_for
.
Aşağıdaki kod, tüm bu endişeleri gösteren özel bir model_fn
bir tahminci oluşturur.
def my_model_fn(features, labels, mode):
model = make_model()
optimizer = tf.compat.v1.train.AdamOptimizer()
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
training = (mode == tf.estimator.ModeKeys.TRAIN)
predictions = model(features, training=training)
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
total_loss=loss_fn(labels, predictions) + tf.math.add_n(reg_losses)
accuracy = tf.compat.v1.metrics.accuracy(labels=labels,
predictions=tf.math.argmax(predictions, axis=1),
name='acc_op')
update_ops = model.get_updates_for(None) + model.get_updates_for(features)
minimize_op = optimizer.minimize(
total_loss,
var_list=model.trainable_variables,
global_step=tf.compat.v1.train.get_or_create_global_step())
train_op = tf.group(minimize_op, update_ops)
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predictions,
loss=total_loss,
train_op=train_op, eval_metric_ops={'accuracy': accuracy})
# Create the Estimator & Train
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_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:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_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:Not using Distribute Coordinator. INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 3.0136237, step = 0 INFO:tensorflow:loss = 3.0136237, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Inference Time : 0.97406s INFO:tensorflow:Inference Time : 0.97406s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872 INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.35726172. INFO:tensorflow:Loss for final step: 0.35726172. ({'accuracy': 0.59375, 'loss': 1.6248872, 'global_step': 25}, [])
TensorFlow 2.x sembolleriyle özel model_fn
Tüm TensorFlow 1.x sembollerinden kurtulmak ve özel model_fn
yükseltmek istiyorsanız, optimize tf.keras.optimizers
ve metrikleri tf.keras.optimizers
ve tf.keras.metrics
güncellemeniz gerekir.
Özel model_fn
, yukarıdaki değişikliklerin yanı sıra, daha fazla yükseltmenin yapılması gerekir:
- Kullanım
tf.keras.optimizers
yerinev1.train.Optimizer
. - Açıkça modelin geçmesi
trainable_variables
içintf.keras.optimizers
. -
train_op/minimize_op
hesaplamak için,- Kayıp, skaler kayıp
Tensor
(çağrılabilir değilse)Optimizer.get_updates
kullanın. Döndürülen listedeki ilk öğe istenentrain_op/minimize_op
. - Kayıp bir çağrılabilirse (bir işlev gibi),
train_op/minimize_op
almak içinOptimizer.minimize
kullanın.
- Kayıp, skaler kayıp
- Kullanım
tf.keras.metrics
yerinetf.compat.v1.metrics
değerlendirilmesi için.
Yukarıdaki my_model_fn
örneği için, TensorFlow 2.x sembolleriyle taşınan kod şu şekilde gösterilir:
def my_model_fn(features, labels, mode):
model = make_model()
training = (mode == tf.estimator.ModeKeys.TRAIN)
loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
predictions = model(features, training=training)
# Get both the unconditional losses (the None part)
# and the input-conditional losses (the features part).
reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)
# Upgrade to tf.keras.metrics.
accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
accuracy = accuracy_obj.update_state(
y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))
train_op = None
if training:
# Upgrade to tf.keras.optimizers.
optimizer = tf.keras.optimizers.Adam()
# Manually assign tf.compat.v1.global_step variable to optimizer.iterations
# to make tf.compat.v1.train.global_step increased correctly.
# This assignment is a must for any `tf.train.SessionRunHook` specified in
# estimator, as SessionRunHooks rely on global step.
optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
# Get both the unconditional updates (the None part)
# and the input-conditional updates (the features part).
update_ops = model.get_updates_for(None) + model.get_updates_for(features)
# Compute the minimize_op.
minimize_op = optimizer.get_updates(
total_loss,
model.trainable_variables)[0]
train_op = tf.group(minimize_op, *update_ops)
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predictions,
loss=total_loss,
train_op=train_op,
eval_metric_ops={'Accuracy': accuracy_obj})
# Create the Estimator and train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6 INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_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:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_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:Not using Distribute Coordinator. INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 2.5293791, step = 0 INFO:tensorflow:loss = 2.5293791, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25... INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [1/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [2/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [3/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [4/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Evaluation [5/5] INFO:tensorflow:Inference Time : 0.86534s INFO:tensorflow:Inference Time : 0.86534s INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25 INFO:tensorflow:Loss for final step: 0.47094986. INFO:tensorflow:Loss for final step: 0.47094986. ({'Accuracy': 0.59375, 'loss': 1.7570661, 'global_step': 25}, [])
Premade Tahmin Ediciler
tf.estimator.DNN*
, tf.estimator.Linear*
ve tf.estimator.DNNLinearCombined*
ailesindeki tf.estimator.DNN*
Estimators , TensorFlow 2.x API'sinde hala desteklenmektedir. Ancak bazı argümanlar değişti:
-
input_layer_partitioner
:input_layer_partitioner
kaldırılmıştır. -
loss_reduction
:tf.keras.losses.Reduction
yerinetf.compat.v1.losses.Reduction
olaraktf.compat.v1.losses.Reduction
. Varsayılan değeri detf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE
olaraktf.compat.v1.losses.Reduction.SUM
. -
optimizer
,dnn_optimizer
velinear_optimizer
: bu argüman olarak güncellenditf.keras.optimizers
yerinetf.compat.v1.train.Optimizer
.
Yukarıdaki değişiklikleri taşımak için:
- Taşıma yok için gerekli olan
input_layer_partitioner
beriDistribution Strategy
TensorFlow 2.x otomatik olarak idare edecek - İçin
loss_reduction
, kontroltf.keras.losses.Reduction
desteklenen seçenekleri için. -
optimizer
argümanlar için:-
dnn_optimizer
yapmazsanız: 1)optimizer
,dnn_optimizer
veyalinear_optimizer
argümanınılinear_optimizer
veya 2)optimizer
argümanını kodunuzda birstring
olarak belirtmezseniz, o zamantf.keras.optimizers
varsayılan olarak kullanıldığından hiçbir şeyi değiştirmenize gerek yoktur . - Aksi takdirde,
tf.compat.v1.train.Optimizer
ilgilitf.keras.optimizers
güncellemeniz gerekir.
-
Kontrol Noktası Dönüştürücü
İçin göç keras.optimizers
olarak kontrol noktaları kıracak, TensorFlow 1.x kullanılarak kaydedilen tf.keras.optimizers
değişkenlerin farklı bir dizi kontrol noktaları kaydedilmesine üretir. TensorFlow 2.x'e geçişinizden sonra eski denetim noktasını yeniden kullanılabilir hale getirmek için denetim noktası dönüştürücü aracını deneyin.
curl -O https://raw.githubusercontent.com/tensorflow/estimator/master/tensorflow_estimator/python/estimator/tools/checkpoint_converter.py
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 15165 100 15165 0 0 40656 0 --:--:-- --:--:-- --:--:-- 40656
Aracın yerleşik yardımı vardır:
python checkpoint_converter.py -h
2021-01-06 02:31:26.297951: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 usage: checkpoint_converter.py [-h] {dnn,linear,combined} source_checkpoint source_graph target_checkpoint positional arguments: {dnn,linear,combined} The type of estimator to be converted. So far, the checkpoint converter only supports Canned Estimator. So the allowed types include linear, dnn and combined. source_checkpoint Path to source checkpoint file to be read in. source_graph Path to source graph file to be read in. target_checkpoint Path to checkpoint file to be written out. optional arguments: -h, --help show this help message and exit
TensorShape
Bu sınıf, tf.compat.v1.Dimension
nesneleri yerine int
s'yi tutacak şekilde basitleştirildi. Dolayısıyla, bir int
elde etmek için .value
çağrısına gerek yoktur.
Tek tek tf.compat.v1.Dimension
nesnelerine hala tf.TensorShape.dims
erişilebilir.
Aşağıda TensorFlow 1.x ve TensorFlow 2.x arasındaki farklar gösterilmektedir.
# Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
TensorShape([16, None, 256])
TensorFlow 1.x'te buna sahipseniz:
value = shape[i].value
Sonra bunu TensorFlow 2.x'te yapın:
value = shape[i]
value
16
TensorFlow 1.x'te buna sahipseniz:
for dim in shape:
value = dim.value
print(value)
Sonra bunu TensorFlow 2.x'te yapın:
for value in shape:
print(value)
16 None 256
TensorFlow 1.x'te buna sahipseniz (veya başka bir boyut yöntemini kullandıysanız):
dim = shape[i]
dim.assert_is_compatible_with(other_dim)
Sonra bunu TensorFlow 2.x'te yapın:
other_dim = 16
Dimension = tf.compat.v1.Dimension
if shape.rank is None:
dim = Dimension(None)
else:
dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
True
shape = tf.TensorShape(None)
if shape:
dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
Bir tf.TensorShape
boole değeri, rank biliniyorsa True
, aksi takdirde False
.
print(bool(tf.TensorShape([]))) # Scalar
print(bool(tf.TensorShape([0]))) # 0-length vector
print(bool(tf.TensorShape([1]))) # 1-length vector
print(bool(tf.TensorShape([None]))) # Unknown-length vector
print(bool(tf.TensorShape([1, 10, 100]))) # 3D tensor
print(bool(tf.TensorShape([None, None, None]))) # 3D tensor with no known dimensions
print()
print(bool(tf.TensorShape(None))) # A tensor with unknown rank.
True True True True True True False
Diğer değişiklikler
tf.colocate_with
öğesini kaldırın: TensorFlow'un cihaz yerleştirme algoritmaları önemli ölçüde iyileştirildi. Bu artık gerekli olmamalı. Kaldırmak performans düşüşüne neden oluyorsa, lütfen bir hata bildirin.v1.ConfigProto
kullanımınıv1.ConfigProto
eşdeğer işlevlerletf.config
.
Sonuçlar
Genel süreç şu şekildedir:
- Yükseltme komut dosyasını çalıştırın.
- Katkı simgelerini kaldırın.
- Modellerinizi nesne yönelimli bir stile (Keras) geçirin.
-
tf.keras
veyatf.estimator
eğitim ve değerlendirme döngülerini kullanın. - Aksi takdirde, özel döngüler kullanın, ancak oturumlardan ve koleksiyonlardan kaçındığınızdan emin olun.
Kodu deyimsel TensorFlow 2.x'e dönüştürmek biraz çalışma gerektirir, ancak her değişiklik şunlarla sonuçlanır:
- Daha az kod satırı.
- Artan netlik ve basitlik.
- Daha kolay hata ayıklama.