提问者:小点点

ImageDataGenerator重新调整为[-1,1]而不是[0,1]


我使用的是Keras Tensorflow ImageDataGenerator,通常它与重新调整因子1./255一起使用,将初始值从0到255重新调整为0到1。 但是,我想把它重新调整到-1,1范围。

所以不是:

train_image_generator = ImageDataGenerator(
    rescale=1./255,
)

我试过:

train_image_generator = ImageDataGenerator(
    rescale=((1./127.5)-1)
)

接下来,这将应用于一个目录:

train_datagen = train_image_generator.flow_from_directory(
  directory=training_dir,
  target_size=(x, y),
  shuffle=True,
  batch_size=x,
  class_mode='binary'
)

可以像这样检查某些值:

train_datagen[1]

但是根据文档,这是我们用来将数据乘以所提供的值的一个因子。 因此,它只能是一个用于相乘的因子,因此在这里减1是没有意义的,因为数据是使用值-0.99215686275重新定标的,当我检查实际值时,我可以看到负值,比如-130.xx。 所以这不起作用。 由于我需要将它重新调整为-1,1,而不是0,1,因为我想在以后使用预训练的MobileNet V2,我的问题是,如何才能做到这一点?

我不是在谈论避免使用ImageDataGenerator的方法:

def format_example(image, label):
  image = tf.cast(image, tf.float32)
  image = (image/127.5) - 1
  image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
  return image, label

等等。

所以我想使用ImageDataGenerator。 所以我可以重新调整1.0/127.5,但我仍然需要减去1。 有没有一种方法以后从train_dataGen中的值中减去1? 类似于

train_DataGen.ActualValues-1

(我知道这是行不通的。)

此外:我需要一个与图像增强一起工作的解决方案,所以通常我有:

train_image_generator = ImageDataGenerator(
    horizontal_flip=True,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    fill_mode="nearest",
    zoom_range=0.2,
    rescale=((1./127.5)-1) #1./255,
)

现在,我唯一的问题是rescale=((1./127.5)-1)不能工作。 如何解决这个问题,如何重新设置为[-1,1]而不是[0,1]?


共2个答案

匿名用户

只需获取ImageDataGenerator的输出并应用以下转换:

genrated_image = (generated_image + 1)*0.5

## To change the input-tensor, you could do this inside your model
input_tensor = (input_tensor + 1)*0.5

这会将图像/掩码从[-1,1]范围重新调整到[0,1]范围。

  1. tf.keras.preprocessing.image.imageDataGenerator

匿名用户

请尝试以下操作:

def norm(image, label):
    image = tf.cast(image, tf.float32)
    norm_min, norm_max = -1, +1
    nom = (image - image.min()) * (norm_max - norm_min)
    denom = image.max() - image.min()
    image = norm_min + nom / denom
    image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
    return image, label

您可以更改norm_maxnorm_min值,以尝试标准化为[-1,1][0,1]

注意这一行

image = (image/127.5) - 1

但在图像具有已知的最小值和最大值[0,255]的情况下,在归一化之前可以这样做。

编辑:在那里得到了错误的想法。。。

以前不知道什么是正规化,但想要正规化[0,1],可以使用

norm_min, norm_max = 0, 1
image = norm_min + (image - image.min()) * (norm_max - norm_min) / (image.max() - image.min())