Jika saya menyimpan model saya menggunakan tensorflow.saved_model.save
fungsi dalam format SavedModel, bagaimana saya bisa mengambil Tensorflow Ops mana yang digunakan dalam model ini sesudahnya. Karena model dapat dipulihkan, operasi ini disimpan dalam grafik, tebakan saya ada di saved_model.pb
file. Jika saya memuat protobuf ini (jadi bukan seluruh model) bagian perpustakaan dari protobuf mencantumkan ini, tetapi ini tidak didokumentasikan dan ditandai sebagai fitur eksperimental untuk saat ini. Model yang dibuat di Tensorflow 1.x tidak akan memiliki bagian ini.
Jadi apa cara cepat dan andal untuk mengambil daftar Operasi yang digunakan (Suka MatchingFiles
atau WriteFile
) dari model dalam format SavedModel?
Saat ini aku bisa membekukan semuanya, seperti tensorflowjs-converter
halnya. Karena mereka juga memeriksa Operasi yang didukung. Ini saat ini tidak berfungsi ketika LSTM ada dalam model, lihat di sini . Apakah ada cara yang lebih baik untuk melakukan ini, karena Ops pasti ada di sana?
Contoh model:
class FileReader(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(name='filename', shape=[None], dtype=tf.string)])
def read_disk(self, file_name):
input_scalar = tf.reshape(file_name, [])
output = tf.io.read_file(input_scalar)
return tf.stack([output], name='content')
file_reader = FileReader()
tf.saved_model.save(file_reader, 'file_reader')
Diharapkan dalam output semua Ops, mengandung dalam hal ini setidaknya:
ReadFile
seperti yang dijelaskan di sini- ...
sumber
saved_model.pb
itutf.GraphDef
, atauSavedModel
pesan protobuf? Jika Anda memilikitf.GraphDef
disebutgd
, Anda bisa mendapatkan daftar ops digunakan dengansorted(set(n.op for n in gd.node))
. Jika Anda memiliki model yang dimuat, Anda dapat melakukannyasorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Jika itu adalahSavedModel
, Anda dapat memperolehnyatf.GraphDef
(missaved_model.meta_graphs[0].graph_def
.).saved_model
variabel dalam contoh terakhir Anda? Hasiltf.saved_model.load('/path/to/model')
atau memuat protobuf dari file Saved_model.pb.Jawaban:
Jika
saved_model.pb
adaSavedModel
pesan protobuf, maka Anda mendapatkan operasi langsung dari sana. Katakanlah kita membuat model sebagai berikut:Kami sekarang dapat menemukan operasi yang digunakan oleh model seperti ini:
sumber
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
Kemudian ReadFile Op seperti yang tercantum di sini ada di sana, tetapi tidak dicetak.ReadFile
operasi di output. Apakah mungkin bahwa, dalam kasus Anda yang sebenarnya, operasi itu tidak antara input dan output dari model yang disimpan? Dalam hal ini saya pikir mungkin akan dipangkas.file_name
argumen@tf.function
, berisi panggilan yang saya sebutkan di komentar saya sebelumnya, itu memberikan daftar berikut:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(node_def
koleksi dalam objek fungsi itu).