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 TF1 Hub di TF1 (atau mode kompatibilitas TF1 dari TF2) dengan kelas hub.Module dan API terkait. (Penggunaan umum adalah untuk membangun tf.Graph , mungkin di dalam TF1 Estimator , 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 TF1 Hub ke TF2 .

Menggunakan model dalam format TF1 Hub

Membuat instance model dalam format TF1 Hub

Model dalam format TF1 Hub diimpor ke program hub.Module dengan membuat hub. Objek modul 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 yang telah dilatih sebelumnya 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 diganti menggunakan variabel lingkungan TFHUB_CACHE_DIR . Untuk detailnya, lihat Caching .

Menerapkan Modul

Setelah dipakai, modul m dapat dipanggil nol kali atau lebih seperti fungsi Python dari input tensor ke output tensor:

y = m(x)

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

Modul dapat mendefinisikan beberapa tanda tangan bernama untuk memungkinkan diterapkan di lebih dari satu cara (mirip dengan bagaimana objek Python memiliki metode ). Dokumentasi modul harus menjelaskan tanda tangan yang tersedia. Panggilan di atas menerapkan tanda tangan bernama "default" . Tanda tangan apa pun dapat dipilih dengan meneruskan namanya ke argumen opsional signature= .

Jika tanda tangan memiliki banyak input, input tersebut harus diteruskan sebagai dict, dengan kunci yang ditentukan oleh tanda tangan. Demikian juga, jika tanda tangan memiliki beberapa keluaran, ini dapat diambil sebagai dict dengan meneruskan as_dict=True , di bawah kunci yang ditentukan oleh tanda tangan (kunci "default" adalah untuk satu keluaran 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"]

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

Mencoba modul alternatif

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

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

Membuat Modul Baru

Catatan kompatibilitas

Format TF1 Hub ditujukan untuk TensorFlow 1. Ini hanya didukung sebagian oleh TF Hub di TensorFlow 2. Harap pertimbangkan untuk memublikasikan 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 secara semantik berbeda untuk memungkinkan penggunaan kembali modul, komposisi, dan pelatihan ulang (mis., penyimpanan penginisialisasi sumber daya yang berbeda, penandaan yang berbeda konvensi untuk metagraf). Cara termudah untuk membedakannya di disk adalah ada atau tidaknya file tfhub_module.pb .

Pendekatan umum

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

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 dari hub.create_module_spec() dapat digunakan, sebagai ganti 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 serial definisinya bersama dengan status variabelnya saat ini dalam session ke jalur yang dilewati. Ini dapat digunakan saat mengekspor modul untuk pertama kalinya, serta saat mengekspor modul yang disesuaikan.

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

Penerbit modul harus menerapkan tanda tangan 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 umum.

Mencari setelan

Melatih variabel dari modul yang diimpor bersama dengan model di sekitarnya disebut fine-tuning . Penyetelan halus dapat menghasilkan kualitas yang lebih baik, tetapi menambah komplikasi baru. Kami menyarankan konsumen untuk melihat ke fine-tuning hanya setelah menjelajahi tweak kualitas yang lebih sederhana, dan hanya jika penerbit modul merekomendasikannya.

Untuk Konsumen

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

Pilih rezim pelatihan yang tidak merusak beban pra-latihan, misalnya, tingkat pembelajaran yang lebih rendah daripada pelatihan dari awal.

Untuk Penerbit

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

  • Fine-tuning membutuhkan regularisasi. Modul Anda diekspor dengan koleksi REGULARIZATION_LOSSES , yang menempatkan pilihan Anda dari tf.layers.dense(..., kernel_regularizer=...) dll. ke dalam apa yang didapat konsumen dari tf.losses.get_regularization_losses() . Lebih suka cara mendefinisikan kerugian regularisasi L1/L2 ini.

  • Dalam model penayang, hindari mendefinisikan regularisasi L1/L2 melalui parameter l1_ dan l2_regularization_strength dari tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer , dan pengoptimal 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 jarang) atau lebar & dalam, seharusnya dimungkinkan untuk menggunakan kerugian regularisasi individual sebagai gantinya.

  • Jika Anda menggunakan dropout, normalisasi batch, atau teknik pelatihan serupa, atur hyperparameternya ke nilai yang masuk akal di banyak penggunaan 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 kumpulan data kecil dan/atau kumpulan besar. Untuk konsumen tingkat lanjut, pertimbangkan untuk menambahkan tanda tangan yang memperlihatkan kontrol atas hyperparameter kritis.