TF1 Hub formatı

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_LOSSES koleksiyonuyla 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.ProximalGradientDescentOptimizer ve diğer yakın iyileştiricilerin l1_ ve l2_regularization_strength parametreleri 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.