![]() | ![]() | ![]() |
import tensorflow as tf
TensorFlow 2.0, tf.summary
görselleştirme için özet verileri yazmak için kullanılan tf.summary
API'sinde önemli değişiklikler içerir.
Ne değişti
tf.summary
API'sini iki alt API olarak düşünmek faydalıdır:
- Model kodunuzdan satır içi olarak adlandırılan, tek tek özetleri kaydetmek için bir dizi işlem -
summary.scalar()
,summary.histogram()
,summary.image()
,summary.audio()
vesummary.text()
. - Bu ayrı özetleri toplayan ve bunları özel olarak biçimlendirilmiş bir günlük dosyasına (TensorBoard daha sonra görselleştirmeler oluşturmak için okur) yazan mantık yazma.
TF 1.x'te
Session.run()
aracılığıyla özet işlem çıktılarını getirerek ve FileWriter.add_summary(output, step)
çağırarak iki yarının manuel olarak birbirine bağlanması FileWriter.add_summary(output, step)
. v1.summary.merge_all()
op, tüm özet işlem çıktılarını bir araya getirmek için bir grafik koleksiyonu kullanarak bunu kolaylaştırdı, ancak bu yaklaşım, istekli yürütme ve kontrol akışı için yine de yetersiz çalıştı ve özellikle TF 2.0 için uygun değildi.
TF 2.X'te
İki yarım sıkı bir şekilde entegre edilmiştir ve artık bireysel tf.summary
işlemleri yürütüldüğünde verilerini hemen yazmaktadır. API'yi model kodunuzdan kullanmak yine de tanıdık gelecektir, ancak artık grafik modu uyumlu kalırken istekli yürütme için dostça. API aracının iki yarısı entegre summary.FileWriter
hemen TensorFlow yürütme içeriği bir parçasıdır ve doğrudan erişilebilir olur tf.summary
çok yazarlar yapılandırma ops ana parça bakır farklı olmasıdır.
İstekli yürütme ile örnek kullanım, TF 2.0'da varsayılan:
writer = tf.summary.create_file_writer("/tmp/mylogs/eager")
with writer.as_default():
for step in range(100):
# other model code would go here
tf.summary.scalar("my_metric", 0.5, step=step)
writer.flush()
ls /tmp/mylogs/eager
events.out.tfevents.1599908770.kokoro-gcp-ubuntu-prod-1849198075.22428.5.v2
Tf.fonksiyon grafiği yürütme ile örnek kullanım:
writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")
@tf.function
def my_func(step):
with writer.as_default():
# other model code would go here
tf.summary.scalar("my_metric", 0.5, step=step)
for step in tf.range(100, dtype=tf.int64):
my_func(step)
writer.flush()
ls /tmp/mylogs/tf_function
events.out.tfevents.1599908771.kokoro-gcp-ubuntu-prod-1849198075.22428.1013.v2
Eski TF 1.x grafik yürütme ile örnek kullanım:
g = tf.compat.v1.Graph()
with g.as_default():
step = tf.Variable(0, dtype=tf.int64)
step_update = step.assign_add(1)
writer = tf.summary.create_file_writer("/tmp/mylogs/session")
with writer.as_default():
tf.summary.scalar("my_metric", 0.5, step=step)
all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
writer_flush = writer.flush()
with tf.compat.v1.Session(graph=g) as sess:
sess.run([writer.init(), step.initializer])
for i in range(100):
sess.run(all_summary_ops)
sess.run(step_update)
sess.run(writer_flush)
ls /tmp/mylogs/session
events.out.tfevents.1599908771.kokoro-gcp-ubuntu-prod-1849198075.22428.1446.v2
Kodunuzu dönüştürme
Mevcut tf.summary
kullanımının TF 2.0 API'ye dönüştürülmesi güvenilir bir şekilde otomatikleştirilemez, bu nedenle tf_upgrade_v2
komut dosyası hepsini tf.compat.v1.summary
yeniden tf.compat.v1.summary
. TF 2.0'a geçmek için, kodunuzu aşağıdaki gibi uyarlamanız gerekir:
Özet işlemlerini kullanmak için
.as_default()
aracılığıyla ayarlanan varsayılan bir yazıcı mevcut olmalıdır- Bu, operasyonları hevesle yürütmek veya grafik yapımında operasyonları kullanmak anlamına gelir
- Varsayılan bir yazar olmadan, özet operasyonlar sessiz operasyonsuz hale gelir
- Varsayılan yazarlar (henüz)
@tf.function
yürütme sınırı boyunca@tf.function
- yalnızca işlev izlendiğinde algılanırlar - bu nedenle en iyi uygulama, işlev gövdesi içindewriter.as_default()
çağırmak ve writer nesnesini sağlamaktır.@tf.function
kullanıldığı sürece var olmaya devam eder
"Adım" değeri,
step
bağımsız değişkeni aracılığıyla her operasyona aktarılmalıdır.- TensorBoard, verileri bir zaman serisi olarak işlemek için bir adım değeri gerektirir
- Açık geçiş gereklidir çünkü TF 1.x'ten gelen genel adım kaldırılmıştır, bu nedenle her op okumak için istenen adım değişkenini bilmelidir
- Standart bir adım değerini kaydetmek için deneysel destek
tf.summary.experimental.set_step()
olarak mevcuttur, ancak bu, önceden haber verilmeksizin değiştirilebilen geçici işlevselliktir.
Bireysel özet işlemlerinin işlev imzaları değişti
- Dönüş değeri artık bir boole'dur (bir özetin gerçekten yazılıp yazılmadığını gösterir)
- İkinci parametre adı (kullanılıyorsa)
tensor
data
değişti -
collections
parametresi kaldırıldı; koleksiyonlar yalnızca TF 1.x'tir -
family
parametresi kaldırıldı; sadecetf.name_scope()
kullanın
[Yalnızca eski grafik modu / oturum yürütme kullanıcıları için]
İlk olarak, yazarı
v1.Session.run(writer.init())
ilev1.Session.run(writer.init())
Geçerli grafik için tüm TF 2.0 özet işlemlerini almak için
v1.summary.all_v2_summary_ops()
kullanın, örneğin bunlarıSession.run()
aracılığıyla yürütmek içinYazarı
v1.Session.run(writer.flush())
ve aynı şekildeclose()
için yıkayın
TF 1.x kodunuz bunun yerine tf.contrib.summary
API'sini kullanıyorsa, bu TF 2.0 API'ye çok daha benzerdir, bu nedenle tf_upgrade_v2
betiği geçiş adımlarının çoğunu otomatikleştirir (ve tam olarak yapılamayan herhangi bir kullanım için uyarı veya hata verir) taşınmış). Çoğunlukla, API çağrılarını tf.compat.v2.summary
yeniden tf.compat.v2.summary
; Yalnızca TF 2.0+ ile uyumluluğa ihtiyacınız varsa, compat.v2
ve ona tf.summary
olarak tf.summary
.
Ek ipuçları
Yukarıdaki kritik alanlara ek olarak, bazı yardımcı hususlar da değişti:
Koşullu kayıt ("her 100 adımda bir günlüğe kaydet" gibi) yeni bir görünüme sahip
- İşlemleri ve ilişkili kodu kontrol etmek için, bunları normal bir if deyimine (istekli modda ve
@tf.function
imza aracılığıyla çalışır) veya birtf.cond
- Yalnızca özetleri kontrol etmek için yeni
tf.summary.record_if()
bağlam yöneticisini kullanın ve ona seçtiğiniz boole koşulunutf.summary.record_if()
Bunlar, TF 1.x modelinin yerini alır:
if condition: writer.add_summary()
- İşlemleri ve ilişkili kodu kontrol etmek için, bunları normal bir if deyimine (istekli modda ve
tf.compat.v1.Graph
doğrudan yazılmasıtf.compat.v1.Graph
- bunun yerine izleme işlevlerini kullanın- TF 2.0'da grafik yürütme, açık Graph yerine
@tf.function
kullanır - TF 2.0'da, yürütülen işlev grafiklerini kaydetmek için yeni izleme stili API'leri
tf.summary.trace_on()
vetf.summary.trace_export()
kullanın
- TF 2.0'da grafik yürütme, açık Graph yerine
Tf.summary.FileWriterCache ile
tf.summary.FileWriterCache
başına artık global yazıcı önbelleği yok- Kullanıcılar ya kendi yazar nesnelerini önbelleğe alma / paylaşma işlemlerini gerçekleştirmeli ya da sadece ayrı yazarlar kullanmalıdır (ikincisi için TensorBoard desteği devam etmektedir )
Olay dosyası ikili gösterimi değişti
- TensorBoard 1.x zaten yeni biçimi destekliyor; bu fark yalnızca olay dosyalarındaki özet verilerini manuel olarak ayrıştıran kullanıcıları etkiler
- Özet veriler artık tensör baytları olarak saklanmaktadır; bunu
tf.make_ndarray(event.summary.value[0].tensor)
dönüştürmek içintf.make_ndarray(event.summary.value[0].tensor)
kullanabilirsiniz