Улучшения в продвижении типа TensorFlow снижают риски из выявления битов

Улучшения в продвижении типа TensorFlow снижают риски из выявления битов

21 июля 2025 г.

Обзор контента

  • Эффекты включения нового типа продвижения
  • Более последовательный и предсказуемый тип продвижения
  • Снижение риска излучения битов
  • TF.Tensor Mathematic Dunder Методы
  • TF.Variable In-Place Ops
  • tf.constant неявные преобразования
  • TF-Numpay Array
  • Вывод типа ввода
  • Ослабленные API

Ниже приведен неэкгартный список изменений, которые возникают в результате включения нового типа акции.

  • Более последовательные и предсказуемые результаты продвижения по службе.
  • Снижение риска изгибания битов.
  • tf.TensorМетоды математического души используют новый тип продвижения.
  • tf.constantможет вернутьсяWeakTensorАнкет
  • tf.constantдопускает неявные преобразования при вводе тензора с DTYPE, отличным отdtypeАрг передается.
  • tf.Variableна месте OPS (assignВassign-addВassign-sub) разрешить неявные преобразования.
  • tnp.array(1)иtnp.array(1.0)Возвращает 32-битный слабак.
  • WeakTensorS будет создан и используется дляО слабымпенсоре, поддерживающему Unary и Binary APIS.

Более последовательные и предсказуемые результаты продвижения по службе

ИспользованиеСистема на основе решеткиПозволяет повысить новый тип создавать постоянные и предсказуемые результаты продвижения типа.

Продвижение старого типа

Изменение порядка операций дает противоречивые результаты с использованием продвижения старого типа.

# Setup
tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="legacy")
a = np.array(1, dtype=np.int8)
b = tf.constant(1)
c = np.array(1, dtype=np.float16)

# (a + b) + c throws an InvalidArgumentError.
try:
  tf.add(tf.add(a, b), c)
except tf.errors.InvalidArgumentError as e:
  print(f'{type(e)}: {e}')  # InvalidArgumentError

<class 'tensorflow.python.framework.errors_impl.InvalidArgumentError'>: cannot compute AddV2 as input #1(zero-based) was expected to be a int8 tensor but is a int32 tensor [Op:AddV2] name:

# (b + a) + c returns an i32 result.
tf.add(tf.add(b, a), c)  # <tf.Tensor: shape=(), dtype=int32, numpy=3>

<tf.Tensor: shape=(), dtype=int32, numpy=3>

Новый тип продвижения

Новый тип продвижения дает постоянные результаты независимо от порядка.

tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
a = np.array(1, dtype=np.int8)
b = tf.constant(1)
c = np.array(1, dtype=np.float16)

WARNING:tensorflow:UserWarning: enabling the new type promotion must happen at the beginning of the program. Please ensure no TF APIs have been used yet.

# (a + b) + c returns a f16 result.
tf.add(tf.add(a, b), c)  # <tf.Tensor: shape=(), dtype=float16, numpy=3.0>

<tf.Tensor: shape=(), dtype=float16, numpy=3.0>

# (b + a) + c also returns a f16 result.
tf.add(tf.add(b, a), c)  # <tf.Tensor: shape=(), dtype=float16, numpy=3.0>

<tf.Tensor: shape=(), dtype=float16, numpy=3.0>

Снижение риска излучения битов

Продвижение старого типа

Продвижение старого типа часто приводило к 64-битным результатам.

tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="legacy")

np.array(3.2, np.float16) + tf.constant(1, tf.int8) + tf.constant(50)  # <tf.Tensor: shape=(), dtype=float64, numpy=54.19921875>

<tf.Tensor: shape=(), dtype=float64, numpy=54.19921875>

Новый тип продвижения

Новый тип продвижения возвращает результаты с минимальным количеством необходимых битов.

tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")

WARNING:tensorflow:UserWarning: enabling the new type promotion must happen at the beginning of the program. Please ensure no TF APIs have been used yet.

np.array(3.2, np.float16) + tf.constant(1, tf.int8) + tf.constant(50)  # <tf.Tensor: shape=(), dtype=float16, numpy=54.2>

<tf.Tensor: shape=(), dtype=float16, numpy=54.1875>

TF.Tensor Mathematic Dunder Методы

Всеtf.TensorМетоды математического души будут следовать за продвижением нового типа.

-tf.constant(5)  # <tf.Tensor: shape=(), dtype=int32, numpy=-5, weak=True>

<tf.Tensor: shape=(), dtype=int32, numpy=-5, weak=True>

tf.constant(5, tf.int16) - tf.constant(1, tf.float32)  # <tf.Tensor: shape=(), dtype=float32, numpy=4.0>

<tf.Tensor: shape=(), dtype=float32, numpy=4.0>

TF.Variable In-Place Ops

Неявные преобразования будут разрешены вtf.Variableна месте.

Примечание:Любое продвижение, которое приводит к DTYPE, который отличается от исходного DTYPE переменной, будет не разрешено. Это потому, чтоtf.Variableне может изменить свой dtype.

tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
a = tf.Variable(10, tf.int32)
a.assign_add(tf.constant(5, tf.int16))  # <tf.Variable shape=() dtype=int32, numpy=15>

WARNING:tensorflow:UserWarning: enabling the new type promotion must happen at the beginning of the program. Please ensure no TF APIs have been used yet.
<tf.Variable 'UnreadVariable' shape=() dtype=int32, numpy=15>

tf.constant неявные преобразования

В продвижении старого типа,tf.constantТребуется входной тензор, чтобы иметь тот же DTYPE, что и аргумент DTYPE. Тем не менее, в продвижении нового типа мы неявно преобразуем тензор в указанный DTYPE.

tnp.experimental_enable_numpy_behavior(dtype_conversion_mode="all")
a = tf.constant(10, tf.int16)
tf.constant(a, tf.float32)  # <tf.Tensor: shape=(), dtype=float32, numpy=10.0>

WARNING:tensorflow:UserWarning: enabling the new type promotion must happen at the beginning of the program. Please ensure no TF APIs have been used yet.
<tf.Tensor: shape=(), dtype=float32, numpy=10.0>

TF-Numpy Array

tnp.arrayпо умолчаниюi32*иf32*Для входов Python с использованием нового типа акции.

tnp.array(1)  # <tf.Tensor: shape=(), dtype=int32, numpy=1, weak=True>

<tf.Tensor: shape=(), dtype=int32, numpy=1, weak=True>

tnp.array(1.0)  # <tf.Tensor: shape=(), dtype=int32, numpy=1, weak=True>

<tf.Tensor: shape=(), dtype=float32, numpy=1.0, weak=True>

Вывод типа ввода

Вот как выводятся типы различных вводов в новом типах.

  • tf.Tensor: Сtf.TensorИмеет свойство Dtype, мы не делаем дальнейшего вывода.
  • Типы Numpy: это включает в себя такие типы, какnp.array(1)Вnp.int16(1), иnp.floatАнкет Поскольку входные данные Numpy также имеют свойство DTYPE, мы принимаем свойство DTYPE в качестве типа вывода результатов. Обратите внимание, что Numpy по умолчаниюi64иf64Анкет
  • Python Scalars/Вложенные типы: это включает в себя такие типы, как1В[1, 2, 3], и(1.0, 2.0)Анкет
    • Питонintвыведен какi32*Анкет
    • Питонfloatвыведен какf32*Анкет
    • Питонcomplexвыведен какc128*Анкет
  • Если ввод не попадает ни в одну из вышеуказанных категорий, но имеет свойство DTYPE, мы принимаем свойство DTYPE в качестве типа вывода результатов.

Дальнейшее чтение

Новый тип акции напоминает акцию Jax-Numpy's Type. Если вы хотите узнать более подробную информацию о продвижении нового типа и выборе дизайна, ознакомьтесь с ресурсами ниже.

  • Jax Type Semantics Semantics
  • Дизайн семантики продвижения типа для JAX
  • Старая семантика продвижения TF-Numpy

Ослабленные API

Ниже приведен список API, которые поддерживаютWeakTensorАнкет

Для Unary OP это означает, что если ввод без указанного пользователя тип будет передаваться, он вернетWeakTensorАнкет

Для бинарного OP он будет следовать за таблицей продвиженияздесьАнкет Он может или не может вернутьWeakTensorВ зависимости от результата продвижения двух входов.

Примечание:Все математические операции (+В-В*, ...) поддерживаются.

  • tf.bitwise.invert
  • tf.clip_by_value
  • tf.debugging.check_numerics
  • tf.expand_dims
  • tf.identity
  • tf.image.adjust_brightness
  • tf.image.adjust_gamma
  • tf.image.extract_patches
  • tf.image.random_brightness
  • tf.image.stateless_random_brightness
  • tf.linalg.diag
  • tf.linalg.diag_part
  • tf.linalg.matmul
  • tf.linalg.matrix_transpose
  • tf.linalg.tensor_diag_part
  • tf.linalg.trace
  • tf.math.abs
  • tf.math.acos
  • tf.math.acosh
  • tf.math.add
  • tf.math.angle
  • tf.math.asin
  • tf.math.asinh
  • tf.math.atan
  • tf.math.atanh
  • tf.math.ceil
  • tf.math.conj
  • tf.math.cos
  • tf.math.cosh
  • tf.math.digamma
  • tf.math.divide_no_nan
  • tf.math.divide
  • tf.math.erf
  • tf.math.erfc
  • tf.math.erfcinv
  • tf.math.erfinv
  • tf.math.exp
  • tf.math.expm1
  • tf.math.floor
  • tf.math.floordiv
  • tf.math.floormod
  • tf.math.imag
  • tf.math.lgamma
  • tf.math.log1p
  • tf.math.log_sigmoid
  • tf.math.log
  • tf.math.multiply_no_nan
  • tf.math.multiply
  • tf.math.ndtri
  • tf.math.negative
  • tf.math.pow
  • tf.math.real
  • tf.math.real
  • tf.math.reciprocal_no_nan
  • tf.math.reciprocal
  • tf.math.reduce_euclidean_norm
  • tf.math.reduce_logsumexp
  • tf.math.reduce_max
  • tf.math.reduce_mean
  • tf.math.reduce_min
  • tf.math.reduce_prod
  • tf.math.reduce_std
  • tf.math.reduce_sum
  • tf.math.reduce_variance
  • tf.math.rint
  • tf.math.round
  • tf.math.rsqrt
  • tf.math.scalar_mul
  • tf.math.sigmoid
  • tf.math.sign
  • tf.math.sin
  • tf.math.sinh
  • tf.math.softplus
  • tf.math.special.bessel_i0
  • tf.math.special.bessel_i0e
  • tf.math.special.bessel_i1
  • tf.math.special.bessel_i1e
  • tf.math.special.bessel_j0
  • tf.math.special.bessel_j1
  • tf.math.special.bessel_k0
  • tf.math.special.bessel_k0e
  • tf.math.special.bessel_k1
  • tf.math.special.bessel_k1e
  • tf.math.special.bessel_y0
  • tf.math.special.bessel_y1
  • tf.math.special.dawsn
  • tf.math.special.expint
  • tf.math.special.fresnel_cos
  • tf.math.special.fresnel_sin
  • tf.math.special.spence
  • tf.math.sqrt
  • tf.math.square
  • tf.math.subtract
  • tf.math.tan
  • tf.math.tanh
  • tf.nn.depth_to_space
  • tf.nn.elu
  • tf.nn.gelu
  • tf.nn.leaky_relu
  • tf.nn.log_softmax
  • tf.nn.relu6
  • tf.nn.relu
  • tf.nn.selu
  • tf.nn.softsign
  • tf.nn.space_to_depth
  • tf.nn.swish
  • tf.ones_like
  • tf.realdiv
  • tf.reshape
  • tf.squeeze
  • tf.stop_gradient
  • tf.transpose
  • tf.truncatediv
  • tf.truncatemod
  • tf.zeros_like
  • tf.experimental.numpy.abs
  • tf.experimental.numpy.absolute
  • tf.experimental.numpy.amax
  • tf.experimental.numpy.amin
  • tf.experimental.numpy.angle
  • tf.experimental.numpy.arange
  • tf.experimental.numpy.arccos
  • tf.experimental.numpy.arccosh
  • tf.experimental.numpy.arcsin
  • tf.experimental.numpy.arcsinh
  • tf.experimental.numpy.arctan
  • tf.experimental.numpy.arctanh
  • tf.experimental.numpy.around
  • tf.experimental.numpy.array
  • tf.experimental.numpy.asanyarray
  • tf.experimental.numpy.asarray
  • tf.experimental.numpy.ascontiguousarray
  • tf.experimental.numpy.average
  • tf.experimental.numpy.bitwise_not
  • tf.experimental.numpy.cbrt
  • tf.experimental.numpy.ceil
  • tf.experimental.numpy.conj
  • tf.experimental.numpy.conjugate
  • tf.experimental.numpy.copy
  • tf.experimental.numpy.cos
  • tf.experimental.numpy.cosh
  • tf.experimental.numpy.cumprod
  • tf.experimental.numpy.cumsum
  • tf.experimental.numpy.deg2rad
  • tf.experimental.numpy.diag
  • tf.experimental.numpy.diagflat
  • tf.experimental.numpy.diagonal
  • tf.experimental.numpy.diff
  • tf.experimental.numpy.empty_like
  • tf.experimental.numpy.exp2
  • tf.experimental.numpy.exp
  • tf.experimental.numpy.expand_dims
  • tf.experimental.numpy.expm1
  • tf.experimental.numpy.fabs
  • tf.experimental.numpy.fix
  • tf.experimental.numpy.flatten
  • tf.experimental.numpy.flip
  • tf.experimental.numpy.fliplr
  • tf.experimental.numpy.flipud
  • tf.experimental.numpy.floor
  • tf.experimental.numpy.full_like
  • tf.experimental.numpy.imag
  • tf.experimental.numpy.log10
  • tf.experimental.numpy.log1p
  • tf.experimental.numpy.log2
  • tf.experimental.numpy.log
  • tf.experimental.numpy.max
  • tf.experimental.numpy.mean
  • tf.experimental.numpy.min
  • tf.experimental.numpy.moveaxis
  • tf.experimental.numpy.nanmean
  • tf.experimental.numpy.negative
  • tf.experimental.numpy.ones_like
  • tf.experimental.numpy.positive
  • tf.experimental.numpy.prod
  • tf.experimental.numpy.rad2deg
  • tf.experimental.numpy.ravel
  • tf.experimental.numpy.real
  • tf.experimental.numpy.reciprocal
  • tf.experimental.numpy.repeat
  • tf.experimental.numpy.reshape
  • tf.experimental.numpy.rot90
  • tf.experimental.numpy.round
  • tf.experimental.numpy.signbit
  • tf.experimental.numpy.sin
  • tf.experimental.numpy.sinc
  • tf.experimental.numpy.sinh
  • tf.experimental.numpy.sort
  • tf.experimental.numpy.sqrt
  • tf.experimental.numpy.square
  • tf.experimental.numpy.squeeze
  • tf.experimental.numpy.std
  • tf.experimental.numpy.sum
  • tf.experimental.numpy.swapaxes
  • tf.experimental.numpy.tan
  • tf.experimental.numpy.tanh
  • tf.experimental.numpy.trace
  • tf.experimental.numpy.transpose
  • tf.experimental.numpy.triu
  • tf.experimental.numpy.vander
  • tf.experimental.numpy.var
  • tf.experimental.numpy.zeros_like

Первоначально опубликовано наTensorflowВеб -сайт, эта статья появляется здесь под новым заголовком и имеет лицензию в CC на 4.0. Образцы кода, разделенные по лицензии Apache 2.0.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE