【问题标题】:How does TensorFlow SavedModel handle additional dependenciesTensorFlow SavedModel 如何处理额外的依赖
【发布时间】:2021-02-26 12:12:04
【问题描述】:

我正在尝试使用 tf.saved_model.save() 函数导出我的 TF 模型。但是,我在预处理期间使用了额外的外部库。使用 nltk 示例的工作代码如下所示:

import tensorflow as tf
import nltk
import tensorflow_datasets as tfds
from tensorflow.python.ops import gen_string_ops
from tensorflow.python.ops import string_ops

train_data, val_data, test_data = train_data, validation_data, test_data = tfds.load(
    name="imdb_reviews", 
    split=('train[:60%]', 'train[60%:]', 'test'),
    as_supervised=True)


def remove_stops(text):
    nltk.download('stopwords')
    stop_words = nltk.corpus.stopwords.words('english')
    for w in stop_words:
        text = string_ops.regex_replace(text, '\\b{}\\b'.format(w),'')  # remove all stopwords
    text = tf.strings.strip(text)  # remove trailing whitespaces
    return text

vectorize_layer = tf.keras.layers.experimental.preprocessing.TextVectorization( # this gives me a BOW representation of my data...
    max_tokens=1000,
    standardize=remove_stops,  # ...using my method to remove stopwords
    output_mode='count') 

train_feats = list(map(lambda x: x[0], train_data)) # bc PrefetchDatasets don't allow direct access
vectorize_layer.adapt(train_feats)  # BOW needs to be trained beforehand to get vector reps

# define some simple network
input_layer = tf.keras.Input(shape=(), name='input_text', dtype=tf.string)
model = tf.keras.Sequential()
model.add(input_layer)
model.add(vectorize_layer)
model.add(tf.keras.layers.Dense(units=64, activation='softmax')) 
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy', metrics = ['binary_accuracy'])
model.fit(train_data.shuffle(10000).batch(512),
             epochs=2,
             validation_data=val_data.batch(512))

tf.saved_model.save(model, './save_here')

据我了解docs,savedModel 包括经过训练的参数和计算,但不包括我的代码。但是当我像这样在另一个脚本中加载相同的模型时(即根本不导入我的外部库)

import tensorflow as tf
loaded_model = tf.saved_model.load('./save_here')
loaded_model(tf.constant(['test me pls']))

我的输出没有任何错误

<tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.5086063]], dtype=float32)>

这对我来说尤其令人困惑,因为我什至使用 nltk 来下载停用词数据集。 SavedModels 在导出过程中究竟是如何处理这些外部库的?

【问题讨论】:

    标签: python tensorflow tensorflow-serving


    【解决方案1】:

    实际上,在从保存的模型进行推理期间,您并没有使用 NLTK 库。

    您的模型只需要文本作为向量即可工作,由代码中的 vectorize_layer 处理。如果您想在推理之前对文本进行预处理,您应该导入库并对其进行预处理。

    【讨论】:

    • 如果我错了,请纠正我,但所有输入数据(也在推理过程中)都通过vectorize_layer,它使用我的remove_stops 函数来标准化该数据。这意味着它确实使用了 nltk 库。
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2018-03-06
    • 2021-01-07
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2022-01-06
    • 2014-06-08
    相关资源
    最近更新 更多