Embedding Layer و Representationهای قابلTrain
شکل 13-7. نزدیکی Word Embeddingهای مشابه و جهتهای معنایی
Embedding فقط برای Categoryهای جدولی نیست؛ Word Embedding نمونهٔ مشهور آن است. اگر Vectorهای Wordها در Training یاد گرفته شوند، Relationهای Semantic میتوانند به شکل Geometry در Space ظاهر شوند؛ Wordهای مشابه نزدیک میشوند و حتی بعضی Directionها Concept مشخصی مانند Gender را Encode میکنند.
Keras این ایده را با Embedding پیادهسازی میکند. Layer یک Matrix به Shape [input_dim, output_dim] دارد و برای هر Integer ID، Row متناظر را برمیگرداند:
embedding = tf.keras.layers.Embedding(
input_dim=5, output_dim=2)
embedding(tf.constant([2, 4, 2]))
اگر Input Sequence باشد، برای هر Token یک Vector تولید میشود و Output یک Dimension اضافهٔ Embedding دارد. Embedding Weightها همراه بقیهٔ Model با Gradient Descent Train میشوند.
برای Featureهای Categorical جدولی، Flow معمول میتواند چنین باشد: StringLookup → Integer ID → Embedding → Concatenate با Featureهای عددی Normalizeشده → Dense Network. برای چند Category Feature میتوان Lookup/Embedding جداگانه یا Shared Embedding بهکار برد، بسته به Semantic آنها.
Text Preprocessing
Keras برای Preprocessing پایهٔ Text از TextVectorization استفاده میکند. این Layer میتواند Text را Normalize کند، Tokenize کند، Vocabulary را با adapt() بیاموزد و Tokenها را به Integer ID تبدیل کند:
text_vec_layer = tf.keras.layers.TextVectorization()
text_vec_layer.adapt([
"Be good!",
"Question: be or be?"
])
text_vec_layer([
"Be good!",
"Question: be or be?"
])
Vocabulary Indexهای ویژهای برای Padding/Mask و OOV دارد. Output Sequenceها تا طول مشخص Pad یا Trim میشوند تا Batch Tensor منظم بسازند. Optionهای Layer میتوانند Output را به Binary/Count/TF-IDF Vector نیز تبدیل کنند و N-gram بسازند.
برای شبکههای Sequence، Integer IDها معمولاً وارد Embedding Layer میشوند. یک Pipeline ساده:
model = tf.keras.Sequential([
text_vec_layer,
tf.keras.layers.Embedding(input_dim=vocab_size,
output_dim=embed_size,
mask_zero=True),
# لایههای بعدی برای پردازش sequence
])
mask_zero=True کمک میکند Layerهای سازگار با Mask، Tokenهای Padding را نادیده بگیرند.
استفاده از Componentهای Pretrained زبان
برای Taskهای NLP اغلب بهتر است Representation Pretrained را Reuse کنیم. TensorFlow Hub Componentهای آماده را ارائه میکند. یک Module ممکن است Text خام را بگیرد و Sentence Embedding بدهد؛ در نتیجه Tokenization، Vocabulary و Embedding از قبل داخل Component تعریف شده است:
import tensorflow_hub as hub
hub_layer = hub.KerasLayer(
"https://tfhub.dev/google/nnlm-en-dim50/2",
output_shape=[50], input_shape=[], dtype=tf.string)
model = tf.keras.Sequential([
hub_layer,
tf.keras.layers.Dense(16, activation="relu"),
tf.keras.layers.Dense(1, activation="sigmoid")
])
در پروژههای واقعی باید Version، License، Input Contract و Trainable/Non-Trainable بودن Module بررسی شود. استفادهٔ مجدد از Componentهای Pretrained میتواند Data و زمان Training موردنیاز را بهشدت کاهش دهد.
Image Preprocessing Layerها
Keras Layerهای پایه برای Image دارد:
Resizing برای تغییر Height/Width؛
Rescaling برای Scale و Offset کردن Pixelها؛
CenterCrop برای Crop مرکزی.
preprocessing_model = tf.keras.Sequential([
tf.keras.layers.Resizing(height=224, width=224),
tf.keras.layers.Rescaling(scale=1./255)
])
برای Data Augmentation Layerهایی مانند RandomCrop، RandomFlip، RandomTranslation، RandomRotation، RandomZoom، RandomHeight، RandomWidth و RandomContrast وجود دارند. این Layerها فقط هنگام Training Transformation تصادفی اعمال میکنند و در Inference غیرفعالاند. قرار دادن آنها داخل Model باعث میشود Pipeline Training تکرارپذیر و Deployment سادهتر شود.
پروژهٔ TensorFlow Datasets
TensorFlow Datasets یا TFDS مجموعهٔ بزرگی از Datasetهای آماده را همراه Metadata و Splitهای استاندارد ارائه میکند. نصب Package و Load Dataset بسیار ساده است:
import tensorflow_datasets as tfds
train_set, valid_set, test_set = tfds.load(
name="mnist",
split=["train[:90%]", "train[90%:]", "test"],
as_supervised=True)
train_set = train_set.shuffle(10_000, seed=42).batch(32).prefetch(1)
valid_set = valid_set.batch(32).cache()
test_set = test_set.batch(32).cache()
as_supervised=True Item را به Tuple استاندارد (input, label) تبدیل میکند و مستقیماً با Keras سازگار است. TFDS Download، Verification، Cache و Split را مدیریت میکند. برای Datasetهای بزرگ میتوان Streaming یا Optionهای Data Directory را استفاده کرد.
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(10, activation="softmax")
])
model.compile(loss="sparse_categorical_crossentropy",
optimizer="nadam", metrics=["accuracy"])
model.fit(train_set, validation_data=valid_set, epochs=5)
model.evaluate(test_set)
جمعبندی فصل ۱۳
فصل نشان داد چگونه tf.data Datasetهای بزرگ را Stream، Shuffle، Interleave، Map، Batch، Cache و Prefetch میکند؛ TFRecord و Protocol Buffer برای Storage بهینه چگونه استفاده میشوند؛ و Keras Preprocessing Layerها چطور Normalize، Discretize، Encode، Hash، Embed و Preprocess Text/Image را داخل Model میآورند. ترکیب tf.data و Preprocessing Layerها هم Performance Training را بالا میبرد و هم خطر اختلاف Training و Production را کم میکند.
تمرینهای فصل ۱۳
- چرا tf.data برای Datasetهای بزرگ مفید است و مهمترین Transformationهای آن کداماند؟
- چگونه میتوان Fileهای بزرگ را Shuffle کرد وقتی کل Dataset در RAM جا نمیشود؟
- Prefetching چگونه CPU و GPU را همزمان درگیر میکند و AUTOTUNE چه نقشی دارد؟
- TFRecord چیست و چه زمانی نسبت به CSV مزیت دارد؟
- Example و SequenceExample چه تفاوتی دارند و چه نوع Dataای برای هرکدام مناسب است؟
- Preprocessing را چه زمانی داخل tf.data و چه زمانی داخل Keras Model انجام میدهید؟
- StringLookup، Hashing و Embedding را از نظر نیاز به Vocabulary، Collision و Dimension Output مقایسه کنید.
- TextVectorization چگونه Text خام را به Tensor قابلاستفاده برای Model تبدیل میکند؟
- Fashion MNIST را به TFRecordهای متعدد تبدیل کنید؛ هر Record یک Example با Image Serializeشده و Label باشد. سپس Datasetهای کارآمد برای Train/Validation/Test بسازید و Preprocessing Layer را داخل Keras Model قرار دهید.
- Dataset نقدهای IMDb را Download کنید، Split مناسب بسازید، Text Fileها را با tf.data بهصورت موازی بخوانید و Preprocess کنید، سپس Model Binary Classification شامل Embedding Layer Train کنید.
راهحل تمرینها در Notebook همراه فصل در https://homl.info/colab3 قرار دارد.