我使用的是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]?
只需获取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]
范围。
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_max
和norm_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())