使用 tf.data.Dataset 时的最小-最大归一化

Min-max normalization when using tf.data.Dataset

我有一个 tf.Dataset 并且我想执行 minmax 归一化,以使图像值在 [0,1] 范围内。

我很想知道如何对每个图像以及整个批次执行归一化。

@tf.function def load_images(imagePath):

label = tf.io.read_file(imagePath)
label = tf.image.decode_jpeg(label, channels=3)
label = tf.image.convert_image_dtype(label, dtype=tf.float32)

image=label+tf.random.normal(shape=tf.shape(label),mean=0,stddev=0.1**0.5)

return image, label

filenames = glob.glob("/content/mydrive/images/" + "*.jpg")

trainDS = tf.data.Dataset.from_tensor_slices(filenames) trainDS = (trainDS
.shuffle(len(filenames))
.map(load_images, num_parallel_calls=AUTOTUNE)
.batch(16)
.prefetch(AUTOTUNE) )

谁能建议最好的方法是什么?

P.S。我希望 tf.image.per_image_normalization 函数存在(类似于 tf.image.per_image_standardization),但没有运气。

您可以使用 tf.keras.layers.Rescaling(1./255) 执行最小最大归一化:

import tensorflow as tf
import pathlib

dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)

batch_size = 32

train_ds = tf.keras.utils.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  batch_size=batch_size)

normalization_layer = tf.keras.layers.Rescaling(1./255)
normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))

for x, y in normalized_ds.take(1):
  # the pixel values are now in [0,1]
  print(tf.reduce_min(x), tf.reduce_max(x))
tf.Tensor(0.0, shape=(), dtype=float32) tf.Tensor(1.0, shape=(), dtype=float32)

如果您想分别对每个图像进行归一化,只需将批量大小更改为 1。