From 92acd477a16ed8a7fd69b3aa44862866bb48766d Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Mon, 17 Jun 2019 14:06:23 +0800 Subject: [PATCH 1/4] FIX: compile triplet loss within keras model --- tensorflow_addons/losses/triplet.py | 2 +- tensorflow_addons/losses/triplet_test.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tensorflow_addons/losses/triplet.py b/tensorflow_addons/losses/triplet.py index 0b3f275f35..d5f2999c9d 100644 --- a/tensorflow_addons/losses/triplet.py +++ b/tensorflow_addons/losses/triplet.py @@ -75,7 +75,7 @@ def triplet_semihard_loss(y_true, y_pred, margin=1.0): labels, embeddings = y_true, y_pred # Reshape [batch_size] label tensor to a [batch_size, 1] label tensor. lshape = tf.shape(labels) - assert lshape.shape == 1 + assert lshape.shape.rank == 1 labels = tf.reshape(labels, [lshape[0], 1]) # Build pairwise squared distance matrix. diff --git a/tensorflow_addons/losses/triplet_test.py b/tensorflow_addons/losses/triplet_test.py index 91d496825f..817ec6d50d 100644 --- a/tensorflow_addons/losses/triplet_test.py +++ b/tensorflow_addons/losses/triplet_test.py @@ -104,6 +104,13 @@ def test_unweighted(self): loss = cce_obj(y_true, y_pred) self.assertAlmostEqual(self.evaluate(loss), loss_np, 3) + def test_keras_model_compile(self): + model = tf.keras.models.Sequential([ + tf.keras.layers.Input(shape=(784,)), + tf.keras.layers.Dense(10), + ]) + model.compile(loss="triplet_semihard_loss", optimizer="adam") + if __name__ == '__main__': tf.test.main() From d1eef547e1e3ba4a00e5a0fe97656761d90527f5 Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Mon, 17 Jun 2019 14:57:00 +0800 Subject: [PATCH 2/4] remove dummy assertion --- tensorflow_addons/losses/triplet.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tensorflow_addons/losses/triplet.py b/tensorflow_addons/losses/triplet.py index d5f2999c9d..6717ea722c 100644 --- a/tensorflow_addons/losses/triplet.py +++ b/tensorflow_addons/losses/triplet.py @@ -73,9 +73,8 @@ def triplet_semihard_loss(y_true, y_pred, margin=1.0): margin: Float, margin term in the loss definition. """ labels, embeddings = y_true, y_pred - # Reshape [batch_size] label tensor to a [batch_size, 1] label tensor. + # Reshape label tensor to [batch_size, 1]. lshape = tf.shape(labels) - assert lshape.shape.rank == 1 labels = tf.reshape(labels, [lshape[0], 1]) # Build pairwise squared distance matrix. From 1da260a8d46889e273ce9d09513f1be3034e75fb Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Mon, 17 Jun 2019 15:44:34 +0800 Subject: [PATCH 3/4] add a testcase when the shape of y_true is invalid --- tensorflow_addons/losses/triplet_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tensorflow_addons/losses/triplet_test.py b/tensorflow_addons/losses/triplet_test.py index 817ec6d50d..6b06c20fe4 100644 --- a/tensorflow_addons/losses/triplet_test.py +++ b/tensorflow_addons/losses/triplet_test.py @@ -104,6 +104,15 @@ def test_unweighted(self): loss = cce_obj(y_true, y_pred) self.assertAlmostEqual(self.evaluate(loss), loss_np, 3) + def test_invalid_y_true_shape(self): + triplet_loss_obj = triplet.TripletSemiHardLoss() + + # The shape of y_true should be either [batch_size] or [batch_size, 1] + y_true = tf.ones(shape=(10, 3), dtype=tf.int32) + y_pred = tf.ones(shape=(10, 3), dtype=tf.float32) + with self.assertRaises(ValueError): + loss = triplet_loss_obj(y_true, y_pred) + def test_keras_model_compile(self): model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(784,)), From d01d6245e13c52f3ff3cb65f08c3db4698da7179 Mon Sep 17 00:00:00 2001 From: Tzu-Wei Sung Date: Mon, 17 Jun 2019 17:16:28 +0800 Subject: [PATCH 4/4] remove testcase of invalid shape --- tensorflow_addons/losses/triplet_test.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tensorflow_addons/losses/triplet_test.py b/tensorflow_addons/losses/triplet_test.py index 6b06c20fe4..817ec6d50d 100644 --- a/tensorflow_addons/losses/triplet_test.py +++ b/tensorflow_addons/losses/triplet_test.py @@ -104,15 +104,6 @@ def test_unweighted(self): loss = cce_obj(y_true, y_pred) self.assertAlmostEqual(self.evaluate(loss), loss_np, 3) - def test_invalid_y_true_shape(self): - triplet_loss_obj = triplet.TripletSemiHardLoss() - - # The shape of y_true should be either [batch_size] or [batch_size, 1] - y_true = tf.ones(shape=(10, 3), dtype=tf.int32) - y_pred = tf.ones(shape=(10, 3), dtype=tf.float32) - with self.assertRaises(ValueError): - loss = triplet_loss_obj(y_true, y_pred) - def test_keras_model_compile(self): model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(784,)),