2018'deki lansmanında TensorFlow Hub, tek bir varlık türü sundu: TensorFlow 1 programlarına içe aktarma için TF1 Hub formatı.
Bu sayfa, TF1'de (veya TF2'nin TF1 uyumluluk modunda) TF1 Hub formatının
hub.Module sınıfı ve ilgili API'ler ile nasıl kullanılacağını açıklar. (Tipik kullanım, TF1 Hub formatındaki bir veya daha fazla modeli
tf.compat.layers veya
tf.layers ile birleştirerek, muhtemelen bir TF1
Estimator içinde bir
tf.Graph oluşturmaktır).
TensorFlow 2 kullanıcıları (TF1 uyumluluk modu dışında) yeni API'yi
hub.load() veya
hub.KerasLayer ile 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 formatında bir model kullanma
TF1 Hub formatında bir model örneği oluşturma
TF1 Hub biçimindeki bir model, URL'si veya dosya sistemi yolu ile bir dizeden
hub.Module nesnesi oluşturularak bir TensorFlow programına içe aktarılır, örneğin:
m = hub.Module("path/to/a/module_dir")
Bu, modülün değişkenlerini mevcut TensorFlow grafiğine ekler. Başlatıcılarını çalıştırmak, önceden eğitilmiş değerlerini diskten okuyacaktır. Aynı şekilde tablolar ve diğer durumlar da grafiğe eklenir.
Önbelleğe Alma 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. Önbelleğe Alma .
Modül Uygulama
Bir kez başlatıldığında, bir
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 çağrı,
x
y hesaplamak için mevcut TensorFlow grafiğine işlemler ekler. Bu, eğitilmiş ağırlıklara sahip değişkenleri içeriyorsa, bunlar tüm uygulamalar arasında paylaşılır.
Modüller, birden fazla şekilde uygulanmaya izin vermek için birden çok adlandırılmış imza tanımlayabilir (Python nesnelerinin yöntemlere sahip olmasına benzer şekilde). 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 imza tarafından tanımlanan anahtarlarla bir dikte olarak geçirilmelidir. Benzer şekilde, bir imzanın birden fazla çıktısı varsa, bunlar imza tarafından tanımlanan anahtarlar altında
as_dict=True bir dict olarak alınabilir (
"default" anahtarı, eğer
as_dict=False döndürülürse tek çıktı içindir). Dolayısıyla, bir Modül uygulamanın en genel şekli şöyle görünür:
outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True) y1 = outputs["cats"] y2 = outputs["dogs"]
Bir arayan, bir 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çindeki bir hedefin bağımlılıkları olarak sonuçlanan kısımlarını çalıştıracaktır. Aslında modül yayıncıları, ana çıktılarla birlikte ileri düzey kullanımlar (ara katmanların etkinleştirilmesi gibi) için çeşitli çıktılar sağlamayı seçebilir. Modül tüketicileri, ek çıktıları zarif bir şekilde 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, dize değerli bir hiperparametre olarak modül tutamağını değiştirmek kadar kolay olur.
Bu amaçla, popüler görevler için önerilen Ortak İmzalar koleksiyonunu sürdürüyoruz.
Yeni Modül Oluşturma
Uyumluluk notu
TF1 Hub formatı 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ımına, oluşturulmasına ve yeniden eğitilmesine (örneğin, kaynak başlatıcıların farklı depolanması, farklı etiketleme) izin vermek için anlamsal olarak farklıdır. metagraflar için kurallar). Bunları 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ı, module_fn işleviyle
module_fn
hub.create_module_spec() çağırır. Bu işlev, arayan tarafından sağlanacak girdiler için
tf.placeholder() kullanarak modülün iç yapısını temsil eden bir grafik oluşturur. Ardından
hub.add_signature(name, inputs, outputs) bir veya birkaç kez çağrılarak 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() 'in sonucu, belirli bir TensorFlow grafiği içinde bir modül nesnesini başlatmak için yol yerine 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 seri hale getirilebilir. Bir modülü dışa aktarmak, tanımını,
session değişkenlerinin geçerli durumu ile birlikte geçirilen yola seri hale getirir. Bu, bir modülü ilk kez dışa aktarırken ve ayrıca ince ayarlı bir modülü dışa aktarırken kullanılabilir.
TensorFlow Tahmincileri ile uyumluluk için
hub.LatestModuleExporter , modülleri en son kontrol noktasından dışa aktarır, tıpkı
tf.estimator.LatestExporter en son kontrol noktasından tüm modeli dışa aktarır.
Modül yayıncıları, tüketicilerin modülleri kolayca değiştirebilmeleri ve sorunları için en iyisini bulabilmeleri için mümkün olduğunda ortak bir imza uygulamalıdır.
gerçek örnek
Ortak bir metin gömme biçiminden bir modülün nasıl oluşturulacağına dair gerçek dünyadan bir örnek için metin gömme modülü dışa aktarıcımıza bir göz atın.
İnce ayar
İçe aktarılan bir modülün değişkenlerini, etrafındaki modelin değişkenleriyle birlikte eğitmeye ince ayar denir. İnce ayar daha iyi kalite sağlayabilir, ancak yeni komplikasyonlar ekler. Tüketicilere, yalnızca daha basit kalite ince ayarlarını keşfettikten sonra ve yalnızca modül yayıncısı önerdiği takdirde ince ayar yapmalarını öneriyoruz.
Tüketiciler için
İnce ayarı etkinleştirmek için, değişkenlerini eğitilebilir hale getirmek için
hub.Module(..., trainable=True) ile modülü somutlaştırın ve TensorFlow'un
REGULARIZATION_LOSSES öğesini içe aktarın. Modülün birden fazla grafik varyantı varsa, eğitim için uygun olanı seçtiğinizden emin olun. Genellikle,
{"train"} etiketli olan budur.
Önceden eğitilmiş ağırlıkları mahvetmeyen bir eğitim rejimi seçin, örneğin sıfırdan eğitimden daha düşük bir öğrenme oranı.
Yayıncılar için
Tüketiciler için ince ayarı kolaylaştırmak için lütfen aşağıdakilere dikkat edin:
İnce ayar düzenleme gerektirir. Modülünüz
REGULARIZATION_LOSSESkoleksiyonuyla dışa aktarılır; bu,
tf.layers.dense(..., kernel_regularizer=...)vb. seçiminizi tüketicinin
tf.losses.get_regularization_losses()aldığı şeye yerleştiren şeydir. L1/L2 düzenleme kayıplarını tanımlamanın bu yolunu tercih edin.
Yayıncı modelinde,
tf.train.FtrlOptimizer,
tf.train.ProximalGradientDescentOptimizerve diğer yakın iyileştiricilerin
l1_ve
l2_regularization_strengthparametreleri aracılığıyla L1/L2 düzenlileştirmesini tanımlamaktan kaçının. Bunlar modülle birlikte dışa aktarılmaz ve küresel olarak düzenleme güçlerinin ayarlanması tüketici için uygun olmayabilir. Geniş (yani seyrek doğrusal) veya geniş ve derin modellerdeki L1 düzenlileştirme dışında, bunun yerine bireysel düzenlileştirme kayıplarının kullanılması mümkün olmalıdır.
Bırakma, toplu normalleştirme veya benzer eğitim teknikleri kullanıyorsanız, hiperparametrelerini birçok beklenen kullanımda anlamlı olan değerlere ayarlayın. Bırakma oranının, hedef problemin aşırı uydurma eğilimine göre ayarlanması gerekebilir. Toplu normalleştirmede, momentum (diğer adıyla bozunma katsayısı), küçük veri kümeleri ve/veya büyük gruplarla ince ayar yapılmasına olanak sağlayacak kadar küçük olmalıdır. Gelişmiş tüketiciler için, kritik hiperparametreler üzerinde kontrolü ortaya çıkaran bir imza eklemeyi düşünün.