Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

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

Bu belge, düşük seviyeli TensorFlow API'lerinin kullanıcıları içindir. Yüksek seviyeli API'leri ( tf.keras ) kullanıyorsanız, kodunuzu tamamen TensorFlow 2.0 ile uyumlu hale getirmek için yapmanız gereken çok az işlem olabilir veya hiç işlem olmayabilir:

TensorFlow 2.0'da 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.0'da yapılan birçok iyileştirmeden 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 belgede 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.0'a yükseltmek için ilk geçişi sağlayacaktır. Ancak kodunuzu 2.0'a özgü yapamaz. Kodunuz yine de yer tutuculara, oturumlara, koleksiyonlara ve diğer 1.x tarzı 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() kullanılarak TensorFlow 2.0'da çalışıyorsa, halletmeniz gereken genel davranış değişiklikleri vardır. Başlıca değişiklikler:

  • 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 olur. 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, TF 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.
  • Tensör şekilleri, v1.enable_v2_tensorshape() : TF 2.0, 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'e bakın.

  • Kontrol akışı, v1.enable_control_flow_v2() : TF 2.0 kontrol akışı uygulaması basitleştirilmiştir ve bu nedenle farklı grafik gösterimleri üretir. Lütfen herhangi bir sorun için hataları bildirin.

Kodu 2.0 yerel yapın

Bu kılavuz, TensorFlow 1.x kodunu TensorFlow 2.0'a 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 olur.
  • 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 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. tf.Variable atamaları ve tf.assert s, örneğin, 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, TF 2.0'da 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) gibi 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 olan ihtiyacı ortadan kaldıran diğer birkaç özelliği uygular. .losses özellikleri, tf.GraphKeys.LOSSES koleksiyonunun yerini alabilir.

Ayrıntılar 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 yüksek seviyeli 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 anlamlarıyla birlikte eksiksiz TensorFlow 1.x API'sini içerir.

TF2 yükseltme komut böyle bir dönüşüm güvenlidir eğer 2.0 sürümünün davranışı tam olarak denk olduğunu belirleyebilir eğer yani onların 2,0 eşdeğerlerine semboller dönüştürür (örneğin, o yeniden adlandırır v1.arg_max için tf.argmax beri, 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 pek çok bahsedilmektedir. Kodu gözden geçirmeye ve bunları manuel olarak 2.0 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:

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
  • İsteğe bağlı tf.function dekoratörü performans için eklenebilir.
  • Düzenlemeler, herhangi bir global koleksiyona bakılmaksızın manuel olarak hesaplanır.
  • Oturum veya yer tutucu yok.
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)
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:4: conv2d (from tensorflow.python.keras.legacy_tf_layers.convolutional) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.keras.layers.Conv2D` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:424: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:5: max_pooling2d (from tensorflow.python.keras.legacy_tf_layers.pooling) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.MaxPooling2D instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:6: flatten (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Flatten instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:7: dropout (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:8: dense (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:9: batch_normalization (from tensorflow.python.keras.legacy_tf_layers.normalization) is deprecated and will be removed in a future version.
Instructions for updating:
Use 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.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.07562444 -0.27538717  0.21692204  0.2411264  -0.01209673 -0.0923705
   0.19058049 -0.00468709 -0.17215249 -0.07528099]], shape=(1, 10), dtype=float32)

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ı 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.32132083  0.22252844 -0.11330387 -0.4613616  -0.08817139 -0.52697927
  -0.1538124   0.23069203 -0.15860984 -0.453844  ]], 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.08671833>]

Karışık değişkenler ve v1.layers

Mevcut kod genellikle daha düşük seviyeli TF 1.x değişkenlerini ve işlemleri daha yüksek seviyeli v1.layers . 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 esasen kendine ait bir katmandır. Öyleyse onu tf.keras.layers.Layer olarak yeniden tf.keras.layers.Layer . Ayrıntılar için kılavuza 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 modelleri ve katmanlarının hem v1 grafiklerinde (otomatik kontrol bağımlılıkları yok) hem de istekli modda çalıştırılması gerekir

    • İmza ve otomatik kontrol bağımlılıklarını almak için call() bir tf.function() içine sarın
  • call için bir training argümanını kabul etmeyi unutmayın.

    • Bazen bir tf.Tensor
    • Bazen bir Python boole'idir.
  • self.add_weight() kullanarak yapıcı veya Model.build içinde 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ı 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.0 artık mevcut değil tf.compat.v1 . Slim kullanarak kodu TF 2.0'a 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ı arg adları ve varsayılan değerleri vardır
  • 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 'ın TF2 SavedModels orijinal İnce kodundan ihraç etti.

Bazı tf.contrib katmanları çekirdek TensorFlow'a taşınmamış olabilir, bunun yerine TF eklenti paketine taşınmış olabilir.

Eğitim

Bir tf.keras modeline veri beslemenin birçok yolu vardır. Python jeneratörlerini 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 giriş ardışık tf.queue , yalnızca veri yapıları olarak desteklenmektedir.

Veri Kümelerini Kullanma

TensorFlow Veri Kümeleri paketi ( tfds ), önceden tanımlanmış veri kümelerini tf.data.Dataset nesneleri olarak tf.data.Dataset için yardımcı programlar içerir.

Bu örnek için, MNISTdataset'i 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ürecinizin düşük düzeyde kontrolüne 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'yı 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ıp ve ölçü 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ğitimlere 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 [==============================] - 0s 6ms/step - loss: 1.5665 - accuracy: 0.4969
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.5249 - accuracy: 0.8656
Epoch 3/5
5/5 [==============================] - 0s 5ms/step - loss: 0.3246 - accuracy: 0.9438
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2407 - accuracy: 0.9719
Epoch 5/5
5/5 [==============================] - 0s 5ms/step - loss: 0.1841 - accuracy: 0.9906
5/5 [==============================] - 0s 4ms/step - loss: 1.5957 - accuracy: 0.5375
Loss 1.5956770181655884, Accuracy 0.5375000238418579

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.

Ayrıca 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.145 accuracy: 1.000
train:  loss: 0.183 accuracy: 0.984
train:  loss: 0.216 accuracy: 0.953
train:  loss: 0.229 accuracy: 0.938
train:  loss: 0.201 accuracy: 0.969

eval:  loss: 1.588 accuracy: 0.628
train:  loss: 0.097 accuracy: 1.000
train:  loss: 0.101 accuracy: 1.000
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.130 accuracy: 0.984
train:  loss: 0.127 accuracy: 1.000

eval:  loss: 1.580 accuracy: 0.766
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.079 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.542 accuracy: 0.809
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.503 accuracy: 0.816
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000

eval:  loss: 1.482 accuracy: 0.828

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 veya tf.data.Dataset toplu örnekler elde edin.
  2. tf.GradientTape toplamak için tf.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ıflı 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ılana 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.0'da ölçümler 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:

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.0 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.207
  accuracy: 0.991
Epoch:  1
  loss:     0.167
  accuracy: 0.994
Epoch:  2
  loss:     0.147
  accuracy: 0.997
Epoch:  3
  loss:     0.123
  accuracy: 0.997
Epoch:  4
  loss:     0.109
  accuracy: 0.997

Keras metrik adları

TensorFlow 2.0'da keras modelleri, metrik adların işlenmesi 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 [==============================] - 0s 6ms/step - loss: 0.1233 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

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.AdamOptimizer 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, 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, TF 2 API'yi kullanan birkaç öğretici bulunmaktadır . Buna bir TensorBoard TF 2 Geçiş Kılavuzu dahildir

Kaydetme ve Yükleme

Denetim noktası uyumluluğu

TensorFlow 2.0, nesne tabanlı denetim noktaları kullanır.

Dikkatli olursanız, eski tarz ad tabanlı 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 hala 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 adları 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 2.0'a yükseltmenin kolay bir yolu yoktur. En iyi bahsiniz, dosyayı oluşturan kodu yükseltmektir.

Eğer bir "Dondurulmuş 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.0'da 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 oluşturma ve özellikleri eğitme / değerlendirme

# 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 & 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.0'da 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ı ve 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/tmp333woaev

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

INFO:tensorflow:Using the Keras model provided.

INFO:tensorflow:Using the Keras model provided.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_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, '_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/tmp333woaev', '_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, '_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/tmp333woaev/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/tmp333woaev/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/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/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/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:loss = 2.946777, 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/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/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.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/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.84716s

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.52498615.

INFO:tensorflow:Loss for final step: 0.52498615.

({'accuracy': 0.715625, 'loss': 1.5356585, '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 TF 2.0'da çalışmasını sağlamak için, mevcut kodda minimum değişiklik yapmayı tercih tf.compat.v1 , optimizers tf.compat.v1 ve metrics gibi tf.compat.v1 sembolleri kullanılabilir.

Özel model_fn modellerini 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/tmpnhx_c2r_

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_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, '_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/tmpnhx_c2r_', '_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, '_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/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:loss = 2.7539256, 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/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/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 2020-10-15T01:27:41Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/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.94175s

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.39462265.

INFO:tensorflow:Loss for final step: 0.39462265.

({'accuracy': 0.678125, 'loss': 1.5622549, 'global_step': 25}, [])

TF 2.0 sembolleri ile özel model_fn

Tüm TF 1.x sembollerinden kurtulmak ve özel model_fn yerel TF 2.0'a yükseltmek istiyorsanız, optimize tf.keras.optimizers ve ölçümleri tf.keras.optimizers ve tf.keras.metrics güncellemeniz gerekir.

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

Yukarıdaki my_model_fn örneği için, 2.0 sembollü 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 & 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/tmp3kddt__h

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_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, '_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/tmp3kddt__h', '_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, '_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/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:loss = 2.4914804, 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/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/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 2020-10-15T01:27:45Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/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.91708s

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.3999393.

INFO:tensorflow:Loss for final step: 0.3999393.

({'Accuracy': 0.690625, 'loss': 1.554177, 'global_step': 25}, [])

Premade Tahminciler

tf.estimator.DNN* , tf.estimator.Linear* ve tf.estimator.DNNLinearCombined* ailesindeki tf.estimator.DNN* Estimators , TensorFlow 2.0 API'sinde hala desteklenmektedir, ancak bazı argümanlar değişmiştir:

  1. input_layer_partitioner : 2.0'da kaldırıldı.
  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 için güncellendi tf.keras.optimizers yerine tf.compat.v1.train.Optimizer .

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

  1. input_layer_partitioner için, Distribution Strategy TF 2.0'da otomatik olarak işleyeceği için geçiş gerekmez.
  2. İçin loss_reduction , kontrol tf.keras.losses.Reduction desteklenen seçenekleri için.
  3. optimizer argümanları için, bir optimizer , dnn_optimizer veya linear_optimizer dnn_optimizer veya linear_optimizer optimizer arg öğesini bir string olarak belirtirseniz, hiçbir şeyi değiştirmenize gerek yoktur. tf.keras.optimizers varsayılan olarak kullanılır. Aksi takdirde, tf.compat.v1.train.Optimizer ilgili tf.keras.optimizers güncellemeniz gerekir.

Kontrol Noktası Dönüştürücü

keras.optimizers kontrol noktalarında kaydedilmek üzere farklı bir değişken kümesi oluşturduğundan, keras.optimizers geçiş, TF 1.x kullanılarak kaydedilen kontrol noktalarını tf.keras.optimizers . TF 2.0'a geçişinizden sonra eski kontrol noktasını yeniden kullanılabilir hale getirmek için, kontrol 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  32265      0 --:--:-- --:--:-- --:--:-- 32197

Aracın yerleşik yardımı vardır:

 python checkpoint_converter.py -h
2020-10-15 01:27:47.423752: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
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, int elde etmek için .value() işlevini çağırmaya gerek yoktur.

Bireysel tf.compat.v1.Dimension nesneleri hala erişilebilir tf.TensorShape.dims .

Aşağıda TensorFlow 1.x ve TensorFlow 2.0 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])

Bunu TF 1.x'te yaşadıysanız:

value = shape[i].value

Sonra bunu TF 2.0'da yapın:

value = shape[i]
value
16

Bunu TF 1.x'te yaşadıysanız:

for dim in shape:
    value = dim.value
    print(value)

Sonra bunu TF 2.0'da yapın:

for value in shape:
  print(value)
16
None
256

Bunu TF 1.x'te (Veya başka bir boyut yöntemini kullandıysanız):

dim = shape[i]
dim.assert_is_compatible_with(other_dim)

Sonra bunu TF 2.0'da 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ş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.0'a 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.