Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Kerugian Addons TensorFlow: TripletSemiHardLoss

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Gambaran

Notebook ini akan menunjukkan cara menggunakan fungsi TripletSemiHardLoss di TensorFlow Addons.

Sumber:

TripletLoss

Seperti yang pertama kali diperkenalkan dalam makalah FaceNet, TripletLoss adalah fungsi kehilangan yang melatih jaringan saraf untuk menyematkan fitur dari kelas yang sama sekaligus memaksimalkan jarak antara embedding dari kelas yang berbeda. Untuk melakukan ini, sebuah jangkar dipilih bersama dengan satu sampel negatif dan satu sampel positif. fig3

Fungsi kerugian dijelaskan sebagai fungsi jarak Euclidean:

fungsi

Di mana A adalah input jangkar kami, P adalah input sampel positif, N adalah input sampel negatif, dan alfa adalah beberapa margin yang kami gunakan untuk menentukan kapan triplet menjadi terlalu "mudah" dan kami tidak lagi ingin menyesuaikan bobot dari itu .

Belajar Online SemiHard

Seperti yang ditunjukkan di koran, hasil terbaik adalah dari kembar tiga yang dikenal sebagai "Semi-Hard". Ini didefinisikan sebagai kembar tiga di mana negatif lebih jauh dari jangkar daripada positif, tetapi masih menghasilkan kerugian positif. Untuk menemukan kembar tiga ini secara efisien, kami memanfaatkan pembelajaran online dan hanya melatih dari contoh-contoh Semi-Keras di setiap batch.

Mempersiapkan

 import io
import numpy as np
 
 try:
  %tensorflow_version 2.x
except:
  pass

import tensorflow as tf
 
pip install -q tensorflow_datasets
pip install -q --no-deps tensorflow-addons~=0.7
 import tensorflow_addons as tfa
import tensorflow_datasets as tfds
 

Siapkan Data

 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 (11.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.0...

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 set
data_dir=gs://tfds-data/datasets.


HBox(children=(FloatProgress(value=0.0, description='Dl Completed...', max=4.0, style=ProgressStyle(descriptio…


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

Bangun Model

gbr2

 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

])
 

Melatih dan Mengevaluasi

 # 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 [==============================] - 14s 7ms/step - loss: 0.4203
Epoch 2/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.2775
Epoch 3/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.2479
Epoch 4/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.2307
Epoch 5/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.2209

 # 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
 

Menyematkan Proyektor

File vektor dan metadata dapat dimuat dan divisualisasikan di sini: https://projector.tensorflow.org/

Anda dapat melihat hasil data uji tertanam kami ketika divisualisasikan dengan UMAP: menanamkan