在我的项目中,我有原始图像和相应蒙版的数据集。我想执行增强,因此它是随机的,但图像和匹配掩模相同。为此,我使用相同的种子定义了keras顺序层rotation_1和rotation_2。然后我使用它在数据集上使用 .map 进行增强。但它会为图像和匹配蒙版产生不同的旋转。
有人可以给我建议为什么这不起作用吗?还有其他好用且简单的方法来以不同的方式完成此任务吗?
# ROTATION
rotation_1 = keras.Sequential([
layers.RandomRotation((-0.2,0.2), seed = 42, interpolation = "nearest" )
])
rotation_2 = keras.Sequential([
layers.RandomRotation((-0.2,0.2), seed = 42, interpolation = "nearest" )
])
# AUGMENTATION
train_dataset = train_dataset.map(lambda x,y: (rotation_1(x), rotation_2(y)), num_parallel_calls= tf.data.AUTOTUNE)
为了绘制和查看图像,我使用此函数。使用train_ds上的take拍摄图像是否可能存在一些问题?
def generate_plots(train_ds,n):
j = 0
# Plot samples
for image, mask in train_ds.take(n):
generated_img = gen(image, training=True)
generated_img = tf.cast(generated_img > 0, 1, 0)
images = [image[0], mask[0], generated_img[0]]
titles = ['Input Image', 'Ground Truth', 'Generated Mask']
plt.figure(figsize=(10, n*2))
for i in range(3):
plt.subplot(n,3,j+i+1)
plt.imshow(images[i]*0.5 + 0.5, cmap='gray', vmin=0, vmax=1)
plt.title(titles[i])
j = j + 3
generate_plots(train_ds,20)`
我读到,RandomFlip 层存在一些错误,但自 tensorflow 2.12 以来应该已经修复。 (https://github.com/keras-team/keras/issues/17457)
我面临着同样的问题,并在源代码中进行了一些挖掘。这可能是随机生成器默认有状态而不是无状态的错误。请参阅来源此处以获取解释。
这导致了以下在 TF 2.14 上对我有用的解决方法:
seedRotation = 42
rotate1 = layers.RandomRotation(1, seed=seedRotation)
rotate1._random_generator._set_rng_type(rng_type="stateless")
rotate2 = layers.RandomRotation(1, seed=seedRotation)
rotate2._random_generator._set_rng_type(rng_type="stateless")
更新:似乎不完全正确。虽然两个层具有相同的旋转,但它在后续调用中不会改变:(所以这毕竟不是一个解决方案。