La mise en œuvre de contrastive de la perte et de triplet perte de Tensorflow
J'ai commencé à jouer avec TensorFlow il y a deux jours et je me demandais si il est le triplet et le contrastive des pertes de mis en œuvre.
J'ai été à la recherche à la documentation, mais je n'ai pas trouvé d'exemple ou de la description à propos de ces choses.
Vous devez vous connecter pour publier un commentaire.
Mise à jour (2018/03/19): j'ai écrit un post de blog détaillant la façon de mettre en œuvre triplet perte de TensorFlow.
Vous avez besoin pour mettre en œuvre vous-même les contrastive de la perte ou du triplet de la perte, mais une fois que vous connaissez les paires ou triplets c'est assez facile.
Contrastive Perte
Supposons que vous avez comme entrée les paires de données et de leur label (positif ou négatif, c'est à dire d'une même classe ou d'une autre classe). Par exemple, vous avez des images en entrée de taille 28x28x1:
Triplet Perte
Même avec contrastive de la perte, mais avec des triplets (ancre, positif, négatif). Vous n'avez pas besoin d'étiquettes ici.
Les vrais problèmes lors de la mise en œuvre de triplet de perte ou contrastive perte de TensorFlow est comment échantillonner les triplets ou des paires de. Je vais me concentrer sur la génération de triplets parce qu'il est plus difficile de générer des paires.
Le plus simple est de les générer à l'extérieur de la Tensorflow graphique, c'est à dire en python et les nourrir pour le réseau à travers les espaces réservés. Fondamentalement, vous sélectionnez des images 3 à la fois, avec les deux premiers dans la même catégorie et la troisième d'une autre classe. Nous effectuons ensuite une anticipation sur ces triplets, et de calculer le triplet perte.
Le problème ici est que la génération de triplets est compliqué. Nous voulons qu'ils soient valide triplets, triplés avec un positif de la perte (dans le cas contraire, la perte est de 0 et le réseau n'a pas à apprendre).
Pour savoir si un triplet qui est bon ou non vous avez besoin de calculer sa perte, afin de vous faire déjà une anticipation à travers le réseau...
Clairement, la mise en œuvre de triplet perte de Tensorflow est dur, et il y a des façons de le rendre plus efficaces que l'échantillonnage en python, mais en expliquant pourrait faire l'objet d'un blog ensemble !
sess.run()
appel, vous pouvez ajouter untf.py_func
fonctionnement à l'intérieur du graphique pour filtrer les mauvais triplets.tf.py_func
(la deuxième idée que j'ai donné)?d
est utilisé à la place desqrt_d
à la fin de la première mission àloss
dans contrastive de la perte?Triplet perte de semihard négatifs de l'exploitation minière est maintenant mis en œuvre dans
tf.contrib
, comme suit:où:
étiquettes: 1-D tf.int32 Tenseur de la forme [batch_size] de la multiclasse
étiquettes entières.
plongements: 2-D float Tenseur de l'intégration des vecteurs.Plongements devrait
soit l2 normalisé.
Pour de plus amples informations, consultez le lien ci-dessous:
https://www.tensorflow.org/versions/master/api_docs/python/tf/contrib/losses/metric_learning/triplet_semihard_loss
Tiago, je ne pense pas que vous êtes en utilisant la même formule Olivier a donné.
Voici le bon code (pas sûr que ça va fonctionner, cependant, seulement la fixation de la formule) :