chainer.functions.triplet¶
-
chainer.functions.triplet(anchor, positive, negative, margin=0.2, reduce='mean')[source]¶ Computes triplet loss.
It takes a triplet of variables as inputs, a, p and n: anchor, positive example and negative example respectively. The triplet defines a relative similarity between samples. Let N and K denote mini-batch size and the dimension of input variables, respectively. The shape of all input variables should be (N,K).
L(a,p,n)=1N(N∑i=1maxwhere d(x_i, y_i) = \| {\bf x}_i - {\bf y}_i \|_2^2.
The output is a variable whose value depends on the value of the option
reduce. If it is'no', it holds the elementwise loss values. If it is'mean', this function takes a mean of loss values.- Parameters
anchor (
Variableor N-dimensional array) – The anchor example variable. The shape should be (N, K), where N denotes the minibatch size, and K denotes the dimension of the anchor.positive (
Variableor N-dimensional array) – The positive example variable. The shape should be the same as anchor.negative (
Variableor N-dimensional array) – The negative example variable. The shape should be the same as anchor.margin (float) – A parameter for triplet loss. It should be a positive value.
reduce (str) – Reduction option. Its value must be either
'mean'or'no'. Otherwise,ValueErroris raised.
- Returns
A variable holding a scalar that is the loss value calculated by the above equation. If
reduceis'no', the output variable holds array whose shape is same as one of (hence both of) input variables. If it is'mean', the output variable holds a scalar value.- Return type
Note
This cost can be used to train triplet networks. See Learning Fine-grained Image Similarity with Deep Ranking for details.
Example
>>> anchor = np.array([[-2.0, 3.0, 0.5], [5.0, 2.0, -0.5]]).astype(np.float32) >>> pos = np.array([[-2.1, 2.8, 0.5], [4.9, 2.0, -0.4]]).astype(np.float32) >>> neg = np.array([[-2.1, 2.7, 0.7], [4.9, 2.0, -0.7]]).astype(np.float32) >>> F.triplet(anchor, pos, neg) variable(0.14000003) >>> y = F.triplet(anchor, pos, neg, reduce='no') >>> y.shape (2,) >>> y.array array([0.11000005, 0.17 ], dtype=float32) >>> F.triplet(anchor, pos, neg, margin=0.5) # harder penalty variable(0.44000003)