TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
import tensorflow as tf
TensorFlow 2.x önemli değişiklikler içeren tf.summary
TensorBoard içinde görselleştirme için yazma özeti verilerine kullanılan API.
ne değişti
Bu düşünmek yararlıdır tf.summary
iki alt API'ler olarak API:
- Kayıt bireysel özetleri için ops kümesi -
summary.scalar()
,summary.histogram()
,summary.image()
,summary.audio()
vesummary.text()
- modeliniz kodundan satır içi denir ki. - Bu bireysel özetleri toplayan ve bunları özel olarak biçimlendirilmiş bir günlük dosyasına yazan yazma mantığı (daha sonra TensorBoard, görselleştirmeler oluşturmak için bunu okur).
TF 1.x'te
Olan iki yarım elle birlikte kablolu göre - ile özet op çıkışları getirecek şekilde Session.run()
ve arama FileWriter.add_summary(output, step)
. v1.summary.merge_all()
op tüm özeti op çıkışları toplamak için bir grafiktir toplama kullanarak bu daha kolay, ancak bu yaklaşım hala, özellikle TF 2.x ters düşen hale istekli uygulama ve kontrol akışı için kötü çalıştı
TF 2.X'te
İki yarısı sıkıca entegre edilmiştir ve şimdi bireysel tf.summary
çalıştırıldığında ops hemen veri yazma. Model kodunuzdaki API'yi kullanmak hala tanıdık görünmelidir, ancak grafik modu uyumlu kalırken artık istekli yürütme için kolay. 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.x'te 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.1633086727.kokoro-gcp-ubuntu-prod-1386032077.31590.0.v2
tf.function grafik yürütmesi 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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.1.v2
Eski TF 1.x grafik yürütmesi 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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.2.v2
Kodunuzu dönüştürme
Varolan dönüştürme tf.summary
böylece TF 2.x API kullanımını güvenilir otomatik olamaz tf_upgrade_v2
komut sadece bunu tüm yeniden yazar tf.compat.v1.summary
. TF 2.x'e geçiş yapmak için kodunuzu aşağıdaki gibi uyarlamanız gerekir:
Aracılığıyla varsayılan yazar seti
.as_default()
kullanımı özeti op mevcut olması gerekir- 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 arasında (henüz) yaymak yoktur
@tf.function
onlar sadece işlev takip edildiğinde algılanır - - yürütme sınırında böylece iyi uygulama çağırmaktırwriter.as_default()
fonksiyonu bünyesinde ve emin olmak için yazar nesne sürece var olmaya devam@tf.function
kullanılıyor
"Adım" değeri ile her bir op geçirilmesi gereken
step
argüman- TensorBoard, verileri bir zaman serisi olarak işlemek için bir adım değeri gerektirir
- TF 1.x'ten global adım kaldırıldığı için açık geçiş gereklidir, bu nedenle her op okumak için istenen adım değişkenini bilmelidir
- Klişe azaltmak için, varsayılan bir adım değerinin kaydedilmesi için deneysel destek olarak kullanılabilir
tf.summary.experimental.set_step()
, ancak bu haber verilmeksizin değiştirilebilir geçici işlevselliği
Bireysel özet operasyonlarının işlev imzaları değişti
- Dönüş değeri artık bir boole (bir özetin gerçekten yazılıp yazılmadığını gösterir)
- İkinci parametre adı (kullanılmış ise) değişti
tensor
içindata
-
collections
parametre kaldırılan olmuştur; koleksiyonlar yalnızca TF 1.x'tir -
family
parametresi kaldırılan olmuştur; Sadece kullanımtf.name_scope()
[Yalnızca eski grafik modu / oturum yürütme kullanıcıları için]
Öncelikle ile yazar başlatmak
v1.Session.run(writer.init())
Kullanım
v1.summary.all_v2_summary_ops()
aracılığıyla onları yürütmek için örneğin, şimdiki grafik için tüm TF 2.x özeti op almak içinSession.run()
İle yazar yıkayın
v1.Session.run(writer.flush())
ve aynı şekilde içinclose()
Senin TF 1.x kod kullanmak yerine ise tf.contrib.summary
API böylece, o TF 2.x API çok daha benzer tf_upgrade_v2
komut herhangi kullanım için göç adımların çoğu (ve yayarlar uyarı ve hataları otomatik olacağı olamaz tamamen taşınmalıdır). Çoğunlukla sadece API çağrıları yeniden yazar tf.compat.v2.summary
; Yalnızca TF 2.x ile uyumluluk gerekiyorsa bırakın compat.v2
ve tıpkı başvurmak tf.summary
.
Ek ipuçları
Yukarıdaki kritik alanlara ek olarak, bazı yardımcı yönler de değişti:
Koşullu kayıt ("her 100 adımda bir günlüğe kaydet" gibi) yeni bir görünüme sahip
- Kontrol ops ve ilişkili kod, (istekli modunda ve çalışan bir düzenli eğer açıklamada onları sarmak için
@tf.function
imza aracılığıyla ) ya da birtf.cond
- Sadece özetleri kontrol etmek için, yeni kullanmak
tf.summary.record_if()
bağlam yöneticisi, ve bu seçtiğiniz boole durumunu geçmesi Bunlar TF 1.x modelinin yerini alır:
if condition: writer.add_summary()
- Kontrol ops ve ilişkili kod, (istekli modunda ve çalışan bir düzenli eğer açıklamada onları sarmak için
Hayır doğrudan yazma
tf.compat.v1.Graph
- yerine kullanılması iz işlevleri- TF 2.x kullanımlarda Grafik yürütme
@tf.function
yerine açık grafiği - TF 2.x olarak, yeni izleme tarzı API'leri kullanmak
tf.summary.trace_on()
vetf.summary.trace_export()
yürütülen fonksiyon grafikleri kaydetmek için
- TF 2.x kullanımlarda Grafik yürütme
İle LogDir başına Artık küresel yazar önbelleğe alma
tf.summary.FileWriterCache
- (İkincisi ise için TensorBoard desteği Kullanıcılar ya yazar nesnelerin paylaşımı / kendi önbelleğe uygulamak, ya da sadece ayrı yazarlar kullanmalıdır sürüyor )
Olay dosyası ikili gösterimi değişti
- TensorBoard 1.x zaten yeni formatı desteklemektedir; bu fark yalnızca olay dosyalarından özet verileri manuel olarak ayrıştıran kullanıcıları etkiler
- Özet veriler artık tensör baytları olarak saklanmaktadır; Kullanabileceğiniz
tf.make_ndarray(event.summary.value[0].tensor)
Numpy dönüştürmek