使用 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。
我有一个 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。