Bir sorunuz mu var? TensorFlow Forum Ziyaret Forumunda toplulukla bağlantı kurun

TensorFlow 1 kodunuzu TensorFlow 2'ye taşıyın

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin

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:

TensorFlow 2.x'de 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, halletmeniz gereken genel davranış değişiklikleri vardır. Önemli değişiklikler şunlardır:

  • v1.enable_eager_execution() çalıştırma, v1.enable_eager_execution() : Örtük olarak tf.Graph kullanan herhangi bir kod. tf.Graph başarısız olacaktır. Bu kodu with tf.Graph().as_default() bağlamıyla with 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ına use_resource=False devre dışı bırakılabilir.
  • Tensor şekilleri, v1.enable_v2_tensorshape() : TensorFlow 2.x, tensör şekillerinin davranışını basitleştirir. Yerine t.shape[0].value diyebilirsiniz t.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 ve v1.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.

Dikkat:

  • v1.Session.run farklı v1.Session.run , bir tf.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: Bir tf.function , yazılan sırayla çalıştırılmış gibi davranır. Örneğin, tf.Variable atamalar ve tf.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 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

Ç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:

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 bir tf.function sarın.
  • Aşağıdakileri call için bir training argümanını kabul etmeyi unutmayın:

    • Bazen bir tf.Tensor
    • Bazen bir Python mantıksaldır
  • Model.build veya Model.build kullanarak model değişkenleri oluşturun:

  • tf.Tensors nesnelerinizde tf.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

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üm arg_scopes açık olması gerekir.
  • Bunları kullanırsanız, normalizer_fn ve activation_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:

  1. Bir Python oluşturucuyu veyatf.data.Dataset toplu örnekler elde edin.
  2. tf.GradientTape toplamak içintf.GradientTape kullanın.
  3. 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 bir training 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şlatmanız gerekmez ve TensorFlow 2.x otomatik kontrol bağımlılıklarına sahip olduğundan, bunlar için de endişelenmenize gerek yoktur.

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:

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:

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 kullanacak şekilde 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öre training aşamasını uygun şekilde ayarlayın.
  • Modelin trainable_variables optimize trainable_variables açıkça trainable_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üncellemelerini Model.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 olarak güncellemeniz gerekir.

Özel model_fn , yukarıdaki değişikliklerin yanı sıra, daha fazla yükseltmenin yapılması gerekir:

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:

  1. input_layer_partitioner : input_layer_partitioner kaldırılmıştır.
  2. loss_reduction : tf.keras.losses.Reduction yerine tf.compat.v1.losses.Reduction olarak tf.compat.v1.losses.Reduction . Varsayılan değeri de tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE olarak tf.compat.v1.losses.Reduction.SUM .
  3. optimizer , dnn_optimizer ve linear_optimizer : bu argüman olarak güncellendi tf.keras.optimizers yerine tf.compat.v1.train.Optimizer .

Yukarıdaki değişiklikleri taşımak için:

  1. Taşıma yok için gerekli olan input_layer_partitioner beri Distribution Strategy TensorFlow 2.x otomatik olarak idare edecek
  2. İçin loss_reduction , kontrol tf.keras.losses.Reduction desteklenen seçenekleri için.
  3. optimizer argümanlar için:
    • dnn_optimizer yapmazsanız: 1) optimizer , dnn_optimizer veya linear_optimizer argümanını linear_optimizer veya 2) optimizer argümanını kodunuzda bir string olarak belirtmezseniz, o zaman tf.keras.optimizers varsayılan olarak kullanıldığından hiçbir şeyi değiştirmeniz gerekmez .
    • Aksi takdirde, tf.compat.v1.train.Optimizer ilgili tf.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 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ın düşmesine neden oluyorsa, lütfen bir hata bildirin.

  • v1.ConfigProto kullanımını v1.ConfigProto eşdeğer işlevlerle tf.config .

Sonuçlar

Genel süreç şu şekildedir:

  1. Yükseltme komut dosyasını çalıştırın.
  2. Katkı simgelerini kaldırın.
  3. Modellerinizi nesne yönelimli bir stile (Keras) geçirin.
  4. tf.keras veya tf.estimator eğitim ve değerlendirme döngülerini kullanın.
  5. 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.