omoindrot/tensorflow-triplet-loss
omoindrot/tensorflow-triplet-loss has 1,125 GitHub stars and 281 forks. GitHot measured -1 in 7 days. Last checked 2026-11-10 23:58 UTC. Last push 2019-05-09.
Implementation of triplet loss in TensorFlow
Measured star growth
- in 24h
- Update delayed
- in 7 days
- -1
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalTriplet loss in TensorFlow 
Author: Olivier Moindrot
This repository contains a triplet loss implementation in TensorFlow with online triplet mining. Please check the blog post for a full description.
The code structure is adapted from code I wrote for CS230 in this repository at tensorflow/vision.
A set of tutorials for this code can be found here.
Requirements
We recommend using python3 and a virtual environment.
The default venv should be used, or virtualenv with python3.
python3 -m venv .env
source .env/bin/activate
pip install -r requirements_cpu.txt
If you are using a GPU, you will need to install tensorflow-gpu so do:
pip install -r requirements_gpu.txt
Triplet loss
![]() |
|---|
| Triplet loss on two positive faces (Obama) and one negative face (Macron) |
The interesting part, defining triplet loss with triplet mining can be found in model/triplet_loss.py.
Everything is explained in the blog post.
To use the "batch all" version, you can do:
from model.triplet_loss import batch_all_triplet_loss
loss, fraction_positive = batch_all_triplet_loss(labels, embeddings, margin, squared=False)
In this case fraction_positive is a useful thing to plot in TensorBoard to track the average number of hard and semi-hard triplets.
To use the "batch hard" version, you can do:
from model.triplet_loss import batch_hard_triplet_loss
loss = batch_hard_triplet_loss(labels, embeddings, margin, squared=False)
Training on MNIST
To run a new experiment called base_model, do:
python train.py --model_dir experiments/base_model
You will first need to create a configuration file like this one: params.json.
This json file specifies all the hyperparameters for the model.
All the weights and summaries will be saved in the model_dir.
Once trained, you can visualize the embeddings by running:
python visualize_embeddings.py --model_dir experiments/base_model
And run tensorboard in the experiment directory:
tensorboard --logdir experiments/base_model
Here is the result (link to gif):
![]() |
|---|
| Embeddings of the MNIST test images visualized with T-SNE (perplexity 25) |
Test
To run all the tests, run this from the project directory:
pytest
To run a specific test:
pytest model/tests/test_triplet_loss.py
Resources
- Blog post explaining this project.
- Source code for the built-in TensorFlow function for semi hard online mining triplet loss:
tf.contrib.losses.metric_learning.triplet_semihard_loss. - Facenet paper introducing online triplet mining
- Detailed explanation of online triplet mining in In Defense of the Triplet Loss for Person Re-Identification
- Blog post by Brandom Amos on online triplet mining: OpenFace 0.2.0: Higher accuracy and halved execution time.
- Source code for the built-in TensorFlow function for semi hard online mining triplet loss:
tf.contrib.losses.metric_learning.triplet_semihard_loss. - The coursera lecture on triplet loss
Explore related projects
tensorflow/tensorflow
An Open Source Machine Learning Framework for Everyone
201,427 starshuggingface/transformers
🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.
168,711 starsAUTOMATIC1111/stable-diffusion-webui
Stable Diffusion web UI
165,274 starsComfy-Org/ComfyUI
The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. The fastest local inference engine in the world.
146,271 stars
