使用 keras.layers.RandomRotation() 进行数据增强不会产生相同的结果

问题描述 投票:0回答:1

在我的项目中,我有原始图像和相应蒙版的数据集。我想执行增强,因此它是随机的,但图像和匹配掩模相同。为此,我使用相同的种子定义了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

keras-layer data-augmentation image-augmentation
1个回答
0
投票

我面临着同样的问题,并在源代码中进行了一些挖掘。这可能是随机生成器默认有状态而不是无状态的错误。请参阅来源此处以获取解释。

这导致了以下在 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")

更新:似乎不完全正确。虽然两个层具有相同的旋转,但它在后续调用中不会改变:(所以这毕竟不是一个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.