Add tf.quantize op, which is the same as tf.quantize_v2.

PiperOrigin-RevId: 173735986
This commit is contained in:
A. Unique TensorFlower
2017-10-27 17:03:46 -07:00
committed by TensorFlower Gardener
parent 3ff9c8d2af
commit d1c59bd375
4 changed files with 38 additions and 9 deletions

View File

@@ -250,5 +250,4 @@ REGISTER_KERNEL_BUILDER(
REGISTER_KERNEL_BUILDER(
Name("QuantizeV2").Device(DEVICE_CPU).TypeConstraint<qint32>("T"),
QuantizeV2Op<CPUDevice, qint32>);
} // namespace tensorflow

View File

@@ -4902,10 +4902,10 @@ with the range of qint8.
If the mode is 'MIN_FIRST', then this approach is used:
```
number_of_steps = 1 << (# of bits in T)
range_adjust = number_of_steps / (number_of_steps - 1)
num_discrete_values = 1 << (# of bits in T)
range_adjust = num_discrete_values / (num_discrete_values - 1)
range = (range_max - range_min) * range_adjust
range_scale = number_of_steps / range
range_scale = num_discrete_values / range
quantized = round(input * range_scale) - round(range_min * range_scale) +
numeric_limits<T>::min()
quantized = max(quantized, numeric_limits<T>::min())
@@ -5017,10 +5017,10 @@ each value by 128 prior to casting.
If the mode is 'MIN_FIRST', then this approach is used:
```c++
number_of_steps = 1 << (# of bits in T)
range_adjust = number_of_steps / (number_of_steps - 1)
num_discrete_values = 1 << (# of bits in T)
range_adjust = num_discrete_values / (num_discrete_values - 1)
range = (range_max - range_min) * range_adjust
range_scale = range / number_of_steps
range_scale = range / num_discrete_values
const double offset_input = static_cast<double>(input) - lowest_quantized;
result = range_min + ((input - numeric_limits<T>::min()) * range_scale)
```

View File

@@ -66,6 +66,7 @@ See the @{$python/array_ops} guide.
@@one_hot
@@sequence_mask
@@dequantize
@@quantize
@@quantize_v2
@@quantized_concat
@@setdiff1d
@@ -2525,7 +2526,10 @@ gather.__doc__ = gen_array_ops.gather_v2.__doc__
# Define quantize_v2 here in order to make name the second-to-last attribute,
# because round_mode was added later.
def quantize_v2(input,
@deprecation.deprecated(
"2017-10-25",
"`tf.quantize_v2` is deprecated, please use `tf.quantize` instead.")
def quantize_v2(input, # pylint: disable=redefined-builtin
min_range,
max_range,
T,
@@ -2541,4 +2545,26 @@ def quantize_v2(input,
round_mode=round_mode)
quantize_v2.__doc__ = gen_array_ops.quantize_v2.__doc__
quantize_v2.__doc__ = """Please use `tf.quantize` instead."""
# We want to expose tf.quantize instead of tf.quantize_v2; we can deprecate
# tf.quantize_v2 in next version of TensorFlow.
def quantize(input, # pylint: disable=redefined-builtin
min_range,
max_range,
T,
mode="MIN_COMBINED",
round_mode="HALF_AWAY_FROM_ZERO",
name=None):
return gen_array_ops.quantize_v2(
input,
min_range,
max_range,
T,
mode=mode,
round_mode=round_mode,
name=name)
quantize.__doc__ = gen_array_ops.quantize_v2.__doc__

View File

@@ -1480,6 +1480,10 @@ tf_module {
name: "qr"
argspec: "args=[\'input\', \'full_matrices\', \'name\'], varargs=None, keywords=None, defaults=[\'False\', \'None\'], "
}
member_method {
name: "quantize"
argspec: "args=[\'input\', \'min_range\', \'max_range\', \'T\', \'mode\', \'round_mode\', \'name\'], varargs=None, keywords=None, defaults=[\'MIN_COMBINED\', \'HALF_AWAY_FROM_ZERO\', \'None\'], "
}
member_method {
name: "quantize_v2"
argspec: "args=[\'input\', \'min_range\', \'max_range\', \'T\', \'mode\', \'name\', \'round_mode\'], varargs=None, keywords=None, defaults=[\'MIN_COMBINED\', \'None\', \'HALF_AWAY_FROM_ZERO\'], "