تلفات افزونه های TensorFlow: TripletSemiHardLoss

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

این نوت بوک نحوه استفاده از تابع TripletSemiHardLoss در افزونه های TensorFlow را نشان می دهد.

منابع:

TripletLoss

همانطور که برای اولین بار در مقاله FaceNet معرفی شد، TripletLoss یک تابع از دست دادن است که یک شبکه عصبی را آموزش می دهد تا ویژگی های یک کلاس را از نزدیک جاسازی کند، در حالی که فاصله بین جاسازی های کلاس های مختلف را به حداکثر می رساند. برای انجام این کار یک لنگر به همراه یک نمونه منفی و یک نمونه مثبت انتخاب می شود. شکل 3

تابع از دست دادن به عنوان تابع فاصله اقلیدسی توصیف می شود:

عملکرد

در جایی که 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.

مدل را بسازید

شکل 2

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 تجسم می‌شوید، می‌توانید نتایج داده‌های آزمایشی تعبیه‌شده ما را ببینید: تعبیه کردن