Setelah Anda melatih model di Tensorflow:
- Bagaimana Anda menyimpan model yang terlatih?
- Bagaimana nanti Anda mengembalikan model yang disimpan ini?
python
tensorflow
machine-learning
model
mathetes
sumber
sumber
Jawaban:
Documents
tutorial lengkap dan bermanfaat -> https://www.tensorflow.org/guide/saved_model
Panduan terperinci yang keras untuk menyimpan model -> https://www.tensorflow.org/guide/keras/save_and_serialize
Dari dokumen:
Menyimpan
Mengembalikan
Tensorflow 2
Ini masih beta jadi saya sarankan untuk saat ini. Jika Anda masih ingin menyusuri jalan itu di sini adalah
tf.saved_model
panduan penggunaanTensorflow <2
simple_save
Banyak jawaban bagus, untuk kelengkapan saya akan menambahkan 2 sen: simple_save . Juga contoh kode mandiri menggunakan
tf.data.Dataset
API.Python 3; Tensorflow 1.14
Memulihkan:
Contoh mandiri
Posting blog asli
Kode berikut menghasilkan data acak untuk kepentingan demonstrasi.
Dataset
dan kemudian nyaIterator
. Kami mendapatkan tensor yang dihasilkan iterator, yang disebutinput_tensor
yang akan berfungsi sebagai input untuk model kami.input_tensor
: RNN dua arah berbasis GRU diikuti oleh classifier padat. Karena mengapa tidak.softmax_cross_entropy_with_logits
, dioptimalkan denganAdam
. Setelah 2 zaman (masing-masing 2 batch), kami menyimpan model "terlatih" dengantf.saved_model.simple_save
. Jika Anda menjalankan kode apa adanya, maka model akan disimpan dalam folder yang disebutsimple/
di direktori kerja Anda saat ini.tf.saved_model.loader.load
. Kami mengambil tempat penampung dan log dengangraph.get_tensor_by_name
danIterator
operasi inisialisasi dengangraph.get_operation_by_name
.Kode:
Ini akan mencetak:
sumber
tf.contrib.layers
?[n.name for n in graph2.as_graph_def().node]
. Seperti yang dikatakan dalam dokumentasi, simpanan sederhana bertujuan menyederhanakan interaksi dengan tensorflow serve, inilah poin dari argumen; Namun variabel lain masih dipulihkan, jika tidak kesimpulan tidak akan terjadi. Ambil saja variabel minat Anda seperti yang saya lakukan dalam contoh. Lihatlah dokumentasiglobal_step
sebagai argumen, jika Anda berhenti kemudian mencoba mengambil pelatihan lagi, itu akan berpikir Anda satu langkah satu. Paling tidak itu akan mengacaukan visualisasi papan tensor AndaSaya meningkatkan jawaban saya untuk menambahkan lebih banyak detail untuk menyimpan dan memulihkan model.
Dalam (dan setelah) Tensorflow versi 0.11 :
Simpan model:
Pulihkan model:
Ini dan beberapa use case yang lebih maju telah dijelaskan dengan sangat baik di sini.
Tutorial lengkap cepat untuk menyimpan dan mengembalikan model Tensorflow
sumber
:0
nama?Di (dan setelah) TensorFlow versi 0.11.0RC1, Anda dapat menyimpan dan memulihkan model Anda secara langsung dengan menelepon
tf.train.export_meta_graph
dantf.train.import_meta_graph
sesuai dengan https://www.tensorflow.org/programmers_guide/meta_graph .Simpan model
Kembalikan model
sumber
<built-in function TF_Run> returned a result with an error set
tf.get_variable_scope().reuse_variables()
diikuti olehvar = tf.get_variable("varname")
. Ini memberi saya kesalahan: "ValueError: Variabel varname tidak ada, atau tidak dibuat dengan tf.get_variable ()." Mengapa? Haruskah ini tidak mungkin?Untuk versi TensorFlow <0.11.0RC1:
Pos pemeriksaan yang disimpan berisi nilai untuk
Variable
s dalam model Anda, bukan model / grafik itu sendiri, yang berarti bahwa grafik harus sama ketika Anda mengembalikan pos pemeriksaan.Berikut adalah contoh untuk regresi linier di mana ada loop pelatihan yang menyimpan pos pemeriksaan variabel dan bagian evaluasi yang akan mengembalikan variabel yang disimpan dalam jangka sebelumnya dan menghitung prediksi. Tentu saja, Anda juga dapat memulihkan variabel dan melanjutkan pelatihan jika Anda mau.
Berikut adalah dokumen untuk
Variable
s, yang mencakup penyimpanan dan pemulihan. Dan di sini adalah dokumen untukSaver
.sumber
batch_x
perlu? Biner? Array numpy?undefined
. Bisakah Anda memberi tahu saya yang merupakan kekurangan BENDERA untuk kode ini. @RyanSepassiLingkungan saya: Python 3.6, Tensorflow 1.3.0
Meskipun ada banyak solusi, sebagian besar didasarkan pada
tf.train.Saver
. Ketika kami memuat.ckpt
diselamatkan olehSaver
, kita harus baik mendefinisikan jaringan tensorflow atau menggunakan beberapa nama yang aneh dan sulit diingat, misalnya'placehold_0:0'
,'dense/Adam/Weight:0'
. Di sini saya sarankan untuk menggunakantf.saved_model
, salah satu contoh paling sederhana yang diberikan di bawah ini, Anda dapat belajar lebih banyak dari Melayani Model TensorFlow :Simpan model:
Muat model:
sumber
Ada dua bagian dari model, definisi model, disimpan oleh
Supervisor
sepertigraph.pbtxt
dalam direktori model dan nilai numerik dari tensor, disimpan ke dalam file pos pemeriksaan sepertimodel.ckpt-1003418
.Definisi model dapat dipulihkan dengan menggunakan
tf.import_graph_def
, dan bobot dipulihkan dengan menggunakanSaver
.Namun,
Saver
gunakan daftar koleksi khusus variabel yang terlampir pada model Graph, dan koleksi ini tidak diinisialisasi menggunakan import_graph_def, jadi Anda tidak dapat menggunakan keduanya bersamaan saat ini (ada di peta jalan kami untuk memperbaikinya). Untuk saat ini, Anda harus menggunakan pendekatan Ryan Sepassi - secara manual membuat grafik dengan nama simpul yang identik, dan gunakanSaver
untuk memuat bobot ke dalamnya.(Atau Anda dapat meretasnya dengan menggunakan
import_graph_def
, menggunakan , membuat variabel secara manual, dan menggunakantf.add_to_collection(tf.GraphKeys.VARIABLES, variable)
untuk setiap variabel, lalu menggunakanSaver
)sumber
Anda juga dapat mengambil cara yang lebih mudah ini.
Langkah 1: inisialisasi semua variabel Anda
Langkah 2: simpan sesi di dalam model
Saver
dan simpanLangkah 3: kembalikan model
Langkah 4: periksa variabel Anda
Saat berjalan dalam instance python yang berbeda, gunakan
sumber
Dalam kebanyakan kasus, menyimpan dan memulihkan dari disk menggunakan
tf.train.Saver
opsi terbaik Anda:Anda juga dapat menyimpan / mengembalikan struktur grafik itu sendiri (lihat dokumentasi MetaGraph untuk detailnya). Secara default,
Saver
menyimpan struktur grafik ke dalam.meta
file. Anda dapat meneleponimport_meta_graph()
untuk mengembalikannya. Ini mengembalikan struktur grafik dan mengembalikanSaver
yang dapat Anda gunakan untuk mengembalikan keadaan model:Namun, ada beberapa kasus di mana Anda membutuhkan sesuatu yang lebih cepat. Misalnya, jika Anda menerapkan penghentian awal, Anda ingin menyimpan pos-pos pemeriksaan setiap kali model meningkat selama pelatihan (sebagaimana diukur pada set validasi), maka jika tidak ada kemajuan untuk beberapa waktu, Anda ingin kembali ke model terbaik. Jika Anda menyimpan model ke disk setiap kali itu membaik, itu akan sangat memperlambat pelatihan. Caranya adalah dengan menyimpan status variabel memori , lalu kembalikan saja nanti:
Penjelasan cepat: ketika Anda membuat variabel
X
, TensorFlow secara otomatis membuat operasi penugasanX/Assign
untuk mengatur nilai awal variabel. Alih-alih membuat placeholder dan op penugasan tambahan (yang hanya akan membuat grafik berantakan), kami hanya menggunakan op penugasan yang ada ini. Input pertama dari setiap op penugasan adalah referensi ke variabel yang seharusnya diinisialisasi, dan input kedua (assign_op.inputs[1]
) adalah nilai awal. Jadi untuk menetapkan nilai apa pun yang kita inginkan (alih-alih nilai awal), kita perlu menggunakanfeed_dict
dan mengganti nilai awal. Ya, TensorFlow memungkinkan Anda memberi nilai untuk op apa pun, tidak hanya untuk placeholder, jadi ini berfungsi dengan baik.sumber
Seperti yang dikatakan Yaroslav, Anda dapat meretas pemulihan dari graph_def dan pos pemeriksaan dengan mengimpor grafik, secara manual membuat variabel, dan kemudian menggunakan Saver.
Saya menerapkan ini untuk penggunaan pribadi saya, jadi saya pikir saya akan membagikan kode di sini.
Tautan: https://gist.github.com/nikitakit/6ef3b72be67b86cb7868
(Ini, tentu saja, peretasan, dan tidak ada jaminan bahwa model yang disimpan dengan cara ini akan tetap dapat dibaca di versi TensorFlow yang akan datang.)
sumber
Jika ini adalah model yang disimpan secara internal, Anda cukup menentukan pemulih semua variabel sebagai
dan menggunakannya untuk mengembalikan variabel dalam sesi saat ini:
Untuk model eksternal, Anda perlu menentukan pemetaan dari nama variabelnya ke nama variabel Anda. Anda dapat melihat nama variabel model menggunakan perintah
Skrip inspect_checkpoint.py dapat ditemukan di folder './tensorflow/python/tools' dari sumber Tensorflow.
Untuk menentukan pemetaan, Anda dapat menggunakan Tensorflow-Worklab saya , yang berisi sekumpulan kelas dan skrip untuk melatih dan melatih kembali berbagai model. Ini termasuk contoh pelatihan ulang model ResNet, yang terletak di sini
sumber
all_variables()
sekarang tidak digunakan lagiInilah solusi sederhana saya untuk dua kasus dasar berbeda pada apakah Anda ingin memuat grafik dari file atau membangunnya selama runtime.
Jawaban ini berlaku untuk Tensorflow 0.12+ (termasuk 1.0).
Membangun kembali grafik dalam kode
Penghematan
Memuat
Memuat juga grafik dari file
Saat menggunakan teknik ini, pastikan semua layer / variabel Anda secara eksplisit menetapkan nama unik.Kalau tidak, Tensorflow akan membuat nama-nama itu sendiri unik dan dengan demikian mereka akan berbeda dari nama-nama yang tersimpan dalam file. Ini bukan masalah dalam teknik sebelumnya, karena nama-nama "hancur" dengan cara yang sama dalam memuat dan menyimpan.
Penghematan
Memuat
sumber
global_step
variabel dan rata-rata bergerak normalisasi batch adalah variabel yang tidak dapat dilatihkan, tetapi keduanya jelas layak untuk dihemat. Selain itu, Anda harus lebih jelas membedakan konstruksi grafik dari menjalankan sesi, misalnyaSaver(...).save()
akan membuat node baru setiap kali Anda menjalankannya. Mungkin bukan yang Anda inginkan. Dan masih ada lagi ...: /Anda juga dapat melihat contoh di TensorFlow / skflow , yang menawarkan
save
danrestore
metode yang dapat membantu Anda mengelola model dengan mudah. Ini memiliki parameter yang Anda juga dapat mengontrol seberapa sering Anda ingin membuat cadangan model Anda.sumber
Jika Anda menggunakan tf.train.MonitoredTrainingSession sebagai sesi default, Anda tidak perlu menambahkan kode tambahan untuk melakukan save / restore. Cukup berikan nama dir pos pemeriksaan ke konstruktor MonitoredTrainingSession, itu akan menggunakan kait sesi untuk menangani ini.
sumber
Semua jawaban di sini luar biasa, tetapi saya ingin menambahkan dua hal.
Pertama, untuk menguraikan jawaban @ user7505159, "./" bisa penting untuk ditambahkan ke awal nama file yang Anda pulihkan.
Misalnya, Anda dapat menyimpan grafik tanpa "./" di nama file seperti:
Tetapi untuk mengembalikan grafik, Anda mungkin perlu menambahkan "./" ke nama file:
Anda tidak akan selalu membutuhkan "./", tetapi dapat menyebabkan masalah tergantung pada lingkungan dan versi TensorFlow Anda.
Juga ingin menyebutkan bahwa ini
sess.run(tf.global_variables_initializer())
bisa menjadi penting sebelum mengembalikan sesi.Jika Anda menerima kesalahan terkait variabel yang tidak diinisialisasi saat mencoba memulihkan sesi yang disimpan, pastikan Anda memasukkan
sess.run(tf.global_variables_initializer())
sebelumsaver.restore(sess, save_file)
baris. Ini bisa menyelamatkan Anda dari sakit kepala.sumber
Seperti yang dijelaskan dalam edisi 6255 :
dari pada
sumber
Menurut versi Tensorflow baru,
tf.train.Checkpoint
adalah cara yang lebih disukai untuk menyimpan dan memulihkan model:Berikut ini sebuah contoh:
Informasi lebih lanjut dan contoh di sini.
sumber
Untuk tensorflow 2.0 , sesederhana
Untuk memulihkan:
sumber
tf.keras Model hemat dengan
TF2.0
Saya melihat jawaban yang bagus untuk menyimpan model menggunakan TF1.x. Saya ingin memberikan beberapa petunjuk lebih banyak dalam menyimpan
tensorflow.keras
model yang sedikit rumit karena ada banyak cara untuk menyimpan model.Di sini saya memberikan contoh menyimpan
tensorflow.keras
model kemodel_path
folder di bawah direktori saat ini. Ini bekerja dengan baik dengan tensorflow terbaru (TF2.0). Saya akan memperbarui deskripsi ini jika ada perubahan dalam waktu dekat.Menyimpan dan memuat seluruh model
Menyimpan dan memuat model Hanya bobot
Jika Anda tertarik untuk menyimpan hanya bobot model dan kemudian memuat bobot untuk memulihkan model, maka
Menyimpan dan memulihkan menggunakan callback pos pemeriksaan keras
menyimpan model dengan metrik khusus
Menyimpan model keras dengan ops kustom
Ketika kita memiliki ops kustom seperti dalam case berikut (
tf.tile
), kita perlu membuat fungsi dan membungkus dengan layer Lambda. Jika tidak, model tidak dapat disimpan.Saya pikir saya telah membahas beberapa cara menghemat model tf.keras. Namun, ada banyak cara lain. Berikan komentar di bawah ini jika Anda melihat kasus penggunaan Anda tidak tercakup di atas. Terima kasih!
sumber
Gunakan tf.train.Saver untuk menyimpan model, remerber, Anda perlu menentukan var_list, jika Anda ingin mengurangi ukuran model. Val_list dapat berupa tf.trainable_variables atau tf.global_variables.
sumber
Anda dapat menyimpan variabel dalam jaringan menggunakan
Untuk memulihkan jaringan untuk digunakan kembali nanti atau dalam skrip lain, gunakan:
Poin-poin penting:
sess
harus sama antara pertama dan kemudian dijalankan (struktur yang koheren).saver.restore
membutuhkan jalur folder dari file yang disimpan, bukan jalur file individual.sumber
Di mana pun Anda ingin menyimpan model,
Pastikan, semua Anda
tf.Variable
memiliki nama, karena Anda mungkin ingin mengembalikannya nanti menggunakan nama mereka. Dan di mana Anda ingin memprediksi,Pastikan saver berjalan di dalam sesi yang sesuai. Ingat bahwa, jika Anda menggunakan
tf.train.latest_checkpoint('./')
, maka hanya titik pemeriksaan terbaru yang akan digunakan.sumber
Saya di Versi:
Cara sederhana adalah
Menyimpan:
Mengembalikan:
sumber
Untuk tensorflow-2.0
ini sangat sederhana.
MENYIMPAN
MENGEMBALIKAN
sumber
Mengikuti jawaban @Vishnuvardhan Janapati, berikut adalah cara lain untuk menyimpan dan memuat kembali model dengan lapisan kustom / metrik / kerugian di bawah TensorFlow 2.0.0
Dengan cara ini, setelah Anda mengeksekusi kode tersebut, dan menyimpan model Anda dengan
tf.keras.models.save_model
ataumodel.save
atauModelCheckpoint
callback, Anda dapat memuat ulang model Anda tanpa perlu objek khusus yang tepat, sesederhanasumber
Dalam versi baru tensorflow 2.0, proses menyimpan / memuat model jauh lebih mudah. Karena Implementasi Keras API, API tingkat tinggi untuk TensorFlow.
Untuk menyimpan model: Periksa dokumentasi untuk referensi: https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/save_model
Untuk memuat model:
https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/models/load_model
sumber
Berikut ini adalah contoh sederhana menggunakan format Tensorflow 2.0 SavedModel (yang merupakan format yang disarankan, menurut dokumen ) untuk pengklasifikasi dataset MNIST sederhana, menggunakan API fungsional Keras tanpa terlalu banyak suka terjadi:
Apa
serving_default
?Ini nama def tanda tangan dari tag yang Anda pilih (dalam hal ini,
serve
tag default dipilih) Juga, di sini dijelaskan cara menemukan tag dan tanda tangan model yang digunakansaved_model_cli
.Penafian
Ini hanya contoh dasar jika Anda hanya ingin menjalankannya, tetapi tidak berarti jawaban yang lengkap - mungkin saya dapat memperbaruinya di masa mendatang. Saya hanya ingin memberikan contoh sederhana menggunakan
SavedModel
di TF 2.0 karena saya belum melihat satu, bahkan ini sederhana, di mana saja.@ Tom menjawab adalah contoh SavedModel, tetapi itu tidak akan berfungsi pada Tensorflow 2.0, karena sayangnya ada beberapa perubahan yang melanggar.
@ Vishnuvardhan Janapati menjawab mengatakan TF 2.0, tetapi itu bukan untuk format SavedModel.
sumber