Etkili TensorFlow 2.0: En İyi Uygulamalar ve Değişiklikler

TensorFlow Ekibi tarafından gönderildi

Son bir makalede, TensorFlow 2.0'ın geliştirici üretkenliği, basitliği ve kullanım kolaylığı odaklı olarak yeniden tasarlandığını belirttik.

Neyin değiştiğine daha yakından bakmak ve en iyi uygulamaları öğrenmek için yeni Etkili TensorFlow 2.0 rehberine (GitHub'da yayınlanan) bakın. Bu makale, orada bulacağınız içeriğin hızlı bir özetini sunar. Bu konulardan herhangi biri sizi ilgilendiriyorsa, daha fazla bilgi için kılavuza gidin!

Büyük değişikliklerin kısa bir özeti

TensorFlow 2.0'da, kullanıcıların gereksiz API'leri kaldırmak, API'leri daha tutarlı hale getirmek (Unified RNN'ler, Unified Optimizers) ve Eager uygulamasıyla Python çalışma zamanı ile daha iyi entegrasyon dahil olmak üzere kullanıcıları daha üretken hale getirmek için birçok değişiklik var.

Birçok RFC (onlar için yeni iseniz onları kontrol edin!), TensorFlow 2.0'da meydana gelen değişiklikleri ve düşünceleri açıkladı. Bu kılavuz, TensorFlow 2.0'daki gelişimin nasıl olması gerektiğine dair bir vizyon sunuyor. TensorFlow 1.x ile ilgili biraz bilgi sahibi olduğunuz varsayılmıştır.

API Temizleme

Birçok API TF 2.0'da ya gider ya da taşınır ve bazıları 2.0 eşdeğerleriyle değiştirilir - tf.summary, tf.keras.metrics ve tf.keras.optimizers. Bu adları otomatik olarak uygulamanın en kolay yolu v2 yükseltme komut dosyasını kullanmaktır.

İstekli yürütme

TensorFlow 1.X, kullanıcıların tf. * API çağrıları yaparak soyut bir sözdizimi ağacını (grafik) birlikte elle dikişlemelerini gerektirir. Daha sonra kullanıcıların bir dizi çıkış tensörü ve giriş tensörünü bir session.run () çağrısına geçirerek soyut sözdizimi ağacını elle derlemelerini gerektirir. Buna karşılık, TensorFlow 2.0 istekli bir şekilde yürütülür (Python'un normalde yaptığı gibi) ve 2.0'da grafikler ve oturumlar uygulama detayları gibi hissetmelidir.

Artık globals yok

TensorFlow 1.X, büyük ölçüde dolaylı olarak küresel ad alanlarına dayanıyordu. Tf.Variable () işlevini çağırdığınızda, varsayılan grafiğe yerleştirilir ve işaret eden Python değişkeninin izini kaybetseniz bile orada kalır. Daha sonra bu tf.Variable'ı kurtarabilirsin, ancak sadece onunla yaratıldığını biliyorsan. Değişkenin yaratılmasının kontrolü sizde değilse, bunu yapmak zordu. Sonuç olarak, kullanıcıların değişkenlerini tekrar bulmalarına yardımcı olmak için her türlü mekanizma çoğaldı.

TensorFlow 2.0, bu mekanizmaların tümünü (Değişkenler 2.0 RFC) varsayılan mekanizma lehine kaldırır: Değişkenlerinizi takip edin! Bir tf.Variable'ın izini kaybedersen, çöp toplanır. Daha fazla ayrıntı için kılavuza bakın.

İşlevler, oturumlar değil

Bir session.run () çağrısı neredeyse bir işlev çağrısı gibidir: Girdileri ve çağrılacak işlevi belirtirsiniz ve bir çıktı kümesini geri alırsınız. TensorFlow 2.0'da, bir Python işlevini tf.function () kullanarak, JIT derlemesi için işaretlemek üzere süsleyebilirsiniz, böylece TensorFlow onu tek bir grafik olarak çalıştırır (İşlevler 2.0 RFC).

Bu mekanizma, TensorFlow 2.0'ın grafik modunun tüm avantajlarını kazanmasını sağlar:

  • Performans: Fonksiyon optimize edilebilir (düğüm budaması, çekirdek füzyonu, vb.)
  • Taşınabilirlik: İşlev, kullanıcıların modüler TensorFlow işlevlerini yeniden kullanmalarına ve paylaşmalarına olanak tanıyarak dışa aktarılabilir / yeniden içe aktarılabilir (SavedModel 2.0 RFC).

Python ve TensorFlow kodunu serbestçe kesişme gücü sayesinde, Python’un ifadesinden tam olarak yararlanabilirsiniz. Ancak taşınabilir TensorFlow, mobil, C ++ ve JS gibi bir Python yorumlayıcısı olmadan bağlamlarda çalışır. Kullanıcıların @ tf.function öğesini eklerken kodlarını yeniden yazmaktan kaçınmasına yardımcı olmak için, AutoGraph, bir Python yapısı alt kümesini TensorFlow eşdeğerlerine dönüştürür.

Daha fazla ayrıntı için kılavuza bakın.

Deyimatik TensorFlow 2.0 için tavsiyeler

Kodunuzu daha küçük fonksiyonlara dönüştürün

TensorFlow 1.X'te ortak bir kullanım şekli, olası tüm hesaplamaların birleştirilmesinin ön plana çıkarıldığı “mutfak lavabosu” stratejisiydi ve daha sonra seçilen tansiyonlar session.run () ile değerlendirildi. TensorFlow 2.0'da, kullanıcılar kodlarını gerektiği gibi daha küçük fonksiyonlara dönüştürmelidir. Genel olarak, bu küçük işlevlerin her birini tf.function ile dekore etmek gerekmez; tf.function işlevini yalnızca üst düzey hesaplamaları dekore etmek için kullanın - örneğin, bir eğitim aşaması veya modelinizin ileri geçişi.

Değişkenleri yönetmek için Keras katmanlarını ve modellerini kullanın

Keras modelleri ve katmanları, tekrarlayan bir şekilde tüm bağımlı değişkenleri toplayan uygun değişkenler ve trainable_variables özelliklerini sunar. Bu, değişkenlerin yerel olarak kullanıldığı yerlere göre yönetilmesini kolaylaştırır.

Keras katmanları / modelleri tf.train.Checkpointable 'dan miras alır ve @ tf.function ile bütünleştirilir; Bu entegrasyonlardan yararlanmak için Keras’s.fit () API kullanmanız gerekmez.

Daha fazla ayrıntı için kılavuza bakın.

Tf.data.Datasets ve @ tf.function öğelerini birleştirin

Hafızaya uygun egzersiz verilerini yinelerken, düzenli Python yineleme kullanmaktan çekinmeyin. Aksi takdirde, tf.data.Dataset, antrenman verilerini diskten aktarmanın en iyi yoludur. Veri kümeleri yineleyicilerdir (yineleyiciler değil) ve Eager modundaki diğer Python yineleyiciler gibi çalışırlar. Kodunuzu Python yinelemesini AutoGraph kullanarak eşdeğer grafik işlemleriyle değiştiren tf.function () seçeneğine sararak veri kümesi zaman uyumsuz ön hazırlık / akış özelliklerini tam olarak kullanabilirsiniz.

@ tf.function
def tren (model, veri kümesi, optimize edici):
 x için, veri kümesinde y:
  bant olarak tf.GradientTape () ile:
   tahmin = model (x)
   kayıp = loss_fn (tahmin, y)
  gradyanlar = tape.gradients (kayıp, model.trainable_variables)
  optimizer.apply_gradients (gradyanlar, model.trainable_variables)

Keras .fit () API'sini kullanıyorsanız, veri kümesi yineleme hakkında endişelenmenize gerek yoktur.

model.compile (optimizer = optimizer, kayıp = loss_fn)
model.fit (veri kümesi)

Python kontrol akışı ile AutoGraph'tan yararlanın

AutoGraph, veriye bağlı kontrol akışını tf.cond ve tf.while_loop gibi grafik modu eşdeğerlerine dönüştürmenin bir yolunu sunar.

Verilere bağlı kontrol akışının göründüğü ortak bir yer, sıralı modellerdir. tf.keras.layers.RNN, bir RNN hücresini sarar, böylece tekrarı statik veya dinamik olarak açmanıza izin verir. Gösteri uğruna, dinamik açmayı aşağıdaki gibi yeniden uygulayabilirsiniz:

sınıf DynamicRNN (tf.keras.Model):
def __init __ (kişisel, rnn_cell):
 super (DynamicRNN, kendi kendine) .__ init __ (kendi kendine)
 self.cell = rnn_cell
def çağrısı (self, input_data):
 # [parti, zaman, özellikler] -> [zaman, parti, özellikler]
 input_data = tf.transpose (input_data, [1, 0, 2])
 outputs = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 i için tf.range (input_data.shape [0]):
  çıktı, durum = self.cell (input_data [i], durum)
  outputs = outputs.write (i, output)
 return tf.transpose (outputs.stack (), [1, 0, 2]), durum

Daha fazla ayrıntı için kılavuza bakın.

Verileri toplamak için tf.metrics ve kaydetmek için tf.summary komutunu kullanın.

Son olarak, tam bir dizi tf.summary sembolü yakında geliyor. Tf.summary dosyasının 2.0 sürümüne aşağıdaki adresten erişebilirsiniz:

tensorflow.python.ops sitesinden import summary_ops_v2

Daha fazla ayrıntı için kılavuza bakın.

Sonraki adımlar

Bu makale, Etkili TF 2.0 Kılavuzunun kısa bir özetini sunmuştur (bu konularla ilgileniyorsanız, daha fazla bilgi edinmek için oraya gidin!) TensorFlow 2.0 hakkında daha fazla bilgi edinmek için şu makaleleri de öneririz:

  • TensorFlow'a Katkı: SIG'ler, RFC'ler, Testler ve Dokümanlar.
  • TensorFlow 2.0'daki Sembolik ve Emir Kipli API'ler nelerdir?
  • Keras Üzerine Standartlaştırma: TensorFlow 2.0'da Üst Düzey API'ler Hakkında Rehberlik

Lütfen 6 ve 7 Mart tarihlerinde TensorFlow geliştirici zirvesine katılın. Her zaman olduğu gibi, tüm görüşmeler şahsen yapamayanlar için YouTube'a yüklenecek.