Se eu salvar meu modelo usando a tensorflow.saved_model.save
função no formato SavedModel, como recuperar quais Tensorflow Ops são usados nesse modelo posteriormente. Como o modelo pode ser restaurado, essas operações são armazenadas no gráfico, meu palpite está no saved_model.pb
arquivo. Se eu carregar esse protobuf (não o modelo inteiro), a parte da biblioteca do protobuf os lista, mas isso não está documentado e marcado como um recurso experimental por enquanto. Os modelos criados no Tensorflow 1.x não terão essa parte.
Então, qual é uma maneira rápida e confiável de recuperar uma lista de operações usadas (como MatchingFiles
ou WriteFile
) de um modelo no formato SavedModel?
Agora eu posso congelar a coisa toda, como tensorflowjs-converter
faz. Como eles também verificam as operações suportadas. Atualmente, isso não funciona quando um LSTM está no modelo, veja aqui . Existe uma maneira melhor de fazer isso, já que as Ops estão aí?
Um modelo de exemplo:
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')
Esperado na saída de todas as operações, contendo neste caso pelo menos:
ReadFile
como descrito aqui- ...
fonte
saved_model.pb
, étf.GraphDef
umaSavedModel
mensagem ou um protobuf? Se você recebeu umatf.GraphDef
chamadagd
, pode obter a lista de operações usadas comsorted(set(n.op for n in gd.node))
. Se você tem um modelo carregado, pode fazê-losorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Se for umSavedModel
, você pode obter o resultadotf.GraphDef
(por exemplosaved_model.meta_graphs[0].graph_def
).saved_model
variável no seu último exemplo? O resultadotf.saved_model.load('/path/to/model')
ou o carregamento do protobuf do arquivo saved_model.pb.Respostas:
Se
saved_model.pb
for umaSavedModel
mensagem protobuf, você obtém as operações diretamente a partir daí. Digamos que criamos um modelo da seguinte maneira:Agora podemos encontrar as operações usadas por esse modelo assim:
fonte
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
Então o ReadFile Op, conforme listado aqui, está lá, mas não é impresso.ReadFile
operação na saída. É possível que, no seu caso real, essa operação não esteja entre a entrada e a saída do modelo salvo? Nesse caso, acho que pode ser podado.file_name
argumento@tf.function
, contendo as chamadas que listei no meu comentário anterior, eleConst, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(anode_def
coleção dentro desse objeto de função).