مشاهده در TensorFlow.org | در Google Colab اجرا شود | مشاهده منبع در GitHub | دانلود دفترچه یادداشت |
پیش پردازش Keras
API لایههای پیشپردازش Keras به توسعهدهندگان اجازه میدهد خطوط لوله پردازش ورودی بومی Keras را بسازند. این خطوط لوله پردازش ورودی را میتوان به عنوان کد پیشپردازش مستقل در جریانهای کاری غیر Keras استفاده کرد، مستقیماً با مدلهای Keras ترکیب شد و به عنوان بخشی از Keras SavedModel صادر شد.
با لایههای پیشپردازش Keras، میتوانید مدلهایی بسازید و صادر کنید که واقعاً سرتاسر هستند: مدلهایی که تصاویر خام یا دادههای ساختاریافته خام را به عنوان ورودی میپذیرند. مدل هایی که به خودی خود نرمال سازی ویژگی یا نمایه سازی ارزش ویژگی را انجام می دهند.
پیش پردازش موجود
پیش پردازش متن
-
tf.keras.layers.TextVectorization
: تبدیل رشته های خام را به نمایندگی های کد گذاری است که می تواند توسط یک خواندهEmbedding
لایه یاDense
لایه.
پیش پردازش ویژگی های عددی
-
tf.keras.layers.Normalization
: از ویژگی های عاقلانه انجام عادی از ویژگی های ورودی. -
tf.keras.layers.Discretization
: تبدیل ویژگی های عددی پیوسته را به عدد صحیح ویژگی های قطعی.
پیش پردازش ویژگی های طبقه بندی شده
-
tf.keras.layers.CategoryEncoding
: نوبت عدد صحیح ویژگی های طبقه را به یکی از داغ، چند گرم، و یا تعداد نمایندگی متراکم. -
tf.keras.layers.Hashing
: انجام هش کردن ویژگی قطعی، همچنین به عنوان "ترفند هش کردن" شناخته شده است. -
tf.keras.layers.StringLookup
: نوبت رشته قطعی ارزش نمایندگی کد گذاری است که می تواند توسط یک خواندهEmbedding
لایه یاDense
لایه. -
tf.keras.layers.IntegerLookup
: نوبت عدد صحیح مقادیر قطعی را به یک نمایندگی کد گذاری است که می تواند توسط یک خواندهEmbedding
لایه یاDense
لایه.
پیش پردازش تصویر
این لایه ها برای استانداردسازی ورودی های یک مدل تصویر هستند.
-
tf.keras.layers.Resizing
: تغییر اندازه دسته ای از تصاویر به اندازه هدف. -
tf.keras.layers.Rescaling
: rescales و جبران ارزش از دسته ای از تصویر (به عنوان مثال رفتن از ورودی در[0, 255]
وسیعی به ورودی در[0, 1]
محدوده. -
tf.keras.layers.CenterCrop
: گرداند یک محصول مرکز یک دسته ای از تصاویر.
افزایش داده های تصویری
این لایه ها تبدیل های افزایش تصادفی را به دسته ای از تصاویر اعمال می کنند. آنها فقط در حین تمرین فعال هستند.
-
tf.keras.layers.RandomCrop
-
tf.keras.layers.RandomFlip
-
tf.keras.layers.RandomTranslation
-
tf.keras.layers.RandomRotation
-
tf.keras.layers.RandomZoom
-
tf.keras.layers.RandomHeight
-
tf.keras.layers.RandomWidth
-
tf.keras.layers.RandomContrast
adapt()
روش
برخی از لایه های پیش پردازش دارای یک حالت داخلی هستند که می توان آن را بر اساس نمونه ای از داده های آموزشی محاسبه کرد. لیست لایه های پیش پردازش حالت دار به شرح زیر است:
-
TextVectorization
: دارای یک نگاشت بین نشانه رشته و شاخص عدد صحیح -
StringLookup
وIntegerLookup
: برگزاری یک نگاشت بین مقادیر ورودی و شاخص عدد صحیح است. -
Normalization
: دارای انحراف از معیار و استاندارد از ویژگی های. -
Discretization
: اطلاعات در مورد مرزهای سطل ارزش نگه می دارد.
قطعا این لایه غیر تربیت شدنی هستند. وضعیت آنها در طول آموزش تعیین نمی شود. باید آن را قبل از آموزش، یا با مقدار دهی اولیه آنها را از یک ثابت از قبل محاسبه، و یا با "آداپتورهای آنان" آنها را در مجموعه داده.
شما دولت از یک لایه از پیش پردازش با افشای آن را به داده های آموزشی مجموعه، از طریق adapt()
روش:
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
data = np.array([[0.1, 0.2, 0.3], [0.8, 0.9, 1.0], [1.5, 1.6, 1.7],])
layer = layers.Normalization()
layer.adapt(data)
normalized_data = layer(data)
print("Features mean: %.2f" % (normalized_data.numpy().mean()))
print("Features std: %.2f" % (normalized_data.numpy().std()))
Features mean: -0.00 Features std: 1.00
adapt()
روش هم یک آرایه نامپای یا طول می کشد tf.data.Dataset
شی. در مورد StringLookup
و TextVectorization
، شما همچنین می توانید یک لیست از رشته عبور:
data = [
"ξεῖν᾽, ἦ τοι μὲν ὄνειροι ἀμήχανοι ἀκριτόμυθοι",
"γίγνοντ᾽, οὐδέ τι πάντα τελείεται ἀνθρώποισι.",
"δοιαὶ γάρ τε πύλαι ἀμενηνῶν εἰσὶν ὀνείρων:",
"αἱ μὲν γὰρ κεράεσσι τετεύχαται, αἱ δ᾽ ἐλέφαντι:",
"τῶν οἳ μέν κ᾽ ἔλθωσι διὰ πριστοῦ ἐλέφαντος,",
"οἵ ῥ᾽ ἐλεφαίρονται, ἔπε᾽ ἀκράαντα φέροντες:",
"οἱ δὲ διὰ ξεστῶν κεράων ἔλθωσι θύραζε,",
"οἵ ῥ᾽ ἔτυμα κραίνουσι, βροτῶν ὅτε κέν τις ἴδηται.",
]
layer = layers.TextVectorization()
layer.adapt(data)
vectorized_text = layer(data)
print(vectorized_text)
tf.Tensor( [[37 12 25 5 9 20 21 0 0] [51 34 27 33 29 18 0 0 0] [49 52 30 31 19 46 10 0 0] [ 7 5 50 43 28 7 47 17 0] [24 35 39 40 3 6 32 16 0] [ 4 2 15 14 22 23 0 0 0] [36 48 6 38 42 3 45 0 0] [ 4 2 13 41 53 8 44 26 11]], shape=(8, 9), dtype=int64)
علاوه بر این، لایههای سازگار همیشه گزینهای را برای تنظیم مستقیم حالت از طریق آرگومانهای سازنده یا تخصیص وزن در معرض دید قرار میدهند. اگر ارزش های دولت در نظر گرفته شده در زمان ساخت و ساز لایه شناخته شده است، و یا در خارج از محاسبه adapt()
پاسخ، می توان آنها را بدون تکیه بر محاسبات داخلی لایه تنظیم شده است. برای مثال، اگر فایل های واژگان خارجی برای TextVectorization
، StringLookup
یا IntegerLookup
لایه حال حاضر وجود دارد، آن را می توان به طور مستقیم به جداول Lookup با گذراندن یک مسیر فایل لغات در آرگومان های لایه را لود می شود.
در اینجا یک مثال که در آن ما یک نمونه از یک است StringLookup
لایه با واژگان پیش محاسبه:
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = layers.StringLookup(vocabulary=vocab)
vectorized_data = layer(data)
print(vectorized_data)
tf.Tensor( [[1 3 4] [4 0 2]], shape=(2, 3), dtype=int64)
پیش پردازش داده ها قبل از مدل یا داخل مدل
دو روش برای استفاده از لایه های پیش پردازش وجود دارد:
انتخاب 1: آنها بخشی از مدل، مثل این:
inputs = keras.Input(shape=input_shape)
x = preprocessing_layer(inputs)
outputs = rest_of_the_model(x)
model = keras.Model(inputs, outputs)
با استفاده از این گزینه، پیش پردازش روی دستگاه، همزمان با بقیه اجرای مدل انجام می شود، به این معنی که از شتاب GPU بهره مند می شود. اگر شما آموزش هستید در GPU، این بهترین گزینه برای است Normalization
لایه، و برای همه تصویر از پیش پردازش و لایه های تقویت داده است.
انتخاب 2: درخواست آن را به خود tf.data.Dataset
، بنابراین به عنوان به دست آوردن یک مجموعه داده است که بازده دسته از داده ها پیش پردازش، مثل این:
dataset = dataset.map(lambda x, y: (preprocessing_layer(x), y))
با استفاده از این گزینه، پیش پردازش شما در CPU به صورت ناهمزمان انجام می شود و قبل از ورود به مدل بافر می شود. علاوه بر این، اگر شما پاسخ dataset.prefetch(tf.data.AUTOTUNE)
در مجموعه داده های خود، پیش پردازش خواهد کارآمد به صورت موازی با آموزش اتفاق می افتد:
dataset = dataset.map(lambda x, y: (preprocessing_layer(x), y))
dataset = dataset.prefetch(tf.data.AUTOTUNE)
model.fit(dataset, ...)
این بهترین گزینه است TextVectorization
، و همه داده های ساخت یافته از پیش پردازش لایه. همچنین اگر روی CPU آموزش می بینید و از لایه های پیش پردازش تصویر استفاده می کنید، می تواند گزینه خوبی باشد.
هنگامی که در حال اجرا در TPU، شما همیشه باید از پیش پردازش لایه را در جای tf.data
خط لوله (به استثنای Normalization
و Rescaling
، که اجرای خوب در TPU و مورد استفاده هستند به عنوان اولین لایه مدل تصویر است).
مزایای انجام پیش پردازش در داخل مدل در زمان استنتاج
حتی اگر گزینه 2 را انتخاب کنید، ممکن است بعداً بخواهید یک مدل end-to-end فقط استنتاج صادر کنید که شامل لایه های پیش پردازش می شود. مزایای کلیدی برای انجام این کار این است که آن را می سازد مدل خود را قابل حمل و کمک می کند تا کاهش آموزش / خدمت چوله .
هنگامی که تمام پیش پردازش داده ها بخشی از مدل است، افراد دیگر می توانند مدل شما را بارگیری و استفاده کنند، بدون اینکه بدانند هر ویژگی چگونه انتظار می رود کدگذاری و عادی شود. مدل استنتاج شما میتواند تصاویر خام یا دادههای ساختاریافته خام را پردازش کند، و نیازی نیست که کاربران مدل از جزئیات به عنوان مثال طرح توکنسازی مورد استفاده برای متن، طرح نمایهسازی مورد استفاده برای ویژگیهای طبقهبندی، چه مقادیر پیکسل تصویر آگاه باشند. به نرمال [-1, +1]
و یا به [0, 1]
، و غیره این امر به ویژه قدرتمند اگر شما در حال صادرات مدل خود را به زمان اجرا دیگر، مانند TensorFlow.js: شما نمی خواهد که به reimplement پردازش خود را خط لوله در جاوا اسکریپت
اگر شما در ابتدا لایه های از پیش پردازش خود را در خود tf.data
خط لوله، شما می توانید یک مدل استنتاج که بسته های پیش پردازش صادرات. به سادگی یک مدل جدید که لایه های پیش پردازش و مدل آموزشی شما را به زنجیر می کشد، معرفی کنید:
inputs = keras.Input(shape=input_shape)
x = preprocessing_layer(inputs)
outputs = training_model(x)
inference_model = keras.Model(inputs, outputs)
دستور العمل های سریع
افزایش داده های تصویری
توجه داشته باشید که لایه های تقویت داده های تصویر تنها فعال در طول آموزش (به طور مشابه به هستند Dropout
لایه).
from tensorflow import keras
from tensorflow.keras import layers
# Create a data augmentation stage with horizontal flipping, rotations, zooms
data_augmentation = keras.Sequential(
[
layers.RandomFlip("horizontal"),
layers.RandomRotation(0.1),
layers.RandomZoom(0.1),
]
)
# Load some data
(x_train, y_train), _ = keras.datasets.cifar10.load_data()
input_shape = x_train.shape[1:]
classes = 10
# Create a tf.data pipeline of augmented images (and their labels)
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.batch(16).map(lambda x, y: (data_augmentation(x), y))
# Create a model and train it on the augmented image data
inputs = keras.Input(shape=input_shape)
x = layers.Rescaling(1.0 / 255)(inputs) # Rescale inputs
outputs = keras.applications.ResNet50( # Add the rest of the model
weights=None, input_shape=input_shape, classes=classes
)(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy")
model.fit(train_dataset, steps_per_epoch=5)
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 170500096/170498071 [==============================] - 6s 0us/step 170508288/170498071 [==============================] - 6s 0us/step 5/5 [==============================] - 11s 44ms/step - loss: 8.8927 <keras.callbacks.History at 0x7f1c0c3f16d0>
شما می توانید تنظیمات مشابه در عمل در مثال بالا مشاهده طبقه بندی تصویر از ابتدا .
عادی سازی ویژگی های عددی
# Load some data
(x_train, y_train), _ = keras.datasets.cifar10.load_data()
x_train = x_train.reshape((len(x_train), -1))
input_shape = x_train.shape[1:]
classes = 10
# Create a Normalization layer and set its internal state using the training data
normalizer = layers.Normalization()
normalizer.adapt(x_train)
# Create a model that include the normalization layer
inputs = keras.Input(shape=input_shape)
x = normalizer(inputs)
outputs = layers.Dense(classes, activation="softmax")(x)
model = keras.Model(inputs, outputs)
# Train the model
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy")
model.fit(x_train, y_train)
1563/1563 [==============================] - 3s 2ms/step - loss: 2.1304 <keras.callbacks.History at 0x7f1bc43f40d0>
رمزگذاری ویژگی های دسته بندی رشته از طریق رمزگذاری یک طرفه
# Define some toy data
data = tf.constant([["a"], ["b"], ["c"], ["b"], ["c"], ["a"]])
# Use StringLookup to build an index of the feature values and encode output.
lookup = layers.StringLookup(output_mode="one_hot")
lookup.adapt(data)
# Convert new test data (which includes unknown feature values)
test_data = tf.constant([["a"], ["b"], ["c"], ["d"], ["e"], [""]])
encoded_data = lookup(test_data)
print(encoded_data)
tf.Tensor( [[0. 0. 0. 1.] [0. 0. 1. 0.] [0. 1. 0. 0.] [1. 0. 0. 0.] [1. 0. 0. 0.] [1. 0. 0. 0.]], shape=(6, 4), dtype=float32)
توجه داشته باشید که، در اینجا، شاخص 0 برای خارج از واژگان ارزش سایت متعلق به (ارزش هایی که در طول دیده نمی شد adapt()
).
شما می توانید ببینید StringLookup
در عمل در طبقه بندی داده های ساخت یافته، از ابتدا به عنوان مثال.
رمزگذاری ویژگی های دسته بندی اعداد صحیح از طریق رمزگذاری یک طرفه
# Define some toy data
data = tf.constant([[10], [20], [20], [10], [30], [0]])
# Use IntegerLookup to build an index of the feature values and encode output.
lookup = layers.IntegerLookup(output_mode="one_hot")
lookup.adapt(data)
# Convert new test data (which includes unknown feature values)
test_data = tf.constant([[10], [10], [20], [50], [60], [0]])
encoded_data = lookup(test_data)
print(encoded_data)
tf.Tensor( [[0. 0. 1. 0. 0.] [0. 0. 1. 0. 0.] [0. 1. 0. 0. 0.] [1. 0. 0. 0. 0.] [1. 0. 0. 0. 0.] [0. 0. 0. 0. 1.]], shape=(6, 5), dtype=float32)
توجه داشته باشید که شاخص 0 برای از دست رفته ارزش محفوظ (که شما باید به عنوان ارزش 0 را مشخص) و شاخص 1 برای خارج از واژگان ارزش سایت متعلق به (ارزش هایی که در طول دیده نمی شد adapt()
). شما می توانید این را با استفاده از پیکربندی mask_token
و oov_token
آرگومان های سازنده از IntegerLookup
.
شما می توانید ببینید IntegerLookup
در عمل در مثال ساختار طبقه بندی داده ها، از ابتدا .
استفاده از ترفند هش کردن در یک ویژگی دسته بندی عدد صحیح
اگر یک ویژگی طبقهبندی دارید که میتواند مقادیر بسیار متفاوتی داشته باشد (در مرتبه 10e3 یا بالاتر)، که در آن هر مقدار فقط چند بار در دادهها ظاهر میشود، فهرست کردن و کدگذاری یکبار مقادیر ویژگیها غیرعملی و بیاثر میشود. درعوض، استفاده از "ترفند هش کردن" می تواند ایده خوبی باشد: مقادیر را در یک بردار با اندازه ثابت هش کنید. این اندازه فضای ویژگی را قابل مدیریت نگه می دارد و نیاز به نمایه سازی صریح را از بین می برد.
# Sample data: 10,000 random integers with values between 0 and 100,000
data = np.random.randint(0, 100000, size=(10000, 1))
# Use the Hashing layer to hash the values to the range [0, 64]
hasher = layers.Hashing(num_bins=64, salt=1337)
# Use the CategoryEncoding layer to multi-hot encode the hashed values
encoder = layers.CategoryEncoding(num_tokens=64, output_mode="multi_hot")
encoded_data = encoder(hasher(data))
print(encoded_data.shape)
(10000, 64)
رمزگذاری متن به عنوان دنباله ای از شاخص های نشانه
این است چگونه می توانید باید پیش پردازش متن به یک منتقل می شود Embedding
لایه.
# Define some text data to adapt the layer
adapt_data = tf.constant(
[
"The Brain is wider than the Sky",
"For put them side by side",
"The one the other will contain",
"With ease and You beside",
]
)
# Create a TextVectorization layer
text_vectorizer = layers.TextVectorization(output_mode="int")
# Index the vocabulary via `adapt()`
text_vectorizer.adapt(adapt_data)
# Try out the layer
print(
"Encoded text:\n", text_vectorizer(["The Brain is deeper than the sea"]).numpy(),
)
# Create a simple model
inputs = keras.Input(shape=(None,), dtype="int64")
x = layers.Embedding(input_dim=text_vectorizer.vocabulary_size(), output_dim=16)(inputs)
x = layers.GRU(8)(x)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
# Create a labeled dataset (which includes unknown tokens)
train_dataset = tf.data.Dataset.from_tensor_slices(
(["The Brain is deeper than the sea", "for if they are held Blue to Blue"], [1, 0])
)
# Preprocess the string inputs, turning them into int sequences
train_dataset = train_dataset.batch(2).map(lambda x, y: (text_vectorizer(x), y))
# Train the model on the int sequences
print("\nTraining model...")
model.compile(optimizer="rmsprop", loss="mse")
model.fit(train_dataset)
# For inference, you can export a model that accepts strings as input
inputs = keras.Input(shape=(1,), dtype="string")
x = text_vectorizer(inputs)
outputs = model(x)
end_to_end_model = keras.Model(inputs, outputs)
# Call the end-to-end model on test data (which includes unknown tokens)
print("\nCalling end-to-end model on test string...")
test_data = tf.constant(["The one the other will absorb"])
test_output = end_to_end_model(test_data)
print("Model output:", test_output)
Encoded text: [[ 2 19 14 1 9 2 1]] Training model... 1/1 [==============================] - 3s 3s/step - loss: 0.4776 Calling end-to-end model on test string... Model output: tf.Tensor([[0.04233753]], shape=(1, 1), dtype=float32)
شما می توانید ببینید TextVectorization
لایه در عمل، همراه با Embedding
حالت، در مثال طبقه بندی متن از ابتدا .
توجه داشته باشید که در هنگام آموزش مانند مدل، برای بهترین عملکرد، شما همیشه باید استفاده TextVectorization
لایه به عنوان بخشی از خط لوله ورودی.
کدگذاری متن به عنوان یک ماتریس متراکم از ngram ها با رمزگذاری چند داغ
این است چگونه می توانید باید پیش پردازش متن به یک منتقل می شود Dense
لایه.
# Define some text data to adapt the layer
adapt_data = tf.constant(
[
"The Brain is wider than the Sky",
"For put them side by side",
"The one the other will contain",
"With ease and You beside",
]
)
# Instantiate TextVectorization with "multi_hot" output_mode
# and ngrams=2 (index all bigrams)
text_vectorizer = layers.TextVectorization(output_mode="multi_hot", ngrams=2)
# Index the bigrams via `adapt()`
text_vectorizer.adapt(adapt_data)
# Try out the layer
print(
"Encoded text:\n", text_vectorizer(["The Brain is deeper than the sea"]).numpy(),
)
# Create a simple model
inputs = keras.Input(shape=(text_vectorizer.vocabulary_size(),))
outputs = layers.Dense(1)(inputs)
model = keras.Model(inputs, outputs)
# Create a labeled dataset (which includes unknown tokens)
train_dataset = tf.data.Dataset.from_tensor_slices(
(["The Brain is deeper than the sea", "for if they are held Blue to Blue"], [1, 0])
)
# Preprocess the string inputs, turning them into int sequences
train_dataset = train_dataset.batch(2).map(lambda x, y: (text_vectorizer(x), y))
# Train the model on the int sequences
print("\nTraining model...")
model.compile(optimizer="rmsprop", loss="mse")
model.fit(train_dataset)
# For inference, you can export a model that accepts strings as input
inputs = keras.Input(shape=(1,), dtype="string")
x = text_vectorizer(inputs)
outputs = model(x)
end_to_end_model = keras.Model(inputs, outputs)
# Call the end-to-end model on test data (which includes unknown tokens)
print("\nCalling end-to-end model on test string...")
test_data = tf.constant(["The one the other will absorb"])
test_output = end_to_end_model(test_data)
print("Model output:", test_output)
WARNING:tensorflow:5 out of the last 1567 calls to <function PreprocessingLayer.make_adapt_function.<locals>.adapt_step at 0x7f1b9c5c5290> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details. Encoded text: [[1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0.]] Training model... 1/1 [==============================] - 0s 231ms/step - loss: 1.0046 Calling end-to-end model on test string... Model output: tf.Tensor([[-0.54753447]], shape=(1, 1), dtype=float32)
کدگذاری متن به عنوان یک ماتریس متراکم از ngram با وزن TF-IDF
این یک راه جایگزین پیش پردازش متن قبل از انتقال آن به یک است Dense
لایه.
# Define some text data to adapt the layer
adapt_data = tf.constant(
[
"The Brain is wider than the Sky",
"For put them side by side",
"The one the other will contain",
"With ease and You beside",
]
)
# Instantiate TextVectorization with "tf-idf" output_mode
# (multi-hot with TF-IDF weighting) and ngrams=2 (index all bigrams)
text_vectorizer = layers.TextVectorization(output_mode="tf-idf", ngrams=2)
# Index the bigrams and learn the TF-IDF weights via `adapt()`
with tf.device("CPU"):
# A bug that prevents this from running on GPU for now.
text_vectorizer.adapt(adapt_data)
# Try out the layer
print(
"Encoded text:\n", text_vectorizer(["The Brain is deeper than the sea"]).numpy(),
)
# Create a simple model
inputs = keras.Input(shape=(text_vectorizer.vocabulary_size(),))
outputs = layers.Dense(1)(inputs)
model = keras.Model(inputs, outputs)
# Create a labeled dataset (which includes unknown tokens)
train_dataset = tf.data.Dataset.from_tensor_slices(
(["The Brain is deeper than the sea", "for if they are held Blue to Blue"], [1, 0])
)
# Preprocess the string inputs, turning them into int sequences
train_dataset = train_dataset.batch(2).map(lambda x, y: (text_vectorizer(x), y))
# Train the model on the int sequences
print("\nTraining model...")
model.compile(optimizer="rmsprop", loss="mse")
model.fit(train_dataset)
# For inference, you can export a model that accepts strings as input
inputs = keras.Input(shape=(1,), dtype="string")
x = text_vectorizer(inputs)
outputs = model(x)
end_to_end_model = keras.Model(inputs, outputs)
# Call the end-to-end model on test data (which includes unknown tokens)
print("\nCalling end-to-end model on test string...")
test_data = tf.constant(["The one the other will absorb"])
test_output = end_to_end_model(test_data)
print("Model output:", test_output)
WARNING:tensorflow:6 out of the last 1568 calls to <function PreprocessingLayer.make_adapt_function.<locals>.adapt_step at 0x7f1b9f6eae60> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details. Encoded text: [[5.461647 1.6945957 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.0986123 1.0986123 1.0986123 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.0986123 0. 0. 0. 0. 0. 0. 0. 1.0986123 1.0986123 0. 0. 0. ]] Training model... 1/1 [==============================] - 0s 239ms/step - loss: 4.4868 Calling end-to-end model on test string... Model output: tf.Tensor([[0.25670475]], shape=(1, 1), dtype=float32)
گوچاهای مهم
کار با لایه های جستجو با واژگان بسیار بزرگ
شما ممکن است خودتان با واژگان بسیار بزرگ در یک کار TextVectorization
، یک StringLookup
لایه، یا یک IntegerLookup
لایه. به طور معمول، واژگان بزرگتر از 500 مگابایت "بسیار بزرگ" در نظر گرفته می شود.
در چنین مواردی، برای بهترین عملکرد، شما باید با استفاده از اجتناب از adapt()
. در عوض، واژگان خود را از قبل محاسبه کنید (می توانید از Apache Beam یا TF Transform برای این کار استفاده کنید) و آن را در یک فایل ذخیره کنید. سپس واژگان به لایه در زمان ساخت و ساز با عبور از filepath به عنوان بار vocabulary
استدلال است.
با استفاده از لایه های جستوجو در یک غلاف TPU و یا با ParameterServerStrategy
.
است یک موضوع باقیمانده که باعث عملکرد به تنزل در هنگام استفاده از وجود دارد TextVectorization
، StringLookup
یا IntegerLookup
لایه در حالی که آموزش در یک غلاف TPU یا بر روی چندین ماشین از طریق ParameterServerStrategy
. قرار است این مشکل در TensorFlow 2.7 برطرف شود.