tf.image.convert_image_dtype
| Просмотреть исходный код на GitHub |
Преобразовать 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 | Тип DType для преобразования image в. |
saturate | Если True, обрезать входные данные перед приведением типа (при необходимости). |
name | Имя данной операции (необязательно). |
| Возвращает | |
|---|---|
image, преобразованный в dtype. |
| Возможные ошибки | |
|---|---|
AttributeError | Вызывает ошибку атрибута, когда тип данных не является ни float, ни integer. |
© 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/versions/r2.9/api_docs/python/tf/image/convert_image_dtype