Final breaking change, removing .shape from SparseTensor.
Change: 142071642
This commit is contained in:
parent
786a736b3e
commit
a7cd5f671e
@ -110,6 +110,8 @@
|
|||||||
include `RNN` -> `rnn` in `tf.nn.rnn`, `tf.nn.dynamic_rnn` and moving from
|
include `RNN` -> `rnn` in `tf.nn.rnn`, `tf.nn.dynamic_rnn` and moving from
|
||||||
`Linear/Matrix` -> `weights` and `Linear/Bias` -> `biases` in most RNN cells.
|
`Linear/Matrix` -> `weights` and `Linear/Bias` -> `biases` in most RNN cells.
|
||||||
* Deprecated tf.select op. tf.where should be used instead.
|
* Deprecated tf.select op. tf.where should be used instead.
|
||||||
|
* `SparseTensor.shape` has been renamed to `SparseTensor.dense_shape`. Same for
|
||||||
|
`SparseTensorValue.shape`.
|
||||||
* `Env::FileExists` and `FileSystem::FileExists` now return a
|
* `Env::FileExists` and `FileSystem::FileExists` now return a
|
||||||
`tensorflow::Status` intead of a bool. Any callers to this function can be
|
`tensorflow::Status` intead of a bool. Any callers to this function can be
|
||||||
converted to a bool by adding `.ok()` to the call.
|
converted to a bool by adding `.ok()` to the call.
|
||||||
|
@ -18,7 +18,7 @@ from __future__ import absolute_import
|
|||||||
from __future__ import division
|
from __future__ import division
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import six
|
import collections
|
||||||
|
|
||||||
from tensorflow.python.framework import dtypes
|
from tensorflow.python.framework import dtypes
|
||||||
from tensorflow.python.framework import ops
|
from tensorflow.python.framework import ops
|
||||||
@ -28,7 +28,6 @@ from tensorflow.python.framework import tensor_util
|
|||||||
_TensorLike = ops._TensorLike
|
_TensorLike = ops._TensorLike
|
||||||
_eval_using_default_session = ops._eval_using_default_session
|
_eval_using_default_session = ops._eval_using_default_session
|
||||||
_override_helper = ops._override_helper
|
_override_helper = ops._override_helper
|
||||||
|
|
||||||
# pylint: enable=protected-access
|
# pylint: enable=protected-access
|
||||||
|
|
||||||
|
|
||||||
@ -58,14 +57,11 @@ class SparseTensor(_TensorLike):
|
|||||||
[2,4] of the tensor has a value of 3.6.
|
[2,4] of the tensor has a value of 3.6.
|
||||||
|
|
||||||
* `dense_shape`: A 1-D int64 tensor of dense_shape `[ndims]`, which specifies
|
* `dense_shape`: A 1-D int64 tensor of dense_shape `[ndims]`, which specifies
|
||||||
the
|
the dense_shape of the sparse tensor. Takes a list indicating the number of
|
||||||
dense_shape of the sparse tensor. Takes a list indicating the number of
|
elements in each dimension. For example, `dense_shape=[3,6]` specifies a
|
||||||
elements
|
two-dimensional 3x6 tensor, `dense_shape=[2,3,4]` specifies a
|
||||||
in each dimension. For example, `dense_shape=[3,6]` specifies a
|
three-dimensional 2x3x4 tensor, and `dense_shape=[9]` specifies a
|
||||||
two-dimensional
|
one-dimensional tensor with 9 elements.
|
||||||
3x6 tensor, `dense_shape=[2,3,4]` specifies a three-dimensional 2x3x4
|
|
||||||
tensor, and
|
|
||||||
`dense_shape=[9]` specifies a one-dimensional tensor with 9 elements.
|
|
||||||
|
|
||||||
The corresponding dense tensor satisfies:
|
The corresponding dense tensor satisfies:
|
||||||
|
|
||||||
@ -115,24 +111,19 @@ class SparseTensor(_TensorLike):
|
|||||||
values=sparse_tensor_value.values,
|
values=sparse_tensor_value.values,
|
||||||
dense_shape=sparse_tensor_value.dense_shape)
|
dense_shape=sparse_tensor_value.dense_shape)
|
||||||
|
|
||||||
def __init__(self, indices, values, dense_shape=None, shape=None):
|
def __init__(self, indices, values, dense_shape):
|
||||||
"""Creates a `SparseTensor`.
|
"""Creates a `SparseTensor`.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
indices: A 2-D int64 tensor of dense_shape `[N, ndims]`.
|
indices: A 2-D int64 tensor of shape `[N, ndims]`.
|
||||||
values: A 1-D tensor of any type and dense_shape `[N]`.
|
values: A 1-D tensor of any type and shape `[N]`.
|
||||||
dense_shape: A 1-D int64 tensor of dense_shape `[ndims]`.
|
dense_shape: A 1-D int64 tensor of shape `[ndims]`.
|
||||||
shape: Temporary. Legacy naming of dense_shape. Only one of `shape` or
|
|
||||||
`dense_shape` must be provided.
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A `SparseTensor`.
|
A `SparseTensor`.
|
||||||
|
|
||||||
Raises:
|
|
||||||
ValueError: if both `shape` and `dense_shape` are provided.
|
|
||||||
"""
|
"""
|
||||||
with ops.name_scope(None, "SparseTensor",
|
with ops.name_scope(None, "SparseTensor",
|
||||||
[indices, values, shape, dense_shape]):
|
[indices, values, dense_shape]):
|
||||||
indices = ops.convert_to_tensor(
|
indices = ops.convert_to_tensor(
|
||||||
indices, name="indices", dtype=dtypes.int64)
|
indices, name="indices", dtype=dtypes.int64)
|
||||||
# Always pass as_ref=True because we want to be able to update
|
# Always pass as_ref=True because we want to be able to update
|
||||||
@ -141,10 +132,6 @@ class SparseTensor(_TensorLike):
|
|||||||
# is a VariableOp and updating users of SparseTensor.
|
# is a VariableOp and updating users of SparseTensor.
|
||||||
values = ops.internal_convert_to_tensor(
|
values = ops.internal_convert_to_tensor(
|
||||||
values, name="values", as_ref=True)
|
values, name="values", as_ref=True)
|
||||||
if shape is not None and dense_shape is not None:
|
|
||||||
raise ValueError("Only one of shape or dense_shape must be provided, "
|
|
||||||
"but saw %s and %s" % (shape, dense_shape))
|
|
||||||
dense_shape = shape if shape is not None else dense_shape
|
|
||||||
dense_shape = ops.convert_to_tensor(
|
dense_shape = ops.convert_to_tensor(
|
||||||
dense_shape, name="dense_shape", dtype=dtypes.int64)
|
dense_shape, name="dense_shape", dtype=dtypes.int64)
|
||||||
self._indices = indices
|
self._indices = indices
|
||||||
@ -203,11 +190,6 @@ class SparseTensor(_TensorLike):
|
|||||||
"""A 1-D Tensor of int64 representing the shape of the dense tensor."""
|
"""A 1-D Tensor of int64 representing the shape of the dense tensor."""
|
||||||
return self._dense_shape
|
return self._dense_shape
|
||||||
|
|
||||||
@property
|
|
||||||
def shape(self):
|
|
||||||
"""Legacy property returning `dense_shape`."""
|
|
||||||
return self._dense_shape
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def graph(self):
|
def graph(self):
|
||||||
"""The `Graph` that contains the index, value, and dense_shape tensors."""
|
"""The `Graph` that contains the index, value, and dense_shape tensors."""
|
||||||
@ -248,64 +230,8 @@ class SparseTensor(_TensorLike):
|
|||||||
_override_helper(SparseTensor, operator, func)
|
_override_helper(SparseTensor, operator, func)
|
||||||
|
|
||||||
|
|
||||||
class _STVIter(six.Iterator):
|
SparseTensorValue = collections.namedtuple(
|
||||||
"""Iterator for the SparseTensorValue."""
|
"SparseTensorValue", ["indices", "values", "dense_shape"])
|
||||||
|
|
||||||
def __init__(self, st):
|
|
||||||
self._st = st
|
|
||||||
self._ix = -1
|
|
||||||
|
|
||||||
def __iter__(self): # pylint: disable=non-iterator-returned
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
self._ix += 1
|
|
||||||
if self._ix == 0:
|
|
||||||
return self._st.indices
|
|
||||||
elif self._ix == 1:
|
|
||||||
return self._st.values
|
|
||||||
elif self._ix == 2:
|
|
||||||
return self._st.dense_shape
|
|
||||||
else:
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
|
|
||||||
class SparseTensorValue(object):
|
|
||||||
"""Stores the calculated numpy arrays representing a `SparseTensor`.
|
|
||||||
|
|
||||||
Returned as the output of a session.run on a `SparseTensor` object.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, indices, values, dense_shape=None, shape=None):
|
|
||||||
self._indices = indices
|
|
||||||
self._values = values
|
|
||||||
self._dense_shape = shape or dense_shape
|
|
||||||
|
|
||||||
@property
|
|
||||||
def indices(self):
|
|
||||||
return self._indices
|
|
||||||
|
|
||||||
@property
|
|
||||||
def values(self):
|
|
||||||
return self._values
|
|
||||||
|
|
||||||
@property
|
|
||||||
def dense_shape(self):
|
|
||||||
return self._dense_shape
|
|
||||||
|
|
||||||
@property
|
|
||||||
def shape(self):
|
|
||||||
return self._dense_shape
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "SparseTensorValue(indices=%s, values=%s, dense_shape=%s)" % (
|
|
||||||
self._indices, self._values, self._dense_shape)
|
|
||||||
|
|
||||||
def __iter__(self): # pylint: disable=non-iterator-returned
|
|
||||||
return _STVIter(self)
|
|
||||||
|
|
||||||
def __getitem__(self, i):
|
|
||||||
return [self.indices, self.values, self.dense_shape][i]
|
|
||||||
|
|
||||||
|
|
||||||
def convert_to_tensor_or_sparse_tensor(value, dtype=None, name=None):
|
def convert_to_tensor_or_sparse_tensor(value, dtype=None, name=None):
|
||||||
|
Loading…
Reference in New Issue
Block a user