From ddee20fd82b1480585cc49a078e78f43ec61be9c Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 10:46:32 +0000 Subject: [PATCH 1/6] Added tests for time stopping. --- tensorflow_addons/callbacks/BUILD | 10 +++ tensorflow_addons/callbacks/README.md | 1 - tensorflow_addons/callbacks/run_all_test.py | 8 ++ .../callbacks/time_stopping_test.py | 82 +++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 tensorflow_addons/callbacks/run_all_test.py create mode 100644 tensorflow_addons/callbacks/time_stopping_test.py diff --git a/tensorflow_addons/callbacks/BUILD b/tensorflow_addons/callbacks/BUILD index c2c8716a13..542dc09883 100644 --- a/tensorflow_addons/callbacks/BUILD +++ b/tensorflow_addons/callbacks/BUILD @@ -14,3 +14,13 @@ py_library( "//tensorflow_addons/utils", ], ) + +py_test( + name = "callbacks_test", + size = "small", + srcs = glob(["*_test.py"]), + main = "run_all_test.py", + deps = [ + ":callbacks", + ], +) diff --git a/tensorflow_addons/callbacks/README.md b/tensorflow_addons/callbacks/README.md index 8e84769279..d23dd4cfe4 100644 --- a/tensorflow_addons/callbacks/README.md +++ b/tensorflow_addons/callbacks/README.md @@ -17,7 +17,6 @@ must: you can use the `@pytest.mark.usefixtures("maybe_run_functions_eagerly")` decorator. This will run the tests twice, once normally, and once with `tf.config.experimental_run_functions_eagerly(True)`. - * Add a `py_test` to this sub-package's BUILD file. #### Documentation Requirements * Update the [CODEOWNERS file](https://github.com/tensorflow/addons/blob/master/.github/CODEOWNERS) diff --git a/tensorflow_addons/callbacks/run_all_test.py b/tensorflow_addons/callbacks/run_all_test.py new file mode 100644 index 0000000000..0ee443600f --- /dev/null +++ b/tensorflow_addons/callbacks/run_all_test.py @@ -0,0 +1,8 @@ +from pathlib import Path +import sys + +import pytest + +if __name__ == "__main__": + dirname = Path(__file__).absolute().parent + sys.exit(pytest.main([str(dirname)])) diff --git a/tensorflow_addons/callbacks/time_stopping_test.py b/tensorflow_addons/callbacks/time_stopping_test.py new file mode 100644 index 0000000000..1be0e23b8d --- /dev/null +++ b/tensorflow_addons/callbacks/time_stopping_test.py @@ -0,0 +1,82 @@ +import time + +import pytest +import numpy as np +import tensorflow as tf +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense + +from tensorflow_addons.callbacks import TimeStopping + + +class SleepLayer(tf.keras.layers.Layer): + def __init__(self, secs): + self.secs = secs + super().__init__(dynamic=True) + + def call(self, inputs): + time.sleep(self.secs) + return inputs + + +def test_stop_at_the_right_time(): + X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) + y = np.array([[0], [1], [1], [0]]) + + model = Sequential() + model.add(SleepLayer(0.1)) + model.add(Dense(1)) + model.compile(loss="mean_squared_error") + + # In case there is some initialization going on. + model.fit(X, y, epochs=1, verbose=0) + + time_stopping = TimeStopping(2, verbose=0) + history = model.fit(X, y, epochs=30, verbose=0, callbacks=[time_stopping]) + + assert len(history.epoch) <= 20 + + +def test_default_value(): + X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) + y = np.array([[0], [1], [1], [0]]) + + model = Sequential() + model.add(SleepLayer(0.1)) + model.add(Dense(1)) + model.compile(loss="mean_squared_error") + + # In case there is some initialization going on. + model.fit(X, y, epochs=1, verbose=0) + + time_stopping = TimeStopping() + history = model.fit(X, y, epochs=15, verbose=0, callbacks=[time_stopping]) + + assert len(history.epoch) == 15 + + +@pytest.mark.parametrize("verbose", [0, 1]) +def test_time_stopping_verbose(capsys, verbose): + X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) + y = np.array([[0], [1], [1], [0]]) + + model = Sequential() + model.add(SleepLayer(0.25)) + model.add(Dense(1)) + model.compile(loss="mean_squared_error") + + # In case there is some initialization going on. + model.fit(X, y, epochs=1, verbose=0) + + time_stopping = TimeStopping(1, verbose=verbose) + + capsys.readouterr() # flush the stdout/stderr buffer. + history = model.fit(X, y, epochs=10, verbose=0, callbacks=[time_stopping]) + + nb_epochs_run = len(history.epoch) + message = "Timed stopping at epoch " + str(nb_epochs_run) + if verbose: + assert message in capsys.readouterr().out + else: + assert message not in capsys.readouterr().out + assert len(history.epoch) <= 4 From da8304728adf34b96d70de10a2c086de763baa33 Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 10:49:59 +0000 Subject: [PATCH 2/6] Small refactoring. --- .../callbacks/time_stopping_test.py | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/tensorflow_addons/callbacks/time_stopping_test.py b/tensorflow_addons/callbacks/time_stopping_test.py index 1be0e23b8d..26e91905a6 100644 --- a/tensorflow_addons/callbacks/time_stopping_test.py +++ b/tensorflow_addons/callbacks/time_stopping_test.py @@ -19,17 +19,22 @@ def call(self, inputs): return inputs -def test_stop_at_the_right_time(): +def get_model_and_data(secs): X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) model = Sequential() - model.add(SleepLayer(0.1)) + model.add(SleepLayer(secs)) model.add(Dense(1)) model.compile(loss="mean_squared_error") # In case there is some initialization going on. model.fit(X, y, epochs=1, verbose=0) + return X, y, model + + +def test_stop_at_the_right_time(): + X, y, model = get_model_and_data(0.1) time_stopping = TimeStopping(2, verbose=0) history = model.fit(X, y, epochs=30, verbose=0, callbacks=[time_stopping]) @@ -38,16 +43,7 @@ def test_stop_at_the_right_time(): def test_default_value(): - X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y = np.array([[0], [1], [1], [0]]) - - model = Sequential() - model.add(SleepLayer(0.1)) - model.add(Dense(1)) - model.compile(loss="mean_squared_error") - - # In case there is some initialization going on. - model.fit(X, y, epochs=1, verbose=0) + X, y, model = get_model_and_data(0.1) time_stopping = TimeStopping() history = model.fit(X, y, epochs=15, verbose=0, callbacks=[time_stopping]) @@ -57,16 +53,7 @@ def test_default_value(): @pytest.mark.parametrize("verbose", [0, 1]) def test_time_stopping_verbose(capsys, verbose): - X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - y = np.array([[0], [1], [1], [0]]) - - model = Sequential() - model.add(SleepLayer(0.25)) - model.add(Dense(1)) - model.compile(loss="mean_squared_error") - - # In case there is some initialization going on. - model.fit(X, y, epochs=1, verbose=0) + X, y, model = get_model_and_data(0.25) time_stopping = TimeStopping(1, verbose=verbose) From 4530c4a045523f67a285d4b5930234ad85cef235 Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 10:50:37 +0000 Subject: [PATCH 3/6] Rename. --- tensorflow_addons/callbacks/time_stopping_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_addons/callbacks/time_stopping_test.py b/tensorflow_addons/callbacks/time_stopping_test.py index 26e91905a6..dbc0a3b57a 100644 --- a/tensorflow_addons/callbacks/time_stopping_test.py +++ b/tensorflow_addons/callbacks/time_stopping_test.py @@ -19,7 +19,7 @@ def call(self, inputs): return inputs -def get_model_and_data(secs): +def get_data_and_model(secs): X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) @@ -34,7 +34,7 @@ def get_model_and_data(secs): def test_stop_at_the_right_time(): - X, y, model = get_model_and_data(0.1) + X, y, model = get_data_and_model(0.1) time_stopping = TimeStopping(2, verbose=0) history = model.fit(X, y, epochs=30, verbose=0, callbacks=[time_stopping]) @@ -43,7 +43,7 @@ def test_stop_at_the_right_time(): def test_default_value(): - X, y, model = get_model_and_data(0.1) + X, y, model = get_data_and_model(0.1) time_stopping = TimeStopping() history = model.fit(X, y, epochs=15, verbose=0, callbacks=[time_stopping]) @@ -53,7 +53,7 @@ def test_default_value(): @pytest.mark.parametrize("verbose", [0, 1]) def test_time_stopping_verbose(capsys, verbose): - X, y, model = get_model_and_data(0.25) + X, y, model = get_data_and_model(0.25) time_stopping = TimeStopping(1, verbose=verbose) From b6bcd29c2148f1f87fce81dcf5892bb57c6d9dae Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 10:51:57 +0000 Subject: [PATCH 4/6] Refactoring. --- tensorflow_addons/callbacks/time_stopping_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_addons/callbacks/time_stopping_test.py b/tensorflow_addons/callbacks/time_stopping_test.py index dbc0a3b57a..a26b4c92c7 100644 --- a/tensorflow_addons/callbacks/time_stopping_test.py +++ b/tensorflow_addons/callbacks/time_stopping_test.py @@ -59,11 +59,11 @@ def test_time_stopping_verbose(capsys, verbose): capsys.readouterr() # flush the stdout/stderr buffer. history = model.fit(X, y, epochs=10, verbose=0, callbacks=[time_stopping]) - + fit_stdout = capsys.readouterr().out nb_epochs_run = len(history.epoch) message = "Timed stopping at epoch " + str(nb_epochs_run) if verbose: - assert message in capsys.readouterr().out + assert message in fit_stdout else: - assert message not in capsys.readouterr().out + assert message not in fit_stdout assert len(history.epoch) <= 4 From 35f7f8b253a9e137b6505c85ae3e044d92415a4c Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 11:05:09 +0000 Subject: [PATCH 5/6] Calming the angry bazel. --- tensorflow_addons/callbacks/time_stopping_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_addons/callbacks/time_stopping_test.py b/tensorflow_addons/callbacks/time_stopping_test.py index a26b4c92c7..3cfc8aaeca 100644 --- a/tensorflow_addons/callbacks/time_stopping_test.py +++ b/tensorflow_addons/callbacks/time_stopping_test.py @@ -6,7 +6,7 @@ from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense -from tensorflow_addons.callbacks import TimeStopping +from tensorflow_addons.callbacks.time_stopping import TimeStopping class SleepLayer(tf.keras.layers.Layer): From 745150dfabde1aa515139b1c784b32db27a201b4 Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Thu, 2 Apr 2020 11:32:36 +0000 Subject: [PATCH 6/6] Added the dependency to optimizers. --- tensorflow_addons/callbacks/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_addons/callbacks/BUILD b/tensorflow_addons/callbacks/BUILD index 542dc09883..7f372c9c0c 100644 --- a/tensorflow_addons/callbacks/BUILD +++ b/tensorflow_addons/callbacks/BUILD @@ -11,6 +11,7 @@ py_library( "tqdm_progress_bar.py", ], deps = [ + "//tensorflow_addons/optimizers", "//tensorflow_addons/utils", ], )