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:
- FaceNet: un'integrazione unificata per il riconoscimento dei volti e il clustering
- Il blog di Oliver Moindrot fa un ottimo lavoro nel descrivere l'algoritmo in dettaglio
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.
La funzione di perdita è descritta come una funzione della distanza euclidea:
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
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: