Perdite di TensorFlow Addons: TripletSemiHardLoss

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza la fonte su GitHub Scarica taccuino

Panoramica

Questo notebook dimostrerà come utilizzare la funzione TripletSemiHardLoss in TensorFlow Addons.

Risorse:

TripletLoss

Come introdotto per la prima volta nel documento FaceNet, TripletLoss è una funzione di perdita che addestra una rete neurale per incorporare strettamente le caratteristiche della stessa classe massimizzando la distanza tra le incorporazioni di classi diverse. Per fare ciò viene scelta un'ancora insieme a un campione negativo e uno positivo. fig3

La funzione di perdita è descritta come una funzione della distanza euclidea:

funzione

Dove A è il nostro input di ancoraggio, P è l'input del campione positivo, N è l'input del campione negativo e alfa è un margine che usi per specificare quando una terzina è diventata troppo "facile" e non vuoi più regolare i pesi da essa .

Apprendimento online semidifficile

Come mostrato nel documento, i migliori risultati provengono da triplette note come "Semi-Hard". Questi sono definiti come terzine in cui il negativo è più lontano dall'ancora rispetto al positivo, ma produce comunque una perdita positiva. Per trovare in modo efficiente queste terzine, utilizzi l'apprendimento online e ti alleni solo dagli esempi Semi-Hard in ogni batch.

Impostare

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

Preparare i dati

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.

Costruisci il modello

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

])

Formare e valutare

# 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

Incorporamento del proiettore

I file vettoriali e metadati possono essere caricati e visualizzati qui: https://projector.tensorflow.org/

Puoi vedere i risultati dei nostri dati di test incorporati quando visualizzati con UMAP: incorporamento