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 umumnya 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, namun 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 TensorFlow dengan membuat objek hub.Module dari string dengan URL atau jalur sistem filenya, seperti:

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

Catatan: Lihat informasi lebih lanjut mengenai jenis pegangan valid lainnya di sini .

Tindakan ini menambahkan variabel modul ke grafik TensorFlow saat ini. Menjalankan inisialisasinya akan membaca nilai terlatihnya dari disk. Demikian pula, tabel dan status lainnya ditambahkan ke grafik.

Modul Caching

Saat membuat modul dari URL, konten modul diunduh dan disimpan dalam 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 masukan tensor ke keluaran 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, bobot ini akan dibagikan ke semua aplikasi.

Modul dapat mendefinisikan beberapa tanda tangan bernama untuk memungkinkan penerapan 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 sebuah tanda tangan memiliki banyak masukan, masukan tersebut harus diteruskan sebagai dict, dengan kunci yang ditentukan oleh tanda tangan tersebut. Demikian pula, jika sebuah tanda tangan memiliki beberapa keluaran, keluaran tersebut dapat diambil sebagai dict dengan meneruskan as_dict=True , di bawah kunci yang ditentukan oleh tanda tangan tersebut (kunci "default" adalah untuk keluaran tunggal yang dikembalikan jika as_dict=False ). Jadi bentuk penerapan Modul yang paling umum 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, namun tidak ada persyaratan untuk menggunakan semua output modul. TensorFlow hanya akan menjalankan bagian modul yang menjadi dependensi target di tf.Session.run() . Memang benar, penerbit modul dapat memilih untuk menyediakan berbagai keluaran untuk penggunaan tingkat lanjut (seperti aktivasi lapisan perantara) bersama dengan keluaran utama. Konsumen modul harus menangani keluaran tambahan dengan baik.

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 modul yang berbeda semudah memvariasikan pegangan modul sebagai 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. Format 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 TensorFlow 1 pada tingkat sintaksis (nama file dan pesan protokol yang sama) tetapi berbeda secara semantik untuk memungkinkan penggunaan kembali modul, komposisi, dan pelatihan ulang (misalnya, 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 menentukan modul baru, penerbit memanggil hub.create_module_spec() dengan fungsi module_fn . Fungsi ini membuat grafik yang mewakili struktur internal modul, menggunakan tf.placeholder() sebagai input yang akan diberikan oleh pemanggil. Kemudian ia mendefinisikan tanda tangan dengan memanggil hub.add_signature(name, inputs, outputs) satu kali atau lebih.

Misalnya:

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 ini, tidak ada pos pemeriksaan, dan instance modul akan menggunakan inisialisasi variabel sebagai gantinya.

Setiap instance modul dapat diserialkan ke disk melalui metode export(path, session) . Mengekspor modul membuat serial definisinya bersama dengan status variabelnya saat ini dalam session ke jalur yang diteruskan. Ini dapat digunakan saat mengekspor modul untuk pertama kalinya, serta saat mengekspor modul yang telah disetel dengan baik.

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

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

Contoh nyata

Lihatlah pengekspor modul penyematan teks kami untuk contoh nyata tentang cara membuat modul dari format penyematan teks umum.

Penyempurnaan

Melatih variabel modul yang diimpor bersama dengan variabel model di sekitarnya disebut fine-tuning . Penyempurnaan dapat menghasilkan kualitas yang lebih baik, namun menambah komplikasi baru. Kami menyarankan konsumen untuk melakukan penyesuaian hanya setelah menjelajahi penyesuaian kualitas yang lebih sederhana, dan hanya jika penerbit modul merekomendasikannya.

Untuk Konsumen

Untuk mengaktifkan penyesuaian, buat instance modul dengan hub.Module(..., trainable=True) agar variabelnya dapat dilatih dan impor REGULARIZATION_LOSSES TensorFlow. Jika modul memiliki beberapa varian grafik, pastikan memilih salah satu yang sesuai untuk pelatihan. Biasanya yang punya tag {"train"} .

Pilih rezim pelatihan yang tidak merusak beban yang telah dilatih sebelumnya, misalnya, kecepatan pembelajaran yang lebih rendah daripada pelatihan dari awal.

Untuk Penerbit

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

  • Penyempurnaan memerlukan regularisasi. Modul Anda diekspor dengan koleksi REGULARIZATION_LOSSES , yang menempatkan pilihan Anda antara tf.layers.dense(..., kernel_regularizer=...) dll. ke dalam apa yang konsumen dapatkan dari tf.losses.get_regularization_losses() . Lebih suka cara ini untuk mendefinisikan kerugian regularisasi L1/L2.

  • Dalam model penerbit, hindari menentukan regularisasi L1/L2 melalui parameter l1_ dan l2_regularization_strength dari tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer , dan pengoptimal proksimal lainnya. Hal ini tidak diekspor bersamaan dengan modul, dan menetapkan kekuatan regularisasi secara global mungkin tidak sesuai untuk konsumen. Kecuali untuk regularisasi L1 dalam model lebar (yaitu linier renggang) atau model lebar & dalam, kerugian regularisasi individual dapat digunakan 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 terhadap overfitting. Dalam normalisasi batch, momentum (alias koefisien peluruhan) harus cukup kecil untuk memungkinkan penyesuaian dengan kumpulan data kecil dan/atau kumpulan data besar. Untuk konsumen tingkat lanjut, pertimbangkan untuk menambahkan tanda tangan yang memperlihatkan kontrol atas hyperparameter penting.