TF1 Hub formatı

TensorFlow Hub, 2018'deki lansmanında tek bir varlık türü sundu: TensorFlow 1 programlarına içe aktarma için TF1 Hub formatı.

Bu sayfada TF1 Hub formatının TF1'de (veya TF2'nin TF1 uyumluluk modunda) hub.Module sınıfı ve ilgili API'lerle nasıl kullanılacağı açıklanmaktadır. (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 aynı zamanda TF1 Hub formatının TF2'ye yüklenmesine yönelik sınırlı desteğe sahiptir.

TF1 Hub formatında bir model kullanma

TF1 Hub formatında bir modeli örneklendirme

TF1 Hub formatındaki bir model, URL'si veya dosya sistemi yolu ile bir dizeden bir hub.Module nesnesi oluşturularak TensorFlow programına içe aktarılır; örneğin:

m = hub.Module("path/to/a/module_dir")

Not: Diğer geçerli tanıtıcı türleriyle ilgili daha fazla bilgiyi burada bulabilirsiniz.

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 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 sistemin 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 çağrıların her biri, mevcut TensorFlow grafiğine x y hesaplamak için işlemler ekler. Eğer 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 fazla adlandırılmış imza tanımlayabilir (Python nesnelerinin yöntemlerine benzer şekilde). Bir modülün dokümantasyonu mevcut imzaları açıklamalıdır. Yukarıdaki çağrı "default" adlı imzayı uygular. Herhangi bir imza, adını isteğe bağlı signature= bağımsız değişkenine ileterek seçilebilir.

Bir imzanın birden fazla girişi varsa, bunların imza tarafından tanımlanan anahtarlarla bir dikte olarak iletilmesi gerekir. Benzer şekilde, bir imzanın birden fazla çıktısı varsa, bunlar imza tarafından tanımlanan anahtarların altına as_dict=True geçirilerek bir dict olarak alınabilir ( "default" anahtarı as_dict=False ise döndürülen tek çıktı içindir). Yani bir Modülü uygulamanın en genel şekli şuna benzer:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

Arayanın imzayla tanımlanan tüm girişleri sağlaması gerekir, ancak 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. Gerçekten de modül yayıncıları, ana çıktıların yanı sıra ileri düzey 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ı dikkatli 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) donatmayı teşvik eder; böylece farklı olanları denemek, dize değerli bir hiperparametre olarak modül tutamacını değiştirmek kadar kolay olur.

Bu amaçla, popüler görevler için önerilen Ortak İmzalardan oluşan bir koleksiyon bulunduruyoruz.

Yeni Bir 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, kompozisyonuna ve yeniden eğitimine izin vermek için anlamsal olarak farklıdır (örneğin, kaynak başlatıcıların farklı depolanması, farklı etiketleme). 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 yayıncı, module_fn işleviyle hub.create_module_spec() öğesini çağırır. Bu işlev, arayan tarafından sağlanacak girişler için tf.placeholder() işlevini kullanarak modülün iç yapısını temsil eden bir grafik oluşturur. Daha sonra bir veya daha fazla kez hub.add_signature(name, inputs, outputs) ç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() 'in sonucu, belirli bir TensorFlow grafiğinde bir modül nesnesinin örneğini oluşturmak 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öntemi aracılığıyla diske serileştirilebilir. Bir modülün dışarı aktarılması, tanımını, session değişkenlerinin geçerli durumuyla birlikte geçirilen yola serileştirir. 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 Tahmincileriyle uyumluluk için hub.LatestModuleExporter , tıpkı tf.estimator.LatestExporter en son kontrol noktasından tüm modeli dışarı aktardığı gibi, modülleri en son kontrol noktasından dışarı aktarır.

Modül yayıncıları mümkün olduğunda ortak bir imza uygulamalıdır, böylece tüketiciler modülleri kolayca değiştirebilir ve sorunlarına en uygun olanı bulabilirler.

Gerçek örnek

Yaygın bir metin gömme formatından nasıl modül oluşturulacağına ilişkin 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 kaliteyle sonuçlanabilir ancak yeni zorluklar ekler. Tüketicilere, yalnızca daha basit kalite ayarlarını keşfettikten sonra ve yalnızca modül yayıncısının tavsiye etmesi durumunda ince ayar yapmalarını tavsiye ediyoruz.

Tüketiciler için

İnce ayarı etkinleştirmek için, değişkenlerini eğitilebilir hale getirmek üzere modülü hub.Module(..., trainable=True) ile başlatın ve TensorFlow'un REGULARIZATION_LOSSES içe aktarın. Modülün birden fazla grafik çeşidi varsa eğitim için uygun olanı seçtiğinizden emin olun. Genellikle {"train"} etiketlerine sahip 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

Tüketiciler için ince ayarı kolaylaştırmak amacıyla lütfen aşağıdakilere dikkat edin:

  • İnce ayarın düzenlileştirilmesi gerekir. Modülünüz REGULARIZATION_LOSSES koleksiyonuyla birlikte dışa aktarılır; bu tf.layers.dense(..., kernel_regularizer=...) vb. seçiminizi tüketicinin tf.losses.get_regularization_losses() öğesinden elde ettiği şeye yerleştirir. L1/L2 düzenleme kayıplarını tanımlamak için bu yolu tercih edin.

  • Yayımcı modelinde, tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer ve diğer yakınsal optimize edicilerin l1_ ve l2_regularization_strength parametreleri aracılığıyla L1/L2 düzenlemesini tanımlamaktan kaçının. Bunlar modülle birlikte dışa aktarılmaz ve düzenleme güçlerinin global olarak belirlenmesi tüketici için uygun olmayabilir. Geniş (yani seyrek doğrusal) veya geniş ve derin modellerdeki L1 düzenlemesi dışında, bunun yerine bireysel düzenleme kayıplarını kullanmak mümkün olmalıdır.

  • Bırakma, toplu normalleştirme veya benzer eğitim teknikleri kullanıyorsanız bunların hiperparametrelerini, beklenen birçok kullanım için anlamlı olan değerlere ayarlayın. Bırakma oranının, hedef problemin aşırı uyum eğilimine göre ayarlanması gerekebilir. Toplu normalleştirmede momentumun (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 olması gerekir. İleri düzey kullanıcılar için, kritik hiperparametreler üzerindeki kontrolü açığa çıkaran bir imza eklemeyi düşünün.