TensorFlow Hub, 2018'deki lansmanında tek bir varlık türü sundu: TensorFlow 1 programlarına içe aktarmak için TF1 Hub biçimi.
Bu sayfa,
hub.Module TF1 Hub biçiminin (veya
hub.Module TF1 uyumluluk modunun)
hub.Module sınıfıyla ve ilişkili API'lerle nasıl kullanılacağını açıklar. (Tipik örneği inşa etmek
tf.Graph muhtemelen bir TF1 içinde
Estimator ile TF1 Hub biçiminde bir veya daha fazla modelin birleştirilmesiyle,
tf.compat.layers veya
tf.layers ).
TensorFlow 2 (TF1 uyumluluk modu dışında) kullanıcıları
hub.load() veya
hub.KerasLayer ile yeni API'yı kullanmalıdır. Yeni API, yeni TF2 SavedModel varlık türünü yükler, ancak TF1 Hub biçimini TF2'ye yüklemek için sınırlı desteğe sahiptir.
TF1 Hub biçiminde bir model kullanma
Bir modeli TF1 Hub biçiminde örnekleme
TF1 Hub biçimindeki bir model, URL veya dosya sistemi yolu ile bir dizeden bir
hub.Module nesnesi oluşturularak TensorFlow programına içe aktarılır:
m = hub.Module("path/to/a/module_dir")
Bu, modülün değişkenlerini geçerli TensorFlow grafiğine ekler. Başlatıcılarını çalıştırmak, önceden eğitilmiş değerlerini diskten okuyacaktır. Aynı şekilde, tabloya ve diğer durum grafiğe eklenir.
Önbellek Modülleri
Bir URL'den modül oluştururken, modül içeriği indirilir ve yerel sistem geçici dizininde önbelleğe alınır. Modüllerin önbelleğe alındığı konum,
TFHUB_CACHE_DIR ortam değişkeni kullanılarak geçersiz kılınabilir. Ayrıntılar için bkz. Önbellekleme .
Modül Uygulama
Bir kez başlatıldığında,
m modülü, tensör girişlerinden tensör çıkışlarına kadar bir Python işlevi gibi sıfır veya daha fazla kez çağrılabilir:
y = m(x)
Bu tür her bir arama işlem mevcut TensorFlow grafik işlemleri ekler
y den
x . Bu, eğitimli ağırlıkları olan değişkenleri içeriyorsa, bunlar tüm uygulamalar arasında paylaşılır.
Modüller, birden fazla şekilde uygulanmasına izin vermek için adlandırılmış birden çok imza tanımlayabilir (Python nesnelerinin yöntemlerine benzer). Bir modülün belgeleri mevcut imzaları tanımlamalıdır. Yukarıdaki çağrı
"default" adlı imzayı uygular. Herhangi bir imza, adı isteğe bağlı
signature= bağımsız değişkenine geçirilerek seçilebilir.
Bir imzanın birden fazla girişi varsa, bunların imza tarafından tanımlanan anahtarlar ile bir dikte olarak geçirilmesi gerekir. Benzer şekilde, bir imzanın birden çok çıktısı varsa, bunlar imza tarafından tanımlanan tuşların altında
as_dict=True bir dict olarak alınabilir (
as_dict=False ise döndürülen tek çıktı için
"default" anahtarıdır). Bu yüzden bir Modül uygulamanın en genel şekli şöyledir:
outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True) y1 = outputs["cats"] y2 = outputs["dogs"]
Arayan, imza ile tanımlanan tüm girişleri sağlamalıdır, ancak bir modülün tüm çıkışlarını kullanma zorunluluğu yoktur. TensorFlow, modülün yalnızca
tf.Session.run() içinde bir hedefin bağımlılıkları olarak sonuçlanan kısımlarını çalıştırır. Aslında, modül yayıncıları, ana çıktılarla birlikte gelişmiş kullanımlar için (ara katmanların etkinleştirilmesi gibi) çeşitli çıktılar sağlamayı seçebilirler. Modül tüketicileri ek çıktıları nazikçe ele almalıdır.
Alternatif modülleri denemek
Aynı görev için birden fazla modül olduğunda, TensorFlow Hub, bunları uyumlu imzalarla (arayüzler) donatmaya teşvik eder, böylece farklı olanları denemek, modül tanıtıcısını dize değerli bir hiperparametre gibi değiştirmek kadar kolaydır.
Bu amaçla, popüler görevler için önerilen Ortak İmzalar koleksiyonunu tutuyoruz.
Yeni Bir Modül Oluşturma
Uyumluluk notu
TF1 Hub biçimi TensorFlow 1'e yöneliktir. TensorFlow 2'deki TF Hub tarafından yalnızca kısmen desteklenir. Lütfen bunun yerine yeni TF2 SavedModel formatında yayınlamayı düşünün.
TF1 Hub formatı, sözdizimsel düzeyde (aynı dosya adları ve protokol mesajları) TensorFlow 1'in SavedModel formatına benzer, ancak modülün yeniden kullanılmasına, kompozisyona ve yeniden eğitime izin vermek için semantik olarak farklıdır (örneğin, kaynak başlatıcıların farklı depolanması, farklı etiketleme) metagraf kuralları). Onları diskte ayırmanın en kolay yolu
tfhub_module.pb dosyasının varlığı veya yokluğudur.
Genel yaklaşım
Yeni bir modül tanımlamak için, bir yayıncı çağırır
hub.create_module_spec() bir fonksiyonu
module_fn . Bu işlev, arayan tarafından sağlanacak girişler için
tf.placeholder() yöntemini kullanarak modülün dahili yapısını temsil eden bir grafik oluşturur. Ardından
hub.add_signature(name, inputs, outputs) bir veya daha çok kez çağırarak imzaları tanımlar.
Örneğin:
def module_fn(): inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50]) layer1 = tf.layers.dense(inputs, 200) layer2 = tf.layers.dense(layer1, 100) outputs = dict(default=layer2, hidden_activations=layer1) # Add default signature. hub.add_signature(inputs=inputs, outputs=outputs) ... spec = hub.create_module_spec(module_fn)
hub.create_module_spec() , bir modül yerine belirli bir TensorFlow grafiği içinde örnek oluşturmak için kullanılabilir. Böyle bir durumda kontrol noktası yoktur ve modül örneği bunun yerine değişken başlatıcıları kullanır.
Herhangi bir modül örneği,
export(path, session) yöntemiyle diske serileştirilebilir. Bir modülü dışa aktarmak, tanımını
session değişkenlerinin geçerli durumu ile birlikte geçirilen yola serileştirir. Bu, bir modülü ilk kez dışa aktarırken ve ince ayarlı bir modülü dışa aktarırken kullanılabilir.
TensorFlow Tahminleyicileri ile uyumluluk için
hub.LatestModuleExporter son kontrol noktasından, tıpkı ihracat modülleri
tf.estimator.LatestExporter son kontrol noktasından bütün modelin ihraç ediyor.
Modül yayıncıları, mümkün olduğunda ortak bir imza uygulamalıdır, böylece tüketiciler kolayca modül alışverişi yapabilir ve sorunları için en iyisini bulabilirler.
Gerçek örnek
Ortak bir metin yerleştirme biçiminden nasıl modül oluşturulacağına dair gerçek dünya örneği için metin yerleştirme modülü ihracatçımıza bir göz atın.
İnce ayar
İçe aktarılan bir modülün değişkenlerini, etrafındaki modelinkilerle birlikte eğitmeye ince ayar denir. İnce ayar daha iyi kaliteye neden olabilir, ancak yeni komplikasyonlar ekler. Tüketicilere ince ayar yapmayı ancak daha basit kalite ayarlamalarını keşfettikten sonra ve yalnızca modül yayıncısı tavsiye ettiğinde bakmalarını öneriyoruz.
Tüketiciler İçin
İnce ayar etkinleştirmek için birlikte modülü örneğini
hub.Module(..., trainable=True) onun değişkenleri eğitilebilir yapmak ve ithalat TensorFlow en etmek
REGULARIZATION_LOSSES . Modülde birden fazla grafik varyantı varsa, antrenmana uygun olanı seçtiğinizden emin olun. Genellikle,
{"train"} etiketli olan budur.
Önceden eğitilmiş ağırlıkları bozmayan bir eğitim rejimi seçin, örneğin sıfırdan eğitime göre daha düşük bir öğrenme oranı.
Yayıncılar için
İnce ayarları tüketiciler için kolaylaştırmak için lütfen aşağıdakilere dikkat edin:
İnce ayarın düzenli hale getirilmesi gerekir. Sizin modülü ile ihraç edilmektedir
REGULARIZATION_LOSSESseçiminiz koyar budur toplanması,
tf.layers.dense(..., kernel_regularizer=...)tüketici aldığı içine ne vb
tf.losses.get_regularization_losses(). L1 / L2 düzenlenme kayıplarını tanımlamanın bu yolunu tercih edin.
Yayıncı modelinde,
tf.train.FtrlOptimizer,
tf.train.ProximalGradientDescentOptimizerve diğer proksimal optimize
tf.train.ProximalGradientDescentOptimizer
l1_ve
l2_regularization_strengthparametreleri aracılığıyla L1 / L2 düzenlemesini tanımlamaktan kaçının. Bunlar modülle birlikte dışa aktarılmaz ve global olarak düzenli güçlendirme ayarlamak tüketici için uygun olmayabilir. Geniş (yani seyrek doğrusal) veya geniş ve derin modellerde L1 düzenlenmesi dışında, bunun yerine bireysel düzenlenme kayıplarını kullanmak mümkün olmalıdır.
Bırakma, parti normalizasyonu veya benzer eğitim teknikleri kullanıyorsanız, hiperparametrelerini beklenen birçok kullanımda anlamlı olan değerlere ayarlayın. Bırakma oranının hedef sorunun aşırı takılma eğilimine göre ayarlanması gerekebilir. Parti normalleştirmesinde, momentum (çürüme katsayısı olarak da bilinir), küçük veri kümeleri ve / veya büyük gruplar ile ince ayar yapılabilmesini sağlayacak kadar küçük olmalıdır. Gelişmiş tüketiciler için, kritik hiperparametreler üzerinde kontrol sağlayan bir imza eklemeyi düşünün.