归一化 tf.data.Dataset
Normalize tf.data.Dataset
我有 tf.data.Dataset
个具有输入形状(批量大小,128、128、2)和目标形状(批量大小,128、128、1)的图像,其中输入是 2 通道图像(具有代表实部和虚部的两个通道的复值图像),目标是 1 通道图像(实值图像)。
我需要通过首先从中移除它们的平均图像然后将它们缩放到 (0,1) 范围来标准化输入和目标图像。如果我没记错的话,tf.data.Dataset
一次只能处理一个批次,而不是整个数据集。因此,我从 remove_mean
py_function
中的批次中的每个图像中删除批次的平均图像,然后通过减去其最小值并除以它的最大值和最小值在 py_function
linear_scaling
中。但是在应用函数之前和之后打印来自数据集的输入图像中的最小值和最大值之后,图像值没有变化。
谁能指出这可能出了什么问题?
def remove_mean(image, target):
image_mean = np.mean(image, axis=0)
target_mean = np.mean(target, axis=0)
image = image - image_mean
target = target - target_mean
return image, target
def linear_scaling(image, target):
image_min = np.ndarray.min(image, axis=(1,2), keepdims=True)
image_max = np.ndarray.max(image, axis=(1,2), keepdims=True)
image = (image-image_min)/(image_max-image_min)
target_min = np.ndarray.min(target, axis=(1,2), keepdims=True)
target_max = np.ndarray.max(target, axis=(1,2), keepdims=True)
target = (target-target_min)/(target_max-target_min)
return image, target
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
Output -
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
map
不是就地操作,因此当您执行 train_dataset.map(....)
.
时,您的 train_dataset
不会改变
做train_dataset = train_dataset.map(...)
我有 tf.data.Dataset
个具有输入形状(批量大小,128、128、2)和目标形状(批量大小,128、128、1)的图像,其中输入是 2 通道图像(具有代表实部和虚部的两个通道的复值图像),目标是 1 通道图像(实值图像)。
我需要通过首先从中移除它们的平均图像然后将它们缩放到 (0,1) 范围来标准化输入和目标图像。如果我没记错的话,tf.data.Dataset
一次只能处理一个批次,而不是整个数据集。因此,我从 remove_mean
py_function
中的批次中的每个图像中删除批次的平均图像,然后通过减去其最小值并除以它的最大值和最小值在 py_function
linear_scaling
中。但是在应用函数之前和之后打印来自数据集的输入图像中的最小值和最大值之后,图像值没有变化。
谁能指出这可能出了什么问题?
def remove_mean(image, target):
image_mean = np.mean(image, axis=0)
target_mean = np.mean(target, axis=0)
image = image - image_mean
target = target - target_mean
return image, target
def linear_scaling(image, target):
image_min = np.ndarray.min(image, axis=(1,2), keepdims=True)
image_max = np.ndarray.max(image, axis=(1,2), keepdims=True)
image = (image-image_min)/(image_max-image_min)
target_min = np.ndarray.min(target, axis=(1,2), keepdims=True)
target_max = np.ndarray.max(target, axis=(1,2), keepdims=True)
target = (target-target_min)/(target_max-target_min)
return image, target
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
Output -
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
map
不是就地操作,因此当您执行 train_dataset.map(....)
.
train_dataset
不会改变
做train_dataset = train_dataset.map(...)