diff options
author | Allen Lavoie <allenl@google.com> | 2018-07-19 18:12:34 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-07-19 18:15:18 -0700 |
commit | 77c7b1112210beb3f0752f206bfa519f22aaf5c6 (patch) | |
tree | 2b0045f23a0a5acbde59fb14d6bee191b5820c68 | |
parent | 90ec1ab915907ae94ac1d212611b460a68d8c98f (diff) |
Fix AdamOptimizer usage in a defun
Adds init_scope around Adam's non-slot variable lookup so it's always accessed in a consistent context.
PiperOrigin-RevId: 205335191
-rw-r--r-- | tensorflow/python/eager/function_test.py | 18 | ||||
-rw-r--r-- | tensorflow/python/training/adam.py | 13 | ||||
-rw-r--r-- | tensorflow/python/training/adam_test.py | 6 |
3 files changed, 31 insertions, 6 deletions
diff --git a/tensorflow/python/eager/function_test.py b/tensorflow/python/eager/function_test.py index cdd9fe1760..e6592b2e37 100644 --- a/tensorflow/python/eager/function_test.py +++ b/tensorflow/python/eager/function_test.py @@ -45,6 +45,7 @@ from tensorflow.python.ops import resource_variable_ops from tensorflow.python.ops import variable_scope from tensorflow.python.ops import variables from tensorflow.python.platform import test +from tensorflow.python.training import adam from tensorflow.python.training import momentum from tensorflow.python.training import training_ops from tensorflow.python.util import compat @@ -1166,6 +1167,23 @@ class AutomaticControlDependenciesTest(test.TestCase): value = train() self.assertEqual(value.numpy(), -1.0) + # TODO(b/111663004): This should work when the outer context is graph + # building. + def testOptimizerNonSlotVarsInDefunNoError(self): + def loss(v): + return v**2 + + optimizer = adam.AdamOptimizer(learning_rate=1.0) + + @function.defun + def train(): + v = resource_variable_ops.ResourceVariable(1.0) + grad = backprop.implicit_grad(loss)(v) + optimizer.apply_gradients(grad) + return v.read_value() + + train() + def testOptimizerInDefunWithCapturedVariable(self): v = resource_variable_ops.ResourceVariable(1.0) def loss(): diff --git a/tensorflow/python/training/adam.py b/tensorflow/python/training/adam.py index b65c88e972..bcbe5907d6 100644 --- a/tensorflow/python/training/adam.py +++ b/tensorflow/python/training/adam.py @@ -109,12 +109,13 @@ class AdamOptimizer(optimizer.Optimizer): self._updated_lr = None def _get_beta_accumulators(self): - if context.executing_eagerly(): - graph = None - else: - graph = ops.get_default_graph() - return (self._get_non_slot_variable("beta1_power", graph=graph), - self._get_non_slot_variable("beta2_power", graph=graph)) + with ops.init_scope(): + if context.executing_eagerly(): + graph = None + else: + graph = ops.get_default_graph() + return (self._get_non_slot_variable("beta1_power", graph=graph), + self._get_non_slot_variable("beta2_power", graph=graph)) def _create_slots(self, var_list): # Create the beta1 and beta2 accumulators on the same device as the first diff --git a/tensorflow/python/training/adam_test.py b/tensorflow/python/training/adam_test.py index ccdc7e384d..8f84427654 100644 --- a/tensorflow/python/training/adam_test.py +++ b/tensorflow/python/training/adam_test.py @@ -315,6 +315,12 @@ class AdamOptimizerTest(test.TestCase): def testTwoSessions(self): optimizer = adam.AdamOptimizer() + + with context.eager_mode(): + var0 = variables.Variable(np.array([1.0, 2.0]), name="v0") + grads0 = constant_op.constant(np.array([0.1, 0.1])) + optimizer.apply_gradients([(grads0, var0)]) + g = ops.Graph() with g.as_default(): with session.Session(): |