خسائر TensorFlow الإضافية: TripletSemiHardLoss

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

سيوضح هذا الكمبيوتر الدفتري كيفية استخدام وظيفة TripletSemiHardLoss في TensorFlow Addons.

موارد:

تريبلتفوس

كما تم تقديمه لأول مرة في ورقة FaceNet ، فإن TripletLoss هي وظيفة خسارة تقوم بتدريب الشبكة العصبية لتضمين ميزات نفس الفئة عن كثب مع زيادة المسافة بين حفلات الزفاف من الفئات المختلفة. للقيام بذلك ، يتم اختيار المرساة مع عينة واحدة سلبية وأخرى إيجابية. تين. 3

توصف وظيفة الخسارة بأنها دالة مسافة إقليدية:

وظيفة

حيث يكون A هو إدخال الارتساء لدينا ، و P هو إدخال العينة الإيجابي ، و N هو إدخال العينة السلبي ، و alpha هو بعض الهامش الذي تستخدمه لتحديد متى يصبح الثلاثي "سهلًا" للغاية ولم تعد ترغب في تعديل الأوزان منه .

سيمي هارد التعلم عبر الإنترنت

كما هو موضح في الورقة ، فإن أفضل النتائج هي من ثلاثة توائم تُعرف باسم "شبه الصلب". يتم تعريف هذه على أنها ثلاثة توائم حيث يكون السالب بعيدًا عن المرساة عن الإيجابية ، ولكن لا يزال ينتج عنه خسارة إيجابية. للعثور على هذه التوائم الثلاثة بكفاءة ، فإنك تستخدم التعلم عبر الإنترنت وتتدرب فقط من الأمثلة شبه الصلبة في كل دفعة.

اقامة

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: التضمين