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

TensorFlow 2 için TensorFlow 1 kodunu taşıyın

TensorFlow.org görüntüleme Google CoLab koş GitHub üzerinde Görünüm kaynak İndir dizüstü

Düşük seviyeli TensorFlow API'leri kullanıcıları için bu doktor. Eğer yüksek düzeyde API'leri (kullanıyorsanız tf.keras ) tam kodunuzu yapmak almak gerekir az veya hiç hareket olabilir TensorFlow 2.0 uyumlu:

(Modifiye edilmemiş, 1.X kod çalıştırmak için hala mümkündür Contrib hariç TensorFlow 2.0,):

 import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
 

Ancak bu TensorFlow 2.0 yapılan iyileştirmelerin çoğu yararlanmak izin vermez. Bu kılavuz daha basit, daha fazla ölçülebilir hale kodunuzu yükseltme yardımcı olabilir ve bakımı daha kolay olacaktır.

Otomatik Dönüşüm komut

İlk adım, bu doc açıklanan değişiklikleri uygulamaya başlamadan önce, çalışan denemektir yükseltme komut .

Bu TensorFlow 2.0 kodunuzu yükseltme bir ilk geçiş yapacağız. Ama 2.0 kodunuzu deyimsel yapamaz. Kodunuz hala yararlanabilir tf.compat.v1 erişim tutucuları, oturumlar koleksiyonları ve diğer 1.x tarzı işlevselliğine uç noktaları.

Üst düzey davranışsal değişiklikler

Kodunuzu kullanarak TensorFlow 2.0 işliyorsa tf.compat.v1.disable_v2_behavior() , adres gerekebilir küresel davranışsal değişikliklerin hala vardır. önemli değişiklikler şunlardır:

  • Hevesli yürütme, v1.enable_eager_execution() : dolaylı olarak kullanan herhangi bir kod tf.Graph başarısız olur. Bir Bu kodu sarmak için emin olun with tf.Graph().as_default() bağlamı.

  • Kaynak değişkenler, v1.enable_resource_variables() : may olmayan deterministik davranışlarına bağlıdır Bazı kod TF referans değişkenler tarafından etkinleştirilmiş. Kaynak değişkenleri yazılan olurken kilitli ve böylece daha sezgisel tutarlılık garantileri sağlamaktadır.

    • Bu kenar durumlarda davranışını değiştirebilir.
    • Bu ekstra kopyalarını oluşturabilir ve daha yüksek bellek kullanımını sahip olabilir.
    • Bu geçirerek devre dışı bırakılabilir use_resource=False için tf.Variable yapıcısı.
  • Tensör şekiller, v1.enable_v2_tensorshape() : TF 2.0 tensör şekillerin davranışını kolaylaştırır. Yerine t.shape[0].value diyebilirsiniz t.shape[0] . Bu değişiklikler küçük olmalı ve bunun hemen bunları düzeltmek için mantıklı. Bkz TensorShape örnekler için.

  • Kontrol, akış v1.enable_control_flow_v2() TF 2.0 kontrol akış uygulaması basitleştirilmiştir ve bu nedenle farklı bir grafik temsillerini üretmekte. Lütfen dosya böcek herhangi bir sorun için.

Kod 2.0-yerli olun

Bu kılavuz TensorFlow 2.0'a TensorFlow 1.x kod dönüştürme birkaç örneklerle yol gösterecektir. Bu değişiklikler performans optimizasyonları ve basitleştirilmiş API çağrısı kodunuzu almak avantaj sağlayacak.

Her iki durumda da, model şöyledir:

Değiştir 1. v1.Session.run çağrıları

Her v1.Session.run çağrı bir Python işlevi tarafından değiştirilmelidir.

  • feed_dict ve v1.placeholder ler fonksiyon argümanları haline gelir.
  • fetches işlevin dönüş değeri olur.
  • Dönüşüm sırasında istekli yürütme gibi standart Python araçlarıyla kolay hata ayıklama izin verir pdb .

Bundan sonra bir ekleme tf.function Grafikte de verimli çalışması için dekoratör. Bkz İmza Kılavuzu Bu nasıl çalıştığı hakkında daha fazla bilgi için.

Bunu not et:

  • Aksine v1.Session.run bir tf.function sabit getiri imzası vardır ve her zaman tüm çıkışlar döndürür. Bu performans sorunları neden olursa, iki ayrı işlevler oluşturmak.

  • Bir gerek yoktur tf.control_dependencies A: veya benzer operasyonlar tf.function yazılı sırayla çalıştırılıyor gibi davranır. tf.Variable ödev ve tf.assert s, örneğin otomatik olarak yürütülür.

2. Python parça değişkenleri ve kayıplara nesneleri

Tüm isme dayalı değişken izleme kuvvetle TF 2.0 önerilmez. Kullanım Python değişkenleri izlemek için karşı çıkıyor.

Kullanım tf.Variable yerine v1.get_variable .

Her v1.variable_scope bir Python nesnesine dönüştürülmesi gerekir. Tipik olarak, bu biri olacak:

(Gibi değişkenlerin toplam listelerine gerekiyorsa tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ), kullanmak .variables ve .trainable_variables niteliklerini Layer ve Model nesneleri.

Bunlar Layer ve Model sınıfları küresel koleksiyonları için gereken kaldırmak diğer bazı özelliklerini uygulamak. Onların .losses özellik kullanmak için bir yedek olabilir tf.GraphKeys.LOSSES koleksiyonu.

Bkz keras kılavuzları Ayrıntılar için.

Antrenman döngüler Yükseltme 3.

kullanımı durumda çalışır en üst düzey API kullanın. Tercih tf.keras.Model.fit Kendi eğitim döngüler bina bitti.

Bu yüksek seviyede fonksiyonlar kendi eğitim döngü yazarsanız kaçıran kolay olabilir düşük seviyeli detaydan yönetmek. Örneğin, otomatik olarak toplamak onlar düzenlilestirme kayıpları ve set training=True modeli çağrılırken argüman.

Veri girişi boru hatlarını Yükseltme 4.

Kullanım tf.data veri girişi için veri setlerini. Bu nesneler, verimli ifade vardır ve tensorflow ile iyi entegre.

Bunlar doğrudan geçirilebilir tf.keras.Model.fit yöntemiyle.

 model.fit(dataset, epochs=5)
 

Bunlar doğrudan standart Python iterated edilebilir:

 for example_batch, label_batch in dataset:
    break
 

Kapalı 5. Geçiş compat.v1 semboller

tf.compat.v1 modülü orijinal semantik ile komple TensorFlow 1.x API 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, olanlar) aynı işlevi vardır.

Yükseltme komut bir kod parçası ile yapılır sonra, muhtemelen birçok yaptıkları görülmemektedir compat.v1 . Kodun geçmekte ve (eğer varsa o günlüğüne belirtilmesi gerekir) 2.0 eşdeğer el ile bu dönüştürme değer.

modellerini dönüştürme

Kurmak

 import tensorflow as tf


import tensorflow_datasets as tfds
 

Düşük seviyeli değişkenleri ve operatör yürütme

düşük seviye API kullanım örnekleri aşağıdakileri içerir:

dönüştürmeden önce

İşte bu desenlerin TensorFlow 1.x kullanılarak kodda gibi görünebilir ne

 in_a = tf.placeholder(dtype=tf.float32, shape=(2))
in_b = tf.placeholder(dtype=tf.float32, shape=(2))

def forward(x):
  with tf.variable_scope("matmul", reuse=tf.AUTO_REUSE):
    W = tf.get_variable("W", initializer=tf.ones(shape=(2,2)),
                        regularizer=tf.contrib.layers.l2_regularizer(0.04))
    b = tf.get_variable("b", initializer=tf.zeros(shape=(2)))
    return W * x + b

out_a = forward(in_a)
out_b = forward(in_b)

reg_loss=tf.losses.get_regularization_loss(scope="matmul")

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  outs = sess.run([out_a, out_b, reg_loss],
                feed_dict={in_a: [1, 0], in_b: [0, 1]})

 

dönüştürme sonra

Dönüştürülen kodu:

  • değişkenler yerel Python nesnelerdir.
  • forward fonksiyonu hala hesaplama tanımlar.
  • Session.run çağrı çağrısı ile değiştirilir forward
  • İsteğe bağlı tf.function dekoratör performansı için ilave edilebilir.
  • regularizations herhangi küresel koleksiyonuna atıfta olmadan, elle hesaplanmıştır.
  • Hiçbir oturum veya tutucuları.
 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)
 

Modeller dayalı tf.layers

v1.layers modülü dayanıyordu tabaka işlevlerini ihtiva etmek için kullanılmaktadır v1.variable_scope tanımlamak ve yeniden değişken.

dönüştürmeden önce

 def model(x, training, scope='model'):
  with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
    x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu,
          kernel_regularizer=tf.contrib.layers.l2_regularizer(0.04))
    x = tf.layers.max_pooling2d(x, (2, 2), 1)
    x = tf.layers.flatten(x)
    x = tf.layers.dropout(x, 0.1, training=training)
    x = tf.layers.dense(x, 64, activation=tf.nn.relu)
    x = tf.layers.batch_normalization(x, training=training)
    x = tf.layers.dense(x, 10)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)
 

dönüştürme sonra

Çoğu argümanlar aynı kaldı. Ama farklılıkları dikkat edin:

  • training çalıştırıldığında argüman modeli ile her katman geçirilir.
  • Orijinal ilk bağımsız değişken model işlevi (giriş x ) kayboldu. Nesne tabakalar modeli aramasını modeli inşa ayırmak olmasıdır.

Ayrıca unutmayın:

  • Eğer gelen başlatıcıdan regularizers kullanılarak olsaydı tf.contrib , bu diğerlerinden daha fazla argüman değişiklikler var.
  • Gibi fonksiyonlar böylece kod artık, koleksiyonlarına yazar v1.losses.get_regularization_loss artık potansiyel olarak eğitim döngüler kırarak, bu değerleri döndürür.
 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.11456077 -0.3126101   0.13154565 -0.50197905 -0.02416557  0.36460522
  -0.24887308 -0.37784547  0.05524942  0.01696768]], 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.077528305>]

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

Genellikle kod Mevcut karışımlar alt seviye TF daha üst düzey olan 1.x değişkenleri ve işlemleri v1.layers .

dönüştürmeden önce

 def model(x, training, scope='model'):
  with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
    W = tf.get_variable(
      "W", dtype=tf.float32,
      initializer=tf.ones(shape=x.shape),
      regularizer=tf.contrib.layers.l2_regularizer(0.04),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = tf.layers.max_pooling2d(x, (2, 2), 1)
    x = tf.layers.flatten(x)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)
 

dönüştürme sonra

Bu kodu dönüştürmek için, bir önceki örnekte olduğu gibi katmanlarına haritalama modelini izleyin.

Genel model şöyledir:

  • İçinde toplayın katman parametreleri __init__ .
  • Değişkenleri kurmak build .
  • Hesaplamaları Yürütme call ve sonucu döndürür.

v1.variable_scope esasen kendi başına bir tabakasıdır. Yani bir olarak yeniden tf.keras.layers.Layer . Bkz kılavuzu detayları için.

 # 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)

 

nota gereken bazı noktalar:

  • Sınıflandırma Keras modelleri ve tabakalar iki V1 grafikler (otomatik kontrol bağımlılıklar) ve istekli modunda çalıştırmak için gereken

    • Sarın call() bir de tf.function() imzanı ve otomatik kontrol bağımlılıklarını almak
  • Bir kabul unutmayın training için argüman call .

    • Bazen bir olduğunu tf.Tensor
    • Bazen bir Python boolean.
  • Yapıcısı veya model değişkenler oluşturma Model.build kullanarak self.add_weight() .

    • In Model.build giriş şekline erişebilirler, dolayısıyla şekil eşleşen ağırlıkları oluşturabilir.
    • Kullanılması tf.keras.layers.Layer.add_weight parça değişkenleri ve düzenlileştirme kayıpları keras verir.
  • Tutmayın tf.Tensors sizin nesneleri.

    • Onlar ya oluşturulmuş olabilir olsun tf.function veya istekli bağlamında ve bu tansörleri farklı davranır.
    • Kullanım tf.Variable devlet için s, her zaman her iki bağlamlarından kullanılabilen
    • tf.Tensors ara değerleri içindir.

Slim & contrib.layers ilgili 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 . TF 2.0 Slim kullanarak dönüştürme kodu daha kullanmak depoları dönüştürme daha katılır v1.layers . Aslında, bu anlamda sizin İnce kodunu dönüştürmek için yapabilir v1.layers sonra, ilk keras dönüştürmek.

  • Kaldır arg_scopes , tüm args açık olması gerekiyor
  • Onlara, bölünmüş kullanırsanız normalizer_fn ve activation_fn kendi katmanlara
  • Ayrılabilir dönüşüm tabakalar bir veya daha fazla farklı Keras katman (depthwise, izlemeli ve ayrılabilir Keras tabakaları) için bir haritada
  • İnce ve v1.layers farklı arg adları ve varsayılan değerlere sahip
  • Bazı args farklı pulları
  • 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 tabakaları çekirdek TensorFlow taşındı olmayabilir ama bunun yerine taşındı TF eklentiler pakette .

Eğitim

Bir besleme verilerine birçok yolu vardır tf.keras modeli. Onlar girdi olarak Python jeneratörleri ve Numpy diziler kabul edecektir.

Bir model besleme verilerine tavsiye edilen bir yol kullanmaktır tf.data verilerin manipüle edilmesi için yüksek performanslı sınıflar koleksiyonu içerir paketi.

Hala kullanıyorsanız tf.queue , bunlar artık sadece girdi boru hatları gibi, veri yapıları olarak değil desteklenmektedir.

Veri Kümeleri kullanma

TensorFlow Datasets paketi ( tfds ) ve yükleme önceden tanımlanmış veri kümeleri için araçları içerir tf.data.Dataset nesneleri.

Bu örnek için, kullanan, MNISTdataset yük 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 eğitim için verileri hazırlamak:

  • Her görüntüyü yeniden ölçeklendirme.
  • örnekler sırasını karıştırın.
  • görüntü ve etiketlerin toplayın toplu.
 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
 

sadece 5 toplu döndürmek için örnek kısa tutmak için, veri kümesi trim:

 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))
 

Kullanım Keras eğitim döngüler

Kullandığınız, eğitim sürecinin düşük seviye kontrolü gerekmiyorsa Keras yerleşik fit , evaluate ve predict önerilir yöntemleri. Bu yöntemler ne olursa olsun uygulama modelini eğitmek için standart bir arayüz sağlamak (sıralı, fonksiyonel ya da alt sınıflandırılır).

Bu yöntemlerin avantajları şunlardır:

  • Onlar Numpy diziler, Python jeneratörleri ve kabul tf.data.Datasets
  • Bunlar otomatik düzen içine alınması, ve aktivasyon kayıpları geçerlidir.
  • Onlar destekleyen tf.distribute çoklu cihaz eğitimi için .
  • Onlar kayıpları ve metrik olarak rasgele callables destekler.
  • Onlar gibi geri aramalar destekleyen tf.keras.callbacks.TensorBoard ve özel geri aramalar.
  • Bunlar otomatik olarak TensorFlow grafikleri kullanılarak ölçülebilir vardır.

İşte kullanarak bir model eğitim örneğidir Dataset . (Bu eserler nasıl gördüğünü ilgili ayrıntılar için öğreticiler .)

 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.5323 - accuracy: 0.5063
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.4105 - accuracy: 0.9219
Epoch 3/5
5/5 [==============================] - 0s 7ms/step - loss: 0.2495 - accuracy: 0.9531
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1806 - accuracy: 0.9875
Epoch 5/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1416 - accuracy: 0.9937
5/5 [==============================] - 0s 4ms/step - loss: 1.5655 - accuracy: 0.6469
Loss 1.565544605255127, Accuracy 0.6468750238418579

Kendi döngü yazın

Keras modelin eğitim aşaması sizin için çalışır, ancak adım kullanmayı düşünün o daha fazla kontrol dışını gerekiyorsa tf.keras.Model.train_on_batch kendi veri yineleme döngüsünde, yöntem.

Unutmayın: Birçok şey bir olarak uygulanabilir tf.keras.callbacks.Callback .

Bu yöntem, daha önceki bölümde bahsedilen yöntemlerin avantajları çok sahiptir, fakat dış döngünün kullanıcı kontrol sağlar.

Ayrıca kullanabilirsiniz tf.keras.Model.test_on_batch veya tf.keras.Model.evaluate eğitim sırasında onay performansına.

Yukarıdaki modeli eğitim 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.122 accuracy: 0.984
train:  loss: 0.133 accuracy: 0.984
train:  loss: 0.164 accuracy: 0.969
train:  loss: 0.167 accuracy: 0.969
train:  loss: 0.161 accuracy: 0.984

eval:  loss: 1.583 accuracy: 0.669
train:  loss: 0.074 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000
train:  loss: 0.089 accuracy: 1.000
train:  loss: 0.095 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000

eval:  loss: 1.567 accuracy: 0.747
train:  loss: 0.065 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.069 accuracy: 1.000
train:  loss: 0.067 accuracy: 1.000

eval:  loss: 1.545 accuracy: 0.772
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.063 accuracy: 0.984
train:  loss: 0.050 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000

eval:  loss: 1.520 accuracy: 0.778
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.046 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000

eval:  loss: 1.494 accuracy: 0.791

eğitim adımını özelleştirme

Eğer daha fazla esneklik ve kontrol gerekiyorsa, kendi eğitim döngü uygulayarak buna sahip olabilir. üç adım vardır:

  1. Python jeneratör veya üzerinde Bıkmadan tf.data.Dataset örneklerinden toplu olsun.
  2. Kullanım tf.GradientTape toplamak degradelere.
  3. Birini kullanın tf.keras.optimizers modelin değişkenlere ağırlık güncellemeleri uygulamak için.

Hatırlamak:

  • Her zaman dahil training üzerine tartışma call sınıflandırma katmanları ve modellerin yöntemle.
  • İle model aramak emin olun training doğru argüman seti.
  • Model verilerinin toplu olarak çalıştırılan kadar Kullanıma bağlı olarak model değişkenleri olmayabilir.
  • El ile model için düzenlilestirme kayıpları gibi şeyler işlemek gerekir.

v1'e basitleştirmeler göreli Not:

  • Değişken başlatıcıları çalıştırmak için gerek yoktur. Değişkenler oluşturma başlatılır.
  • manuel kontrol bağımlılıkları eklenmesine gerek yoktur. Hatta içinde tf.function operasyonlar istekli modda olarak görev yapar.
 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çütleri ve zararlar

TensorFlow 2.0, ölçümler ve zararlar nesnelerdir. Bunlar iş hem hevesle ve tf.function s.

Bir kayıp nesne çağrılabilir ve bağımsız değişkenler olarak (y_true, y_pred) bekler:

 cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
 
4.01815

Bir metrik bir amacı, aşağıdaki yöntem vardır:

nesnenin kendisi çağrılabilir. Olduğu gibi, yeni gözlemlerle güncellemeleri devlet çağrılması update_state ve metrik yeni sonucunu verir.

El ile bir metrik en değişkenlerini başlatmak gerekmez ve TensorFlow 2.0 otomatik kontrol bağımlılıkları olduğundan, ya Bunlar hakkında endişe gerekmez.

kullanımlara bir ölçümün altında kod özel eğitim döngüsü içinde gözlemlenen ortalama kayıp izlemek için.

 # 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.175
  accuracy: 0.994
Epoch:  1
  loss:     0.149
  accuracy: 0.991
Epoch:  2
  loss:     0.133
  accuracy: 0.991
Epoch:  3
  loss:     0.113
  accuracy: 0.997
Epoch:  4
  loss:     0.101
  accuracy: 0.997

Keras metrik isimlerini

TensorFlow yılında 2.0 keras modelleri metrik adlarına yönetilmesi hakkında daha fazla tutarlıdır.

Şimdi tam dize metriğin olarak kullanıldığını, Metriklerin listesinde bir dize geçerken name . Bu isimler tarafından döndürülen tarih nesnesi görülebilir model.fit ve günlüklerde geçirilen keras.callbacks . Metrik listesinde geçirilen dize olarak 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.1076 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969

 history.history.keys()
 
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

Geçen önceki versiyonlarından Bu farklılık metrics=["accuracy"] neden olur dict_keys(['loss', 'acc'])

keras optimize

İçinde optimize v1.train gibi v1.train.AdamOptimizer ve v1.train.GradientDescentOptimizer , eşdeğerleri tf.keras.optimizers .

Dönüştürme v1.train için keras.optimizers

İşte optimize dönüştürürken akılda tutulması gereken noktalar şunlardır:

Bazıları için yeni varsayılan tf.keras.optimizers

İçin herhangi bir değişiklik bulunmamaktadır optimizers.SGD , optimizers.Adam veya optimizers.RMSprop .

Aşağıdaki varsayılan öğrenme oranları değişti:

TensorBoard

TensorFlow 2 önemli değişiklikler içeren tf.summary TensorBoard içinde görselleştirme için yazma özeti verilerine kullanılan API. Yeni genel bir giriş için tf.summary vardır mevcut birkaç öğreticiler TF 2 API kullanmak. Bu içermektedir TensorBoard TF 2 Aktarım Kılavuzu'na

Tasarruf & Yükleme

Checkpoint uyumluluğu

2.0 kullanımları TensorFlow kontrol noktaları nesne merkezli .

Eğer dikkatli değilseniz Eski stil adı temelli kontrol noktaları hala yüklenebilir. Kod dönüştürme işlemi değişkeni adı değişikliklere neden olabilir, ama çözüm yolu vardır.

En basit bu kontrol noktasında adlarla yeni model isimlerini sıraya yaklaşmak:

  • Değişkenler hala tüm bir var name ayarlayabileceğiniz argüman.
  • Keras modelleri de almak name onların değişkenler için ön ek olarak ayarlanmış hangi argüman.
  • v1.name_scope fonksiyonu Değişken adı önekleri ayarlamak için kullanılabilir. Bu çok farklıdır tf.variable_scope . Sadece isimleri etkiler ve değişkenler ve yeniden kullanımını takip etmez.

Bu senin bir kullanım örneği için çalışmazsa, deneyin v1.train.init_from_checkpoint fonksiyonunu. Bir sürer assignment_map yeni isimlere eski isimlerinden eşleme belirten argüman.

TensorFlow Tahmincisi deposu bir içermektedir dönüşüm aracı TensorFlow 1.X ila 2.0 önceden yapılmış tahmin için kontrol noktaları yükseltme. Benzer bir kullanım durumu için bir araç oluşturmak için nasıl bir örnek olarak hizmet edebilir.

Kaydedilen modeller uyumluluğu

Kaydedilen modeller için anlamlı uyumluluk endişeler bulunmaktadır.

  • TensorFlow 2.x TensorFlow 1.x saved_models çalışma
  • TensorFlow içinde TensorFlow 2.x saved_models iş 1.x -eğer tüm operasyonlar desteklenir.

Bir Graph.pb veya Graph.pbtxt

Bir çiğ yükseltmek için doğrudan bir yol yoktur Graph.pb TensorFlow 2.0 için dosyayı. Yapabileceğiniz en iyi şey dosyasını oluşturulan 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, burada 2016 Başlangıç ​​v1 için frozed grafiktir:

 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

Yük tf.GraphDef :

 graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())
 

Bir içine sarın concrete_function :

 inception_func = wrap_frozen_graph(
    graph_def, inputs='input:0',
    outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')
 

o, girdi olarak bir tensörünün geçmek:

 input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
 
TensorShape([1, 28, 28, 96])

Kestirimciler

Tahmin ile Eğitim

Kestirimciler TensorFlow 2.0 desteklenir.

Eğer tahmin edicileri kullandığınızda, kullanabilirsiniz input_fn() , tf.estimator.TrainSpec ve tf.estimator.EvalSpec TensorFlow 1.x. dan

İşte kullanan bir örnek input_fn özelliklerini değerlendirmek ve tren ile.

input_fn ve tren / eval spesifikasyonlarını 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 & 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)

 

Bir Keras modeli tanımını kullanarak

TensorFlow 2.0 da tahmin edicileri oluşturmak için nasıl bazı farklılıklar vardır.

Size Keras ardından kullanmak kullanarak modelinizi tanımlamak önerilir tf.keras.estimator.model_to_estimator bir tahmincisi içine modelinizi açmak için yarar. gösterileri Aşağıdaki kod nasıl oluşturma ve bir tahmin edici eğitim yaparken bu programı kullanmak.

 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/tmpb3_a632k

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

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/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

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

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

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

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

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

INFO:tensorflow:loss = 2.270717, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpb3_a632k/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-07-23T01:32:32Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:32Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpb3_a632k/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 : 1.01619s

INFO:tensorflow:Inference Time : 1.01619s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

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

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

INFO:tensorflow:Loss for final step: 0.39261085.

INFO:tensorflow:Loss for final step: 0.39261085.

({'accuracy': 0.671875, 'loss': 1.5162958, 'global_step': 25}, [])

Özel bir kullanma model_fn

Varolan özel tahmincisi varsa model_fn korumak gerektiğini, kendi dönüştürebilirsiniz model_fn bir Keras modelini kullanmak.

Ancak, uyumluluk nedeniyle, özel bir model_fn hala 1.x tarzı grafik modunda çalışacaktır. Bu hayır demektir istekli yürütme ve hiçbir otomatik kontrol bağımlılıkları yoktur.

çok küçük değişiklikler yaparak Custom model_fn

Özel yapmak için model_fn varolan kodun minimal değişiklikler isterseniz, TF 2.0 çalışmalarını tf.compat.v1 gibi simgeler optimizers ve metrics kullanılabilir.

Özel bir bir Keras modelleri kullanarak model_fn özel eğitim döngü içinde kullanmaktan benzer:

  • Set training dayanan uygun faz, mode argümanı.
  • Açıkça modelin geçmesi trainable_variables optimizer için.

Ama göreli önemli farklar vardır özel döngü :

  • Bunun yerine kullanmanın Model.losses kullanarak kayıplarını ayıklamak Model.get_losses_for .
  • Kullanarak modelin güncellemelerini Özü Model.get_updates_for .

Aşağıdaki kod özel bir tahmin edicisi oluşturur model_fn bu endişeleri her gösteren.

 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/tmpjb2yik9a

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

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

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

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

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

INFO:tensorflow:loss = 2.6231384, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpjb2yik9a/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-07-23T01:32:36Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:36Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpjb2yik9a/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 : 1.09900s

INFO:tensorflow:Inference Time : 1.09900s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

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

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

INFO:tensorflow:Loss for final step: 0.56862533.

INFO:tensorflow:Loss for final step: 0.56862533.

({'accuracy': 0.621875, 'loss': 1.6634324, 'global_step': 25}, [])

Özel model_fn TF 2.0 sembollerle

Tüm TF 1.x sembollerin kurtulmak ve özel yükseltmek istiyorsanız model_fn yerli TF 2.0 şunları yapmanız optimize edici ve ölçümleri güncellemeniz gerekir tf.keras.optimizers ve tf.keras.metrics .

Özel olarak model_fn , yukarıda yanında değişikliklerle , daha yükseltmeleri yapılması gerekmektedir:

Yukarıdaki Örneğin my_model_fn , 2.0 sembolleri ile taşınan kod gösterilmiştir:

 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/tmppkb1q1hq

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

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

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

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

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

INFO:tensorflow:loss = 2.6947184, step = 0

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

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmppkb1q1hq/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-07-23T01:32:40Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:40Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmppkb1q1hq/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 : 1.05743s

INFO:tensorflow:Inference Time : 1.05743s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

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

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

INFO:tensorflow:Loss for final step: 0.5751184.

INFO:tensorflow:Loss for final step: 0.5751184.

({'Accuracy': 0.784375, 'loss': 1.4717665, 'global_step': 25}, [])

Premade Kestirimciler

Premade Kestirimciler ailesinde tf.estimator.DNN* , tf.estimator.Linear* ve tf.estimator.DNNLinearCombined* hala TensorFlow 2.0 API desteklenir, ancak bazı argümanlar değişti:

  1. input_layer_partitioner : 2.0 kaldırıldı.
  2. loss_reduction : güncellendi tf.keras.losses.Reduction yerine tf.compat.v1.losses.Reduction . Onun varsayılan değeri de olarak değiştirilir tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE dan 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. Taşıma yok için gerekli olan input_layer_partitioner beri Distribution Strategy TF 2.0 bunu otomatik olarak işleyecektir.
  2. İçin loss_reduction , kontrol tf.keras.losses.Reduction desteklenen seçenekleri için.
  3. İçin optimizer args, bir de geçemiyor eğer optimizer , dnn_optimizer veya linear_optimizer belirttiğiniz takdirde arg veya optimizer bir şekilde arg string kodunuzda, değişikliğin hiçbir şeye ihtiyacım yok. tf.keras.optimizers varsayılan olarak kullanılır. Aksi takdirde, onu güncellemeniz gerekir tf.compat.v1.train.Optimizer onun karşılık gelen tf.keras.optimizers

Checkpoint Dönüştürücü

İçin göç keras.optimizers olarak, TF 1.x kullanılarak kaydedilmiş kontrol noktaları kıracak tf.keras.optimizers kontrol noktalarında kaydedilemeyecek değişkenlerin farklı bir dizi oluşturur. TF 2.0'a geçişten sonra eski denetim noktası yeniden kullanılabilir hale getirmek için, deneyin kontrol noktası çevirici aracı .

 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 15157  100 15157    0     0  63684      0 --:--:-- --:--:-- --:--:-- 63684

aracı yardımı yerleşiğine vardır:

 python checkpoint_converter.py -h
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 tutma şekilde basitleştirilmiştir int yerine, s tf.compat.v1.Dimension itiraz ediyor. Yani aramaya gerek yoktur .value() bir olsun int .

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

Aşağıdaki TensorFlow 1.x ve TensorFlow 2.0 arasındaki farkları gösterir.

 # Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
 
TensorShape([16, None, 256])

Eğer TF 1.x bu olsaydı:

 value = shape[i].value
 

Sonra TF 2.0 bunu:

 value = shape[i]
value
 
16

Eğer TF 1.x bu olsaydı:

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

Sonra TF 2.0 bunu:

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

Eğer TF 1.x bu olsaydı (Ya da başka boyut yöntemi kullanılır):

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

Sonra TF 2.0 bunu:

 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 boole değeri tf.TensorShape olan True rütbe, biliniyorsa False aksi.

 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

  • Kaldır tf.colocate_with : TensorFlow cihaz yerleştirme algoritmaları önemli ölçüde iyileştirilmiştir. Bu artık gerekli olmalıdır. Çıkarmadan bir performans bozunma neden olursa hata bildiriminde .

  • Değiştir v1.ConfigProto eşdeğer fonksiyonları ile kullanımı tf.config .

Sonuçlar

Genel bir işlemdir:

  1. Yükseltme komut dosyasını çalıştırın.
  2. contrib sembolleri kaldırın.
  3. , nesne yönelimli (Keras) için modeller geçin.
  4. Kullanım tf.keras veya tf.estimator eğitim ve değerlendirme döngüler yapabileceğiniz.
  5. Aksi takdirde, kullanım özel döngüler, ancak oturumları & tahsilatı önlemek için emin olun.

Bu deyimsel TensorFlow 2.0 dönüştürme koduna küçük bir iş alır, ama her değişiklik sonuçları:

  • kod az satır.
  • açıklık ve sadelik artmıştır.
  • Daha kolay hata.