Tensorflow SavedModel'de kullanılan tüm işlemleri nasıl listeleyebilirim?


10

tensorflow.saved_model.saveModelimi KaydedilmişModel biçimindeki işlevi kullanarak kaydedersem, daha sonra bu modelde hangi Tensorflow Ops'un kullanıldığını nasıl alabilirim? Model geri yüklenebileceğinden, bu işlemler grafikte saklanır, tahminim dosyadadır saved_model.pb. Bu protobuf (tüm model değil) yüklersem protobuf'un kütüphane kısmı bunları listeler, ancak bu şimdilik belgelenmemiş ve deneysel bir özellik olarak etiketlenmemiştir. Tensorflow 1.x'te oluşturulan modeller bu parçaya sahip olmayacak.

Öyleyse , Kaydedilmiş Mod modelindeki bir modelden kullanılmış İşlemlerin (Beğen MatchingFilesveya WriteFile) bir listesini almanın hızlı ve güvenilir bir yolu nedir?

Şu anda her şeyi dondurabiliyorum, olduğu gibi tensorflowjs-converter. Ayrıca desteklenen İşlemleri kontrol ederler. Modelde bir LSTM olduğunda bu şu anda çalışmaz, buraya bakın . Operasyonlar kesinlikle orada olduğundan, bunu yapmanın daha iyi bir yolu var mı?

Örnek bir 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')

Bu durumda en azından aşağıdakileri içeren tüm Ops çıktılarında bekleniyor:

  • ReadFileburada tarif edildiği gibi
  • ...

1
Ne, ne istediğinizi tam olarak söylemek zordur saved_model.pb, bunu bir olduğunu tf.GraphDefya da bir SavedModelprotobuf mesajı? Eğer bir tf.GraphDefçağrı gdvarsa, ile kullanılan ops listesini alabilirsiniz sorted(set(n.op for n in gd.node)). Yüklü bir modeliniz varsa, bunu yapabilirsiniz sorted(set(op.type for op in tf.get_default_graph().get_operations())). Eğer bir ise SavedModel, ondan alabilirsiniz tf.GraphDef(örn. saved_model.meta_graphs[0].graph_def).
jdehesa

Depolanan bir KaydedilenModel ops almak istiyorum. Gerçekten de, tanımladığınız son seçenek. saved_modelSon örneğinizdeki değişken nedir ? tf.saved_model.load('/path/to/model')Save_model.pb dosyasının protobuf'unun sonucu veya yüklenmesi.
örnekleyiciler

Yanıtlar:


1

Eğer saved_model.pbbir olan SavedModelprotobuf mesajı, o zaman oradan direk işlemlerini olsun. Diyelim ki aşağıdaki gibi bir model oluşturuyoruz:

import tensorflow as tf

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, 'tmp')

Şimdi bu model tarafından kullanılan işlemleri şu şekilde bulabiliriz:

from tensorflow.core.protobuf.saved_model_pb2 import SavedModel

saved_model = SavedModel()
with open('tmp/saved_model.pb', 'rb') as f:
    saved_model.ParseFromString(f.read())
model_op_names = set()
# Iterate over every metagraph in case there is more than one
for meta_graph in saved_model.meta_graphs:
    # Add operations in the graph definition
    model_op_names.update(node.op for node in meta_graph.graph_def.node)
    # Go through the functions in the graph definition
    for func in meta_graph.graph_def.library.function:
        # Add operations in each function
        model_op_names.update(node.op for node in func.node_def)
# Convert to list, sorted if you want
model_op_names = sorted(model_op_names)
print(*model_op_names, sep='\n')
# Const
# Identity
# MergeV2Checkpoints
# NoOp
# Pack
# PartitionedCall
# Placeholder
# ReadFile
# Reshape
# RestoreV2
# SaveV2
# ShardedFilename
# StatefulPartitionedCall
# StringJoin

Böyle bir şey denedim, ama ne yazık ki bu beklediğim gibi değil: Bunu yapan bir modelim var: input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')Sonra burada listelenen ReadFile Op var, ama yazdırılmaz.
sampers

1
@sampers Cevabı önerdiğiniz gibi bir örnekle düzenledim. ReadFileİşlemi çıktıda alıyorum . Gerçek durumunuzda, bu işlemin kaydedilen modelin girişi ve çıkışı arasında olmaması mümkün müdür? Bu durumda bence budanabilir.
jdehesa

Aslında verilen model ile çalışır. Ne yazık ki tf2'de yapılan bir modül için değil. Bir önceki açıklamamda listelediğim aramaları içeren, file_namebağımsız değişken @tf.functionek açıklamalı 1 işlevli bir tf.Module oluşturursam , aşağıdaki listeyi verir:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
sampers

soruma bir model ekledi
sampers

@sampers Cevabımı güncelledim. Daha önce TF 1.x kullanıyordum, TF 2.x'teki grafik tanımı nesnelerindeki değişikliklere aşina değildim, bence cevap şimdi kaydedilen modeldeki her şeyi kapsıyor. Yazdığınız Python işlevine karşılık gelen işlemleri saved_model.meta_graphs[0].graph_def.library.function[0]( node_defo işlev nesnesi içindeki toplama) olduğunu düşünüyorum.
jdehesa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.