مشاهده در TensorFlow.org | در Google Colab اجرا شود | مشاهده منبع در GitHub | دانلود دفترچه یادداشت |
بررسی اجمالی
این نوت بوک نحوه استفاده از تابع TripletSemiHardLoss در افزونه های TensorFlow را نشان می دهد.
منابع:
- FaceNet: تعبیه یکپارچه برای تشخیص چهره و خوشه بندی
- وبلاگ الیور مویندرو در توصیف جزئیات الگوریتم بسیار عالی عمل می کند.
TripletLoss
همانطور که برای اولین بار در مقاله FaceNet معرفی شد، TripletLoss یک تابع از دست دادن است که یک شبکه عصبی را آموزش می دهد تا ویژگی های یک کلاس را از نزدیک جاسازی کند، در حالی که فاصله بین جاسازی های کلاس های مختلف را به حداکثر می رساند. برای انجام این کار یک لنگر به همراه یک نمونه منفی و یک نمونه مثبت انتخاب می شود.
تابع از دست دادن به عنوان تابع فاصله اقلیدسی توصیف می شود:
در جایی که A ورودی لنگر ما است، P ورودی نمونه مثبت، N ورودی نمونه منفی است، و آلفا مقداری حاشیه است که برای تعیین زمانی که یک سه گانه خیلی "آسان" شده است و دیگر نمی خواهید وزن ها را از آن تنظیم کنید استفاده می کنید. .
آموزش آنلاین نیمه سخت
همانطور که در مقاله نشان داده شده است، بهترین نتایج مربوط به سه قلوهای معروف به "نیمه سخت" است. اینها به عنوان سه قلو تعریف می شوند که در آن منفی از لنگر دورتر از مثبت است، اما همچنان ضرر مثبت ایجاد می کند. برای یافتن موثر این سه قلوها، از یادگیری آنلاین استفاده می کنید و فقط از نمونه های نیمه سخت در هر دسته آموزش می بینید.
برپایی
pip install -q -U tensorflow-addons
import io
import numpy as np
import tensorflow as tf
import tensorflow_addons as tfa
import tensorflow_datasets as tfds
داده ها را آماده کنید
def _normalize_img(img, label):
img = tf.cast(img, tf.float32) / 255.
return (img, label)
train_dataset, test_dataset = tfds.load(name="mnist", split=['train', 'test'], as_supervised=True)
# Build your input pipelines
train_dataset = train_dataset.shuffle(1024).batch(32)
train_dataset = train_dataset.map(_normalize_img)
test_dataset = test_dataset.batch(32)
test_dataset = test_dataset.map(_normalize_img)
Downloading and preparing dataset 11.06 MiB (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1... Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.
مدل را بسازید
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation=None), # No activation on final dense layer
tf.keras.layers.Lambda(lambda x: tf.math.l2_normalize(x, axis=1)) # L2 normalize embeddings
])
آموزش دهید و ارزیابی کنید
# Compile the model
model.compile(
optimizer=tf.keras.optimizers.Adam(0.001),
loss=tfa.losses.TripletSemiHardLoss())
# Train the network
history = model.fit(
train_dataset,
epochs=5)
Epoch 1/5 1875/1875 [==============================] - 21s 5ms/step - loss: 0.6983 Epoch 2/5 1875/1875 [==============================] - 8s 4ms/step - loss: 0.4723 Epoch 3/5 1875/1875 [==============================] - 8s 4ms/step - loss: 0.4298 Epoch 4/5 1875/1875 [==============================] - 8s 4ms/step - loss: 0.4139 Epoch 5/5 1875/1875 [==============================] - 8s 4ms/step - loss: 0.3938
# Evaluate the network
results = model.predict(test_dataset)
# Save test embeddings for visualization in projector
np.savetxt("vecs.tsv", results, delimiter='\t')
out_m = io.open('meta.tsv', 'w', encoding='utf-8')
for img, labels in tfds.as_numpy(test_dataset):
[out_m.write(str(x) + "\n") for x in labels]
out_m.close()
try:
from google.colab import files
files.download('vecs.tsv')
files.download('meta.tsv')
except:
pass
پروژکتور تعبیه شده
فایل های برداری و ابرداده را می توان بارگذاری شده و قابل مشاهده در اینجا: https://projector.tensorflow.org/
وقتی با UMAP تجسم میشوید، میتوانید نتایج دادههای آزمایشی تعبیهشده ما را ببینید: