Tensorflow SavedModel में उपयोग किए गए सभी कार्यों को कैसे सूचीबद्ध करें?


10

यदि मैं tensorflow.saved_model.saveSavedModel प्रारूप में फ़ंक्शन का उपयोग करके अपने मॉडल को बचाता हूं , तो मैं कैसे पुनः प्राप्त कर सकता हूं कि बाद में इस मॉडल में Tensorflow Ops का उपयोग किया जाता है। जैसा कि मॉडल को पुनर्स्थापित किया जा सकता है, ये ऑपरेशन ग्राफ़ में संग्रहीत किए जाते हैं, मेरा अनुमान saved_model.pbफ़ाइल में है। यदि मैं इस प्रोटोबुफ़ (संपूर्ण मॉडल नहीं) को लोड करता हूं, तो प्रोटोबॉफ़ का पुस्तकालय हिस्सा इनकी सूची बनाता है, लेकिन इसे अभी तक प्रायोगिक विशेषता के रूप में दस्तावेज और टैग नहीं किया गया है। Tensorflow 1.x में बनाए गए मॉडल में यह हिस्सा नहीं होगा।

तो SavedModel प्रारूप में एक मॉडल से उपयोग किए गए संचालन (जैसे MatchingFilesया WriteFile) की एक सूची को पुनः प्राप्त करने का एक तेज़ और विश्वसनीय तरीका क्या है ?

अभी मैं पूरी चीज को फ्रीज कर सकता हूं, जैसे tensorflowjs-converterकरता है। के रूप में वे भी समर्थित संचालन के लिए जाँच करें। यह वर्तमान में काम नहीं करता है जब एक LSTM मॉडल में है, यहां देखें । क्या ऐसा करने का एक बेहतर तरीका है, क्योंकि ऑप्स निश्चित रूप से वहां हैं?

एक उदाहरण मॉडल:

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

कम से कम इस मामले में, सभी ऑप्स आउटपुट में अपेक्षित:


1
यह ठीक से बताना मुश्किल है कि आप क्या चाहते हैं, क्या है saved_model.pb, क्या यह एक है tf.GraphDef, या एक SavedModelप्रोटोबुफ़ संदेश है? यदि आपके पास एक tf.GraphDefकॉल है gd, तो आप उपयोग किए गए ऑप्स की सूची प्राप्त कर सकते हैं sorted(set(n.op for n in gd.node))। यदि आपके पास एक लोडेड मॉडल है, तो आप कर सकते हैं sorted(set(op.type for op in tf.get_default_graph().get_operations()))। यदि यह एक है SavedModel, तो आप इससे प्राप्त कर सकते हैं tf.GraphDef(जैसे saved_model.meta_graphs[0].graph_def)।
jdehesa

मैं एक संग्रहीत SavedModel से ऑप्स को पुनः प्राप्त करना चाहता हूं। तो वास्तव में, अंतिम विकल्प जिसका आप वर्णन कर रहे हैं। saved_modelआपके अंतिम उदाहरण में चर क्या है ? tf.saved_model.load('/path/to/model')Save_model.pb फ़ाइल के प्रोटोबुफ़ को लोड या लोड करने का परिणाम ।
सैम्पर्स

जवाबों:


1

यदि saved_model.pbएक SavedModelप्रोटोबॉफ़ संदेश है, तो आप सीधे वहां से संचालन प्राप्त करते हैं। मान लीजिए कि हम एक मॉडल बनाते हैं:

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

अब हम उस मॉडल द्वारा उपयोग किए जाने वाले संचालन को इस तरह पा सकते हैं:

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

मैंने ऐसा कुछ करने की कोशिश की, लेकिन दुर्भाग्य से यह वह नहीं है जो मैं यह उम्मीद करता हूं: कहो कि मेरे पास एक मॉडल है जो ऐसा करता है: input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')फिर रीडफ़ाइल ओप के रूप में यहां सूचीबद्ध है , लेकिन इसमें प्रिंट नहीं है।
सैम्पर्स

1
@ सैम्पर्स मैंने आपके द्वारा सुझाए गए उदाहरण के साथ उत्तर को संपादित किया है। मुझे ReadFileआउटपुट में ऑपरेशन मिलता है । क्या यह संभव है कि, आपके वास्तविक मामले में, वह ऑपरेशन सहेजे गए मॉडल के इनपुट और आउटपुट के बीच न हो? उस मामले में मुझे लगता है कि यह चुभ सकता है।
jdehesa

दरअसल दिए गए मॉडल के साथ यह काम करता है। दुर्भाग्य से tf2 में बने मॉड्यूल के लिए, यह नहीं है। अगर मैं एक साथ 1 समारोह के साथ एक tf.Module बनाने file_nameतर्क @tf.function: एनोटेशन, कॉल मैं अपने पिछली टिप्पणी में सूचीबद्ध युक्त, यह निम्न सूची देता हैConst, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
sampers

मेरे सवाल का एक मॉडल जोड़ा
sampers

@ सैम्पर्स मैंने अपना उत्तर अपडेट कर दिया है। मैं पहले टीएफ 1.x का उपयोग कर रहा था, मैं टीएफ 2.x में ग्राफ़ डेफिनिशन ऑब्जेक्ट्स में परिवर्तन से परिचित नहीं था, मुझे लगता है कि उत्तर अब सहेजे गए मॉडल में सब कुछ कवर करता है। मुझे लगता है कि आपके द्वारा लिखे गए पायथन फ़ंक्शन के अनुरूप ऑपरेशन saved_model.meta_graphs[0].graph_def.library.function[0]( node_defउस फ़ंक्शन ऑब्जेक्ट के भीतर संग्रह) हैं।
jdehesa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.