[英]How does TensorFlow SavedModel handle additional dependencies
我正在嘗試使用tf.saved_model.save()
function 導出我的 TF model。 但是,我在預處理期間使用了額外的外部庫。 使用 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')
據我了解文檔, savedModel 包括訓練的參數和計算,但不是我的代碼。 但是當我在另一個腳本中加載相同的 model 時(即根本不導入我的外部庫)
import tensorflow as tf
loaded_model = tf.saved_model.load('./save_here')
loaded_model(tf.constant(['test me pls']))
我的 output 沒有任何錯誤
<tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.5086063]], dtype=float32)>
這對我來說尤其令人困惑,因為我什至使用 nltk 來下載停用詞數據集。 SavedModels 在導出過程中究竟是如何處理這些外部庫的?
實際上,在從保存的 model 進行推理期間,您沒有使用 NLTK 庫。
您的 model 只需要文本作為向量即可工作,由代碼中的vectorize_layer處理。 如果您想在推理之前預處理您的文本,您應該導入庫並對其進行預處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.