[tf.data] Fix an issue where tf.data.DatasetSpec
could not be specified in input_signature
of tf.function.
Fixes: https://github.com/tensorflow/tensorflow/issues/38733 PiperOrigin-RevId: 307733846 Change-Id: I28b7a4372fc585f8894df9928e3e56844429e260
This commit is contained in:
parent
47ea7eeb96
commit
c1dbd16822
@ -117,6 +117,21 @@ tf_py_test(
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tf_py_test(
|
||||||
|
name = "dataset_spec_test",
|
||||||
|
size = "small",
|
||||||
|
srcs = ["dataset_spec_test.py"],
|
||||||
|
deps = [
|
||||||
|
":test_base",
|
||||||
|
"//tensorflow/python:client_testlib",
|
||||||
|
"//tensorflow/python:dtypes",
|
||||||
|
"//tensorflow/python:errors",
|
||||||
|
"//tensorflow/python/data/ops:dataset_ops",
|
||||||
|
"//third_party/py/numpy",
|
||||||
|
"@absl_py//absl/testing:parameterized",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
tf_py_test(
|
tf_py_test(
|
||||||
name = "enumerate_test",
|
name = "enumerate_test",
|
||||||
size = "small",
|
size = "small",
|
||||||
|
54
tensorflow/python/data/kernel_tests/dataset_spec_test.py
Normal file
54
tensorflow/python/data/kernel_tests/dataset_spec_test.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
# ==============================================================================
|
||||||
|
"""Tests for `tf.data.DatasetSpec`."""
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
from absl.testing import parameterized
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from tensorflow.python.data.kernel_tests import test_base
|
||||||
|
from tensorflow.python.data.ops import dataset_ops
|
||||||
|
from tensorflow.python.eager import def_function
|
||||||
|
from tensorflow.python.framework import combinations
|
||||||
|
from tensorflow.python.framework import dtypes
|
||||||
|
from tensorflow.python.framework import tensor_shape
|
||||||
|
from tensorflow.python.framework import tensor_spec
|
||||||
|
from tensorflow.python.platform import test
|
||||||
|
|
||||||
|
|
||||||
|
class DatasetSpecTest(test_base.DatasetTestBase, parameterized.TestCase):
|
||||||
|
|
||||||
|
@combinations.generate(test_base.default_test_combinations())
|
||||||
|
def testInputSignature(self):
|
||||||
|
dataset = dataset_ops.Dataset.from_tensor_slices(
|
||||||
|
np.arange(10).astype(np.int32)).batch(5)
|
||||||
|
|
||||||
|
@def_function.function(input_signature=[
|
||||||
|
dataset_ops.DatasetSpec(
|
||||||
|
tensor_spec.TensorSpec(
|
||||||
|
shape=(None,), dtype=dtypes.int32, name=None),
|
||||||
|
tensor_shape.TensorShape([]))
|
||||||
|
])
|
||||||
|
def fn(_):
|
||||||
|
pass
|
||||||
|
|
||||||
|
fn(dataset)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test.main()
|
@ -3050,7 +3050,7 @@ class DatasetSpec(type_spec.BatchableTypeSpec):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def value_type(self):
|
def value_type(self):
|
||||||
return _VariantDataset
|
return Dataset
|
||||||
|
|
||||||
def _serialize(self):
|
def _serialize(self):
|
||||||
return (self._element_spec, self._dataset_shape)
|
return (self._element_spec, self._dataset_shape)
|
||||||
|
@ -83,7 +83,11 @@ class TypeSpec(object):
|
|||||||
|
|
||||||
@abc.abstractproperty
|
@abc.abstractproperty
|
||||||
def value_type(self):
|
def value_type(self):
|
||||||
"""The Python type for values that are compatible with this TypeSpec."""
|
"""The Python type for values that are compatible with this TypeSpec.
|
||||||
|
|
||||||
|
In particular, all values that are compatible with this TypeSpec must be an
|
||||||
|
instance of this type.
|
||||||
|
"""
|
||||||
raise NotImplementedError("%s.value_type" % type(self).__name__)
|
raise NotImplementedError("%s.value_type" % type(self).__name__)
|
||||||
|
|
||||||
def is_compatible_with(self, spec_or_value):
|
def is_compatible_with(self, spec_or_value):
|
||||||
|
@ -231,7 +231,7 @@ def _yield_sorted_items(iterable):
|
|||||||
yield field, getattr(iterable, field)
|
yield field, getattr(iterable, field)
|
||||||
elif _is_composite_tensor(iterable):
|
elif _is_composite_tensor(iterable):
|
||||||
type_spec = iterable._type_spec # pylint: disable=protected-access
|
type_spec = iterable._type_spec # pylint: disable=protected-access
|
||||||
yield type(iterable).__name__, type_spec._to_components(iterable) # pylint: disable=protected-access
|
yield type_spec.value_type.__name__, type_spec._to_components(iterable) # pylint: disable=protected-access
|
||||||
elif _is_type_spec(iterable):
|
elif _is_type_spec(iterable):
|
||||||
# Note: to allow CompositeTensors and their TypeSpecs to have matching
|
# Note: to allow CompositeTensors and their TypeSpecs to have matching
|
||||||
# structures, we need to use the same key string here.
|
# structures, we need to use the same key string here.
|
||||||
|
Loading…
Reference in New Issue
Block a user