Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Format Hub TF1

Saat diluncurkan pada tahun 2018, TensorFlow Hub menawarkan satu jenis aset: format TF1 Hub untuk diimpor ke program TensorFlow 1.

Halaman ini menjelaskan cara menggunakan format Hub TF1 di TF1 (atau mode kompatibilitas TF1 dari TF2) dengan hub.Module class dan API terkait. (Penggunaan khas adalah untuk membangun tf.Graph , mungkin di dalam Estimator TF1, dengan menggabungkan satu atau lebih model dalam format TF1 Hub dengan tf.compat.layers atau tf.layers ).

Pengguna TensorFlow 2 (di luar mode kompatibilitas TF1) harus menggunakan API baru dengan hub.load() atau hub.KerasLayer . API baru memuat jenis aset TF2 SavedModel baru, tetapi juga memiliki dukungan terbatas untuk memuat format Hub TF1 ke TF2 .

Menggunakan model dalam format TF1 Hub

Instantiating model dalam format TF1 Hub

Model dalam format TF1 Hub diimpor ke program TensorFlow dengan membuat hub.Module Objek hub.Module dari string dengan URL atau jalur sistem file, seperti:

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

Ini menambahkan variabel modul ke grafik TensorFlow saat ini. Menjalankan inisialisasi mereka akan membaca nilai pra-dilatihnya dari disk. Demikian juga, tabel dan status lainnya ditambahkan ke grafik.

Modul Caching

Saat membuat modul dari URL, konten modul diunduh dan di-cache di direktori sementara sistem lokal. Lokasi di mana modul di-cache dapat ditimpa menggunakan variabel lingkungan TFHUB_CACHE_DIR . Untuk detailnya, lihat Caching .

Menerapkan Modul

Setelah instantiated, modul m dapat disebut nol atau lebih seperti fungsi Python dari input tensor ke output tensor:

 y = m(x)
 

Setiap panggilan seperti itu menambahkan operasi ke grafik TensorFlow saat ini untuk menghitung y dari x . Jika ini melibatkan variabel dengan bobot yang terlatih, ini dibagi antara semua aplikasi.

Modul dapat mendefinisikan beberapa tanda tangan bernama untuk memungkinkan diterapkan dalam lebih dari satu cara (mirip dengan bagaimana objek Python memiliki metode ). Dokumentasi modul harus menggambarkan tanda tangan yang tersedia. Panggilan di atas berlaku tanda tangan bernama "default" . Setiap tanda tangan dapat dipilih dengan memberikan namanya ke argumen signature= opsional.

Jika tanda tangan memiliki beberapa input, input tersebut harus diberikan sebagai dict, dengan kunci yang ditentukan oleh tanda tangan. Demikian juga, jika tanda tangan memiliki beberapa output, ini dapat diambil sebagai dict dengan mengirimkan as_dict=True , di bawah tombol yang ditentukan oleh tanda tangan (kunci "default" adalah untuk output tunggal yang dikembalikan jika as_dict=False ). Jadi bentuk paling umum dari penerapan Modul terlihat seperti:

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

Penelepon harus menyediakan semua input yang ditentukan oleh tanda tangan, tetapi tidak ada persyaratan untuk menggunakan semua output modul. TensorFlow hanya akan menjalankan bagian-bagian modul yang berakhir sebagai dependensi target di tf.Session.run() . Memang, penerbit modul dapat memilih untuk menyediakan berbagai output untuk penggunaan tingkat lanjut (seperti aktivasi lapisan menengah) bersama dengan output utama. Modul konsumen harus menangani output tambahan dengan anggun.

Mencoba modul alternatif

Setiap kali ada beberapa modul untuk tugas yang sama, TensorFlow Hub mendorong untuk melengkapinya dengan signartures yang kompatibel (antarmuka) sehingga mencoba yang berbeda semudah memvariasikan pegangan modul sebagai hyperparameter yang bernilai string.

Untuk tujuan ini, kami memelihara koleksi Tanda Tangan Umum yang direkomendasikan untuk tugas-tugas populer.

Membuat Modul Baru

Catatan kompatibilitas

Format TF1 Hub diarahkan ke TensorFlow 1. Ini hanya didukung sebagian oleh TF Hub di TensorFlow 2. Sebagai gantinya, pertimbangkan untuk menerbitkan dalam format TF2 SavedModel yang baru.

Format TF1 Hub mirip dengan format SavedModel dari TensorFlow 1 pada tingkat sintaksis (nama file dan pesan protokol yang sama) tetapi berbeda secara semestinya untuk memungkinkan penggunaan kembali, komposisi, dan pelatihan ulang modul (mis. Penyimpanan berbagai inisialisasi sumber daya, penandaan berbeda) konvensi untuk metagraf). Cara termudah untuk membedakan mereka pada disk adalah ada atau tidaknya file tfhub_module.pb .

Pendekatan umum

Untuk mendefinisikan modul baru, penerbit memanggil hub.create_module_spec() dengan module_fn fungsi. Fungsi ini menyusun grafik yang mewakili struktur internal modul, menggunakan tf.placeholder() untuk input yang akan disediakan oleh pemanggil. Kemudian mendefinisikan tanda tangan dengan memanggil hub.add_signature(name, inputs, outputs) satu atau lebih kali.

Sebagai contoh:

 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)
 

Hasil hub.create_module_spec() dapat digunakan, alih-alih jalur, untuk membuat instance objek modul dalam grafik TensorFlow tertentu. Dalam kasus seperti itu, tidak ada pos pemeriksaan, dan instance modul akan menggunakan inisialisasi variabel sebagai gantinya.

Setiap instance modul dapat diserialisasi ke disk melalui metode export(path, session) . Mengekspor modul membuat serialisasi definisinya bersama-sama dengan status variabel saat ini dalam session ke jalur yang dilewati. Ini dapat digunakan saat mengekspor modul untuk pertama kalinya, serta saat mengekspor modul yang disetel dengan baik.

Untuk kompatibilitas dengan TensorFlow Estimators, hub.LatestModuleExporter mengekspor modul dari pos pemeriksaan terbaru, seperti tf.estimator.LatestExporter mengekspor seluruh model dari pos pemeriksaan terbaru.

Penerbit modul harus menerapkan tanda tangan yang umum jika memungkinkan, sehingga konsumen dapat dengan mudah bertukar modul dan menemukan yang terbaik untuk masalah mereka.

Contoh nyata

Lihatlah eksportir modul penyematan teks kami untuk contoh dunia nyata tentang cara membuat modul dari format penyematan teks biasa.

Mencari setelan

Pelatihan variabel dari modul yang diimpor bersama-sama dengan orang-orang dari model di sekitarnya disebut fine-tuning . Fine-tuning dapat menghasilkan kualitas yang lebih baik, tetapi menambah komplikasi baru. Kami menyarankan konsumen untuk mencari fine-tuning hanya setelah menjelajahi tweak kualitas yang lebih sederhana, dan hanya jika penerbit modul merekomendasikannya.

Untuk Konsumen

Untuk mengaktifkan fine-tuning, instantiate modul dengan hub.Module(..., trainable=True) untuk membuat variabelnya bisa dilatih dan mengimpor REGULARIZATION_LOSSES dari REGULARIZATION_LOSSES . Jika modul memiliki beberapa varian grafik, pastikan untuk memilih yang sesuai untuk pelatihan. Biasanya, itu yang berisi tag {"train"} .

Pilih rezim pelatihan yang tidak merusak bobot pra-pelatihan, misalnya, tingkat belajar yang lebih rendah daripada pelatihan dari awal.

Untuk Penerbit

Untuk mempermudah penyesuaian bagi konsumen, harap perhatikan hal-hal berikut:

  • Penyesuaian membutuhkan pengaturan. Modul Anda diekspor dengan koleksi REGULARIZATION_LOSSES , yang merupakan pilihan Anda untuk tf.layers.dense(..., kernel_regularizer=...) dll. Ke dalam apa yang diperoleh konsumen dari tf.losses.get_regularization_losses() . Lebih suka cara mendefinisikan kerugian regularisasi L1 / L2.

  • Dalam model penerbit, menghindari mendefinisikan L1 / L2 regularisasi melalui l1_ dan l2_regularization_strength parameter tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer , dan pengoptimalan proksimal lainnya. Ini tidak diekspor bersama modul, dan pengaturan kekuatan regularisasi secara global mungkin tidak sesuai untuk konsumen. Kecuali untuk regularisasi L1 dalam model lebar (yaitu linier sparse) atau model lebar & dalam, seharusnya dimungkinkan untuk menggunakan kerugian regularisasi individu sebagai gantinya.

  • Jika Anda menggunakan dropout, normalisasi bets, atau teknik pelatihan serupa, setel hiperparameternya ke nilai yang masuk akal di banyak kegunaan yang diharapkan. Tingkat putus sekolah mungkin harus disesuaikan dengan kecenderungan masalah target untuk overfitting. Dalam normalisasi batch, momentum (alias koefisien peluruhan) harus cukup kecil untuk memungkinkan fine-tuning dengan dataset kecil dan / atau batch besar. Untuk konsumen tingkat lanjut, pertimbangkan untuk menambahkan tanda tangan yang memperlihatkan kendali atas hiperparameter kritis.