From 201b2e6bfae52725514b8be0677ac4a3104b8707 Mon Sep 17 00:00:00 2001 From: Alexandre Passos Date: Fri, 17 Aug 2018 14:33:54 -0700 Subject: Enable variable[indices].assign(...) in eager (to match existing graph semantics) PiperOrigin-RevId: 209208304 --- tensorflow/python/eager/pywrap_tensor.cc | 3 --- tensorflow/python/kernel_tests/resource_variable_ops_test.py | 7 +++++++ tensorflow/python/ops/array_ops.py | 5 +---- tensorflow/python/ops/nn_grad.py | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) (limited to 'tensorflow/python') diff --git a/tensorflow/python/eager/pywrap_tensor.cc b/tensorflow/python/eager/pywrap_tensor.cc index 15d2ccf9d2..c12bf89f8f 100644 --- a/tensorflow/python/eager/pywrap_tensor.cc +++ b/tensorflow/python/eager/pywrap_tensor.cc @@ -800,9 +800,6 @@ PyObject* TFE_Py_InitEagerTensor(PyObject* base_class) { EagerTensorType = &_EagerTensorType; Py_INCREF(EagerTensorType); #endif - // We disable instance based attribute lookup. Its not clear if these - // dictionaries are correctly initialized in the first place. - EagerTensorType->tp_dictoffset = 0; return reinterpret_cast(EagerTensorType); } diff --git a/tensorflow/python/kernel_tests/resource_variable_ops_test.py b/tensorflow/python/kernel_tests/resource_variable_ops_test.py index b1ef46f2a1..f815348b2a 100644 --- a/tensorflow/python/kernel_tests/resource_variable_ops_test.py +++ b/tensorflow/python/kernel_tests/resource_variable_ops_test.py @@ -106,6 +106,13 @@ class ResourceVariableOpsTest(test_util.TensorFlowTestCase): v = resource_variable_ops.ResourceVariable(False, name="bool_test") self.assertAllEqual(bool(v), False) + @test_util.run_in_graph_and_eager_modes + def testStridedSliceAssign(self): + v = resource_variable_ops.ResourceVariable([1.0, 2.0]) + self.evaluate(variables.global_variables_initializer()) + self.evaluate(v[0].assign(2.0)) + self.assertAllEqual(self.evaluate(v), [2.0, 2.0]) + def testDifferentAssignGraph(self): with ops.Graph().as_default(): v = resource_variable_ops.ResourceVariable(1.0) diff --git a/tensorflow/python/ops/array_ops.py b/tensorflow/python/ops/array_ops.py index 1e23fff4e3..66bc4df18c 100644 --- a/tensorflow/python/ops/array_ops.py +++ b/tensorflow/python/ops/array_ops.py @@ -712,10 +712,7 @@ def strided_slice(input_, new_axis_mask=new_axis_mask, shrink_axis_mask=shrink_axis_mask) - if not context.executing_eagerly(): - # TODO(apassos) In eager mode assignment will be done by overriding - # __setitem__ instead. - op.assign = assign + op.assign = assign return op diff --git a/tensorflow/python/ops/nn_grad.py b/tensorflow/python/ops/nn_grad.py index df23ac55ce..a648653909 100644 --- a/tensorflow/python/ops/nn_grad.py +++ b/tensorflow/python/ops/nn_grad.py @@ -471,7 +471,9 @@ def _SoftmaxCrossEntropyWithLogitsGrad(op, grad_loss, grad_grad): softmax = nn_ops.softmax(logits) grad += ((grad_grad - array_ops.squeeze( - math_ops.matmul(grad_grad[:, None, :], softmax[:, :, None]), axis=1)) * + math_ops.matmul(array_ops.expand_dims(grad_grad, 1), + array_ops.expand_dims(softmax, 2)), + axis=1)) * softmax) return grad, _BroadcastMul(grad_loss, -nn_ops.log_softmax(logits)) -- cgit v1.2.3