接收相同(非随机)的图像数据集增强
Receiving the same (not random) augmentations of image dataset
dataset = tf.data.Dataset.range(1, 6)
def aug(y):
x = np.random.uniform(0,1)
if x > 0.5:
y = 100
return y
dataset = dataset.map(aug)
print(list(dataset))
运行这段代码,那么dataset中的所有元素都是原样,或者都等于100。如何让每个元素都单独转换呢?
我下面更具体的问题基本上是问这个
我通过以下方式创建我的分割训练集:
dataset = tf.data.Dataset.from_tensor_slices((image_paths, mask_paths))
然后我将增强函数应用于数据集:
def augment(image_path, mask_path)):
//use tf.io.read_file and tf.io.decode_jpeg to convert paths to tensors
x = np.random.choice([0,1])
if x == 1:
image = tf.image.flip_up_down(image)
mask = tf.image.flip_up_down(mask)
return image, mask
training_dataset = dataset.map(augment)
BATCH_SIZE=2
training_dataset = training_dataset.shuffle(100, reshuffle_each_iteration=True)
training_dataset = training_dataset.batch(BATCH_SIZE)
training_dataset = training_dataset.repeat()
training_dataset = training_dataset.prefetch(-1)
然而,当我可视化我的训练数据集时,所有图像都应用了相同的翻转——它们要么上下翻转,要么不翻转。正如我所期待的那样,它们会有不同的翻转——有些是颠倒的,有些不是。
为什么会这样?
您可以使用均匀随机函数或其他概率分布
tf.random.uniform(
shape, minval=0, maxval=None, dtype=tf.dtypes.float32, seed=None, name=None
)
甚至你可以使用 TensorFlow 或 Keras 中的预构建方法进行翻转
tf.keras.layers.experimental.preprocessing.RandomFlip(
mode=HORIZONTAL_AND_VERTICAL, seed=None, name=None, **kwargs
)
您需要使用 tensorflow 操作(不是 numpy 或正常 python),因为 tf.data.Dataset.map()
将映射函数作为图形执行。将函数转换为图形时,numpy 和 base python 被转换为常量。增广函数只有运行np.random.uniform(0,1)
一次,存为常量
Note that irrespective of the context in which map_func is defined (eager vs. graph), tf.data traces the function and executes it as a graph.
以上内容的来源是here。
一种解决方案是使用tensorflow操作。我在下面包含了一个例子。请注意,if
中的 y
值必须转换为与输入相同的数据类型。
dataset = tf.data.Dataset.range(1, 6)
def aug(y):
x = tf.random.uniform([], 0, 1)
if x > 0.5:
y = tf.cast(100, y.dtype)
return y
dataset = dataset.map(aug)
print(list(dataset))
dataset = tf.data.Dataset.range(1, 6)
def aug(y):
x = np.random.uniform(0,1)
if x > 0.5:
y = 100
return y
dataset = dataset.map(aug)
print(list(dataset))
运行这段代码,那么dataset中的所有元素都是原样,或者都等于100。如何让每个元素都单独转换呢? 我下面更具体的问题基本上是问这个
我通过以下方式创建我的分割训练集:
dataset = tf.data.Dataset.from_tensor_slices((image_paths, mask_paths))
然后我将增强函数应用于数据集:
def augment(image_path, mask_path)):
//use tf.io.read_file and tf.io.decode_jpeg to convert paths to tensors
x = np.random.choice([0,1])
if x == 1:
image = tf.image.flip_up_down(image)
mask = tf.image.flip_up_down(mask)
return image, mask
training_dataset = dataset.map(augment)
BATCH_SIZE=2
training_dataset = training_dataset.shuffle(100, reshuffle_each_iteration=True)
training_dataset = training_dataset.batch(BATCH_SIZE)
training_dataset = training_dataset.repeat()
training_dataset = training_dataset.prefetch(-1)
然而,当我可视化我的训练数据集时,所有图像都应用了相同的翻转——它们要么上下翻转,要么不翻转。正如我所期待的那样,它们会有不同的翻转——有些是颠倒的,有些不是。
为什么会这样?
您可以使用均匀随机函数或其他概率分布
tf.random.uniform(
shape, minval=0, maxval=None, dtype=tf.dtypes.float32, seed=None, name=None
)
甚至你可以使用 TensorFlow 或 Keras 中的预构建方法进行翻转
tf.keras.layers.experimental.preprocessing.RandomFlip(
mode=HORIZONTAL_AND_VERTICAL, seed=None, name=None, **kwargs
)
您需要使用 tensorflow 操作(不是 numpy 或正常 python),因为 tf.data.Dataset.map()
将映射函数作为图形执行。将函数转换为图形时,numpy 和 base python 被转换为常量。增广函数只有运行np.random.uniform(0,1)
一次,存为常量
Note that irrespective of the context in which map_func is defined (eager vs. graph), tf.data traces the function and executes it as a graph.
以上内容的来源是here。
一种解决方案是使用tensorflow操作。我在下面包含了一个例子。请注意,if
中的 y
值必须转换为与输入相同的数据类型。
dataset = tf.data.Dataset.range(1, 6)
def aug(y):
x = tf.random.uniform([], 0, 1)
if x > 0.5:
y = tf.cast(100, y.dtype)
return y
dataset = dataset.map(aug)
print(list(dataset))