From a31c1fd1fa2413bc00f39ff5e41ccdc5c538e314 Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 11 Jun 2017 15:20:22 +0100 Subject: [PATCH 1/7] Update imports to support TensorFlow v1.2. --- seq2seq/contrib/seq2seq/helper.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/seq2seq/contrib/seq2seq/helper.py b/seq2seq/contrib/seq2seq/helper.py index 977d0ab9..353a1386 100644 --- a/seq2seq/contrib/seq2seq/helper.py +++ b/seq2seq/contrib/seq2seq/helper.py @@ -32,8 +32,13 @@ import six -from tensorflow.contrib.distributions.python.ops import bernoulli -from tensorflow.contrib.distributions.python.ops import categorical +try: + from tensorflow.python.ops.distributions import bernoulli + from tensorflow.python.ops.distributions import categorical +except: + # Backwards compatibility with TensorFlow prior to 1.2. + from tensorflow.contrib.distributions.python.ops import bernoulli + from tensorflow.contrib.distributions.python.ops import categorical from tensorflow.python.framework import dtypes from tensorflow.python.framework import ops from tensorflow.python.layers import base as layers_base From 8053094a02340492e8f2ff5e594714dd7b17071d Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 11 Jun 2017 15:18:50 +0100 Subject: [PATCH 2/7] Fix typo in hooks_test.py. --- seq2seq/test/hooks_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seq2seq/test/hooks_test.py b/seq2seq/test/hooks_test.py index dedc6594..a04cdabc 100644 --- a/seq2seq/test/hooks_test.py +++ b/seq2seq/test/hooks_test.py @@ -39,7 +39,7 @@ class TestPrintModelAnalysisHook(tf.test.TestCase): def test_begin(self): model_dir = tempfile.mkdtemp() outfile = tempfile.NamedTemporaryFile() - tf.get_variable("weigths", [128, 128]) + tf.get_variable("weights", [128, 128]) hook = hooks.PrintModelAnalysisHook( params={}, model_dir=model_dir, run_config=tf.contrib.learn.RunConfig()) hook.begin() @@ -125,7 +125,7 @@ def tearDown(self): def test_capture(self): global_step = tf.contrib.framework.get_or_create_global_step() # Some test computation - some_weights = tf.get_variable("weigths", [2, 128]) + some_weights = tf.get_variable("weights", [2, 128]) computation = tf.nn.softmax(some_weights) hook = hooks.MetadataCaptureHook( From 4448976cbc0854ae406b4cfeeb235b705b95102a Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 11 Jun 2017 15:19:27 +0100 Subject: [PATCH 3/7] Update hooks_test.py to work with TensorFlow 1.2. --- seq2seq/test/hooks_test.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/seq2seq/test/hooks_test.py b/seq2seq/test/hooks_test.py index a04cdabc..70d395e7 100644 --- a/seq2seq/test/hooks_test.py +++ b/seq2seq/test/hooks_test.py @@ -24,6 +24,7 @@ import tempfile import shutil import time +from distutils.version import LooseVersion import tensorflow as tf from tensorflow.python.training import monitored_session # pylint: disable=E0611 @@ -47,8 +48,14 @@ def test_begin(self): with gfile.GFile(os.path.join(model_dir, "model_analysis.txt")) as file: file_contents = file.read().strip() - self.assertEqual(file_contents.decode(), "_TFProfRoot (--/16.38k params)\n" - " weigths (128x128, 16.38k/16.38k params)") + if LooseVersion(tf.VERSION) < LooseVersion("1.2.0"): + self.assertEqual(file_contents.decode(), "_TFProfRoot (--/16.38k params)\n" + " weights (128x128, 16.38k/16.38k params)") + else: + self.assertEqual(file_contents.decode(), "node name | # parameters\n" + "_TFProfRoot (--/16.38k params)\n" + " weights (128x128, 16.38k/16.38k params)") + outfile.close() From f85d026c0f7bff2c06c991012271e4c4fd1af1a6 Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 11 Jun 2017 18:03:43 +0100 Subject: [PATCH 4/7] Fix hooks_test.py on Python 3. Fixes the following error when running the tests on Python 3. Traceback (most recent call last): File "seq2seq/seq2seq/test/hooks_test.py", line 55, in test_begin self.assertEqual(file_contents.decode(), ...) AttributeError: 'str' object has no attribute 'decode' --- seq2seq/test/hooks_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seq2seq/test/hooks_test.py b/seq2seq/test/hooks_test.py index 70d395e7..8fe4db01 100644 --- a/seq2seq/test/hooks_test.py +++ b/seq2seq/test/hooks_test.py @@ -49,10 +49,10 @@ def test_begin(self): file_contents = file.read().strip() if LooseVersion(tf.VERSION) < LooseVersion("1.2.0"): - self.assertEqual(file_contents.decode(), "_TFProfRoot (--/16.38k params)\n" + self.assertEqual(tf.compat.as_text(file_contents), "_TFProfRoot (--/16.38k params)\n" " weights (128x128, 16.38k/16.38k params)") else: - self.assertEqual(file_contents.decode(), "node name | # parameters\n" + self.assertEqual(tf.compat.as_text(file_contents), "node name | # parameters\n" "_TFProfRoot (--/16.38k params)\n" " weights (128x128, 16.38k/16.38k params)") From 83d592f2e9d00c6cb1597fd27b8dcdd2b3277e70 Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 11 Jun 2017 18:21:40 +0100 Subject: [PATCH 5/7] Another go at fixing hooks_test.py. distutils.version isn't available on the CI versions, so change the test to not rely explicitly on the version of TensorFlow installed. --- seq2seq/test/hooks_test.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/seq2seq/test/hooks_test.py b/seq2seq/test/hooks_test.py index 8fe4db01..abea8125 100644 --- a/seq2seq/test/hooks_test.py +++ b/seq2seq/test/hooks_test.py @@ -24,7 +24,6 @@ import tempfile import shutil import time -from distutils.version import LooseVersion import tensorflow as tf from tensorflow.python.training import monitored_session # pylint: disable=E0611 @@ -48,13 +47,13 @@ def test_begin(self): with gfile.GFile(os.path.join(model_dir, "model_analysis.txt")) as file: file_contents = file.read().strip() - if LooseVersion(tf.VERSION) < LooseVersion("1.2.0"): - self.assertEqual(tf.compat.as_text(file_contents), "_TFProfRoot (--/16.38k params)\n" - " weights (128x128, 16.38k/16.38k params)") - else: - self.assertEqual(tf.compat.as_text(file_contents), "node name | # parameters\n" - "_TFProfRoot (--/16.38k params)\n" - " weights (128x128, 16.38k/16.38k params)") + lines = tf.compat.as_text(file_contents).split("\n") + if len(lines) == 3: + # TensorFlow v1.2 includes an extra header line + self.assertEqual(lines[0], "node name | # parameters") + + self.assertEqual(lines[-2], "_TFProfRoot (--/16.38k params)") + self.assertEqual(lines[-1], " weights (128x128, 16.38k/16.38k params)") outfile.close() From ffb1505655b3e3836b054da2b0b2981da2e29a5c Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 18 Jun 2017 14:36:28 +0100 Subject: [PATCH 6/7] Tell pylint about the tf contextmanager. Use of `tf.name_scope` and `tf.variable_scope` cause pylint errors on TF1.2 due to pylint not fully understanding the `tf_contextlib.contextmanager` decorators. --- pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylintrc b/pylintrc index 2a182c2f..0e75ca0c 100644 --- a/pylintrc +++ b/pylintrc @@ -292,7 +292,7 @@ generated-members=set_shape,np.float32 # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. -contextmanager-decorators=contextlib.contextmanager +contextmanager-decorators=contextlib.contextmanager,tensorflow.python.util.tf_contextlib.contextmanager [VARIABLES] From 0c20ee4d8546dd905871049825d0883eda491bca Mon Sep 17 00:00:00 2001 From: Darren Garvey Date: Sun, 18 Jun 2017 15:00:57 +0100 Subject: [PATCH 7/7] Work around no-name-in-module pylint errors. Following some changes in TF to the `LazyLoader` [1], pylint complains about not being able to find some imports under `tf.contrib`. This looks like a pylint issue, emitting errors like: ************* Module seq2seq.encoders.rnn_encoder E: 24, 0: No name 'rnn' in module 'LazyLoader' (no-name-in-module) ************* Module seq2seq.data.input_pipeline E: 32, 0: No name 'slim' in module 'LazyLoader' (no-name-in-module) [1] https://github.com/tensorflow/tensorflow/commit/95c5d7e880b8b4d18ba1f3b7cf40d15cd218b3c9 --- seq2seq/data/input_pipeline.py | 2 ++ seq2seq/data/parallel_data_provider.py | 2 ++ seq2seq/data/sequence_example_decoder.py | 2 ++ seq2seq/data/split_tokens_decoder.py | 2 ++ seq2seq/encoders/image_encoder.py | 2 ++ seq2seq/encoders/rnn_encoder.py | 3 +-- seq2seq/metrics/metric_specs.py | 2 ++ 7 files changed, 13 insertions(+), 2 deletions(-) diff --git a/seq2seq/data/input_pipeline.py b/seq2seq/data/input_pipeline.py index 1d22b5cc..b452adf0 100644 --- a/seq2seq/data/input_pipeline.py +++ b/seq2seq/data/input_pipeline.py @@ -29,7 +29,9 @@ import six import tensorflow as tf +# pylint: disable=no-name-in-module from tensorflow.contrib.slim.python.slim.data import tfexample_decoder +# pylint: enable=no-name-in-module from seq2seq.configurable import Configurable from seq2seq.data import split_tokens_decoder, parallel_data_provider diff --git a/seq2seq/data/parallel_data_provider.py b/seq2seq/data/parallel_data_provider.py index 269add9d..c07046bb 100644 --- a/seq2seq/data/parallel_data_provider.py +++ b/seq2seq/data/parallel_data_provider.py @@ -22,8 +22,10 @@ import numpy as np import tensorflow as tf +# pylint: disable=no-name-in-module from tensorflow.contrib.slim.python.slim.data import data_provider from tensorflow.contrib.slim.python.slim.data import parallel_reader +# pylint: enable=no-name-in-module from seq2seq.data import split_tokens_decoder diff --git a/seq2seq/data/sequence_example_decoder.py b/seq2seq/data/sequence_example_decoder.py index 6eb76181..cc286c5d 100644 --- a/seq2seq/data/sequence_example_decoder.py +++ b/seq2seq/data/sequence_example_decoder.py @@ -14,7 +14,9 @@ """A decoder for tf.SequenceExample""" import tensorflow as tf +# pylint: disable=no-name-in-module from tensorflow.contrib.slim.python.slim.data import data_decoder +# pylint: enable=no-name-in-module class TFSEquenceExampleDecoder(data_decoder.DataDecoder): diff --git a/seq2seq/data/split_tokens_decoder.py b/seq2seq/data/split_tokens_decoder.py index c6c1efe2..2dd04200 100644 --- a/seq2seq/data/split_tokens_decoder.py +++ b/seq2seq/data/split_tokens_decoder.py @@ -21,7 +21,9 @@ from __future__ import unicode_literals import tensorflow as tf +# pylint: disable=no-name-in-module from tensorflow.contrib.slim.python.slim.data import data_decoder +# pylint: enable=no-name-in-module class SplitTokensDecoder(data_decoder.DataDecoder): diff --git a/seq2seq/encoders/image_encoder.py b/seq2seq/encoders/image_encoder.py index f8dac5d8..b8edebbe 100644 --- a/seq2seq/encoders/image_encoder.py +++ b/seq2seq/encoders/image_encoder.py @@ -20,8 +20,10 @@ from __future__ import print_function import tensorflow as tf +# pylint: disable=no-name-in-module from tensorflow.contrib.slim.python.slim.nets.inception_v3 \ import inception_v3_base +# pylint: enable=no-name-in-module from seq2seq.encoders.encoder import Encoder, EncoderOutput diff --git a/seq2seq/encoders/rnn_encoder.py b/seq2seq/encoders/rnn_encoder.py index d21338df..2cbf4a24 100644 --- a/seq2seq/encoders/rnn_encoder.py +++ b/seq2seq/encoders/rnn_encoder.py @@ -21,7 +21,6 @@ import copy import tensorflow as tf -from tensorflow.contrib.rnn.python.ops import rnn from seq2seq.encoders.encoder import Encoder, EncoderOutput from seq2seq.training import utils as training_utils @@ -186,7 +185,7 @@ def encode(self, inputs, sequence_length, **kwargs): cells_fw = _unpack_cell(cell_fw) cells_bw = _unpack_cell(cell_bw) - result = rnn.stack_bidirectional_dynamic_rnn( + result = tf.contrib.rnn.stack_bidirectional_dynamic_rnn( cells_fw=cells_fw, cells_bw=cells_bw, inputs=inputs, diff --git a/seq2seq/metrics/metric_specs.py b/seq2seq/metrics/metric_specs.py index e4c4ceaa..c6da8709 100644 --- a/seq2seq/metrics/metric_specs.py +++ b/seq2seq/metrics/metric_specs.py @@ -28,7 +28,9 @@ import tensorflow as tf from tensorflow.contrib import metrics +# pylint: disable=no-name-in-module from tensorflow.contrib.learn import MetricSpec +# pylint: enable=no-name-in-module from seq2seq.data import postproc from seq2seq.configurable import Configurable