tf.image.convert_image_dtype
Преобразует image в dtype, при необходимости масштабируя значения.
tf.image.convert_image_dtype(
image, dtype, saturate=False, name=None
)
Используется в блокнотах
| Используется в руководстве | Используется в обучающих материалах |
|---|---|
Операция поддерживает типы данных (для image и dtype): uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64, bfloat16.
Предполагается, что изображения, представленные значениями с плавающей запятой, имеют значения в диапазоне [0,1). Для данных изображений, хранящихся в целочисленных типах данных, предполагается диапазон значений [0,MAX], где MAX — наибольшее положительное число, представимое для данного типа данных.
Эта операция преобразует данные между типами, соответствующим образом масштабируя значения перед приведением типа.
Пример использования:
x = [[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]]
x_int8 = tf.convert_to_tensor(x, dtype=tf.int8)
tf.image.convert_image_dtype(x_int8, dtype=tf.float16, saturate=False)
<tf.Tensor: shape=(2, 2, 3), dtype=float16, numpy=
array([[[0.00787, 0.01575, 0.02362],
[0.0315 , 0.03937, 0.04724]],
[[0.0551 , 0.063 , 0.07086],
[0.07874, 0.0866 , 0.0945 ]]], dtype=float16)>Преобразование целочисленных типов в типы с плавающей запятой возвращает нормализованные значения с плавающей запятой в диапазоне [0, 1); значения нормализуются по значению MAX входного типа данных. Рассмотрим следующие два примера:
a = [[[1], [2]], [[3], [4]]]
a_int8 = tf.convert_to_tensor(a, dtype=tf.int8)
tf.image.convert_image_dtype(a_int8, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.00787402],
[0.01574803]],
[[0.02362205],
[0.03149606]]], dtype=float32)>a_int32 = tf.convert_to_tensor(a, dtype=tf.int32)
tf.image.convert_image_dtype(a_int32, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[4.6566129e-10],
[9.3132257e-10]],
[[1.3969839e-09],
[1.8626451e-09]]], dtype=float32)>Несмотря на одинаковые значения a и выходной тип данных float32, результаты различаются из-за разных входных типов данных (int8 и int32). Это объясняется тем, что значения нормализуются по значению MAX входного типа данных.
Обратите внимание, что преобразование значений с плавающей запятой в целочисленный тип может привести к потере точности. В приведённом ниже примере тензор изображения b типа float32 преобразуется в int8, а затем обратно в float32. Однако конечный результат отличается от исходного входного значения b из-за потери точности.
b = [[[0.12], [0.34]], [[0.56], [0.78]]]
b_float32 = tf.convert_to_tensor(b, dtype=tf.float32)
b_int8 = tf.image.convert_image_dtype(b_float32, dtype=tf.int8)
tf.image.convert_image_dtype(b_int8, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.11811024],
[0.33858266]],
[[0.5590551 ],
[0.77952754]]], dtype=float32)>При масштабировании из целочисленного типа (входного типа данных) в другой целочисленный тип (выходной тип данных) значение MAX входного типа данных не преобразуется в значение MAX выходного типа данных, однако преобразование туда и обратно не должно приводить к изменениям. Например, как показано ниже, значение MAX типа int8 (=127) не преобразуется в значение MAX типа int16 (=32,767), но при обратном масштабировании мы получаем те же исходные значения c.
c = [[[1], [2]], [[127], [127]]] c_int8 = tf.convert_to_tensor(c, dtype=tf.int8) c_int16 = tf.image.convert_image_dtype(c_int8, dtype=tf.int16) print(c_int16) tf.Tensor( [[[ 256] [ 512]] [[32512] [32512]]], shape=(2, 2, 1), dtype=int16) c_int8_back = tf.image.convert_image_dtype(c_int16, dtype=tf.int8) print(c_int8_back) tf.Tensor( [[[ 1] [ 2]] [[127] [127]]], shape=(2, 2, 1), dtype=int8)
Масштабирование из одного целочисленного типа в другой с меньшим диапазоном может привести к потере данных. Обратите внимание, что в приведённом ниже примере при преобразовании int16 в uint8 и обратно в int16 теряется точность.
d = [[[1000], [2000]], [[3000], [4000]]] d_int16 = tf.convert_to_tensor(d, dtype=tf.int16) d_uint8 = tf.image.convert_image_dtype(d_int16, dtype=tf.uint8) d_int16_back = tf.image.convert_image_dtype(d_uint8, dtype=tf.int16) print(d_int16_back) tf.Tensor( [[[ 896] [1920]] [[2944] [3968]]], shape=(2, 2, 1), dtype=int16)
Обратите внимание, что преобразование входных значений с плавающей запятой в целочисленные типы может привести к переполнению или потере значимости. Чтобы избежать этой проблемы при таких преобразованиях, задайте для saturate значение True. Если параметр включён, операция насыщения ограничивает выходное значение допустимым диапазоном перед потенциально опасным приведением типа (и только перед таким приведением, то есть при преобразовании типа с плавающей запятой в целочисленный тип, а также при преобразовании знакового типа в беззнаковый; saturate не влияет на преобразования между типами с плавающей запятой или на преобразования, увеличивающие диапазон типа).
| Аргументы | |
|---|---|
image | Изображение. |
dtype | image преобразуется в тип DType. |
saturate | Если True, ограничивает входное значение перед приведением типа (при необходимости). |
name | Имя этой операции (необязательно). |
| Возвращает | |
|---|---|
image, преобразованное в dtype. |
| Вызывает исключения | |
|---|---|
AttributeError | Вызывает ошибку атрибута, если dtype не является ни типом с плавающей запятой, ни целочисленным типом. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/image/convert_image_dtype