Cette page a été traduite par l'API Cloud Translation.
Switch to English

Pertes des addons TensorFlow: TripletSemiHardLoss

Voir sur TensorFlow.org Exécuter dans Google Colab Afficher la source sur GitHubTélécharger le carnet

Aperçu

Ce cahier vous montrera comment utiliser la fonction TripletSemiHardLoss dans les modules complémentaires TensorFlow.

Ressources:

Triplet Perte

Comme présenté pour la première fois dans l'article FaceNet, TripletLoss est une fonction de perte qui entraîne un réseau neuronal à intégrer étroitement des fonctionnalités de la même classe tout en maximisant la distance entre les plongements de différentes classes. Pour ce faire, une ancre est choisie avec un échantillon négatif et un échantillon positif. fig3

La fonction de perte est décrite comme une fonction de distance euclidienne:

fonction

Où A est notre entrée d'ancrage, P est l'entrée d'échantillon positive, N est l'entrée d'échantillon négative et alpha est une marge que nous utilisons pour spécifier quand un triplet est devenu trop "facile" et que nous ne voulons plus ajuster les poids à partir de celui-ci .

Apprentissage en ligne semi-dur

Comme le montre l'article, les meilleurs résultats proviennent de triplets appelés «semi-durs». Ceux-ci sont définis comme des triplets où le négatif est plus éloigné de l'ancre que le positif, mais produit toujours une perte positive. Pour trouver efficacement ces triplés, nous utilisons l'apprentissage en ligne et nous nous entraînons uniquement à partir des exemples semi-rigoureux de chaque lot.

Installer

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

Préparez les données

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 mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...

Warning:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

Construire le modèle

fig2

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

])

Former et évaluer

# 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 [==============================] - 7s 4ms/step - loss: 0.5907
Epoch 2/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.4570
Epoch 3/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.4242
Epoch 4/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.4048
Epoch 5/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.3928

# 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

Projecteur intégré

Les fichiers vectoriels et de métadonnées peuvent être chargés et visualisés ici: https://projector.tensorflow.org/

Vous pouvez voir les résultats de nos données de test intégrées lorsqu'ils sont visualisés avec UMAP: intégration