aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Allen Lavoie <allenl@google.com>2018-07-19 18:12:34 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-07-19 18:15:18 -0700
commit77c7b1112210beb3f0752f206bfa519f22aaf5c6 (patch)
tree2b0045f23a0a5acbde59fb14d6bee191b5820c68
parent90ec1ab915907ae94ac1d212611b460a68d8c98f (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.py18
-rw-r--r--tensorflow/python/training/adam.py13
-rw-r--r--tensorflow/python/training/adam_test.py6
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():