从tf.keras.applications导入后,Tensorflow的数据增强层不起作用

6

我目前在使用tf.keras.applications中的模型进行训练。同时,还有一个与其一起使用的数据增强层。奇怪的是,在我从applications导入模型后,增强层就不再起作用了。在导入之前它是正常工作的。到底发生了什么?

此外,这只是在TF 2.8.0新版本发布后最近才开始出现的问题。之前都正常工作。

该增强层的代码如下:

data_augmentation = tf.keras.Sequential([
  tf.keras.layers.RandomFlip("horizontal_and_vertical"),
  tf.keras.layers.RandomRotation(0.5),
])

我正在使用以下方式导入这个模型

base_model = tf.keras.applications.MobileNetV3Small(
                 input_shape=(75, 50, 3), alpha=1.0, 
                 weights='imagenet', pooling='avg', include_top=False,
                 dropout_rate=0.1, include_preprocessing=False)

请帮我理解正在发生的事情。您可以在此笔记本上重现代码:https://colab.research.google.com/drive/13Jd3l2CxbvIWQv3Y7CtryOdrv2IdKNxD?usp=sharing

确认在Colab上不起作用,这很奇怪... - geometrikal
3个回答

11

我注意到 tf 2.8 存在同样的问题。当您 测试 数据增强层时,可以通过添加 training=True 来解决该问题:

aug = data_augmentation(image,training=True)

原因在于增强层在训练和预测(推断)时的行为不同,即在训练中会进行增强,但在预测中不做任何处理。理想情况下,该层应根据情况聪明地设置training=参数。显然,在上述代码中它并不聪明:它不知道您的意图是测试该层。
但我认为在构建完整模型时仍应将training参数保留为默认值,让增强层完成工作。

1
是的,这个可行!非常感谢。 - Kriz Moses
1
这实际上非常有帮助。在将图层添加到模型之前尝试查看增强图像时,添加training=True可以让您这样做。 - SmiffyKmc

0

从单个输出中无法看到增强的效果。请设置一个范围以查看增强的效果。

data_augmentation = tf.keras.Sequential([
  tf.keras.layers.RandomFlip("horizontal_and_vertical",seed=5),
  tf.keras.layers.RandomRotation(0.5),
])
for i in range(4):
  aug = data_augmentation(image)
  plt.imshow(aug.numpy().astype('uint8'))
  plt.show()

当然,我尝试了多次。但是没有起作用。 - Kriz Moses
这对我也不起作用。随机翻转无法正常工作。只有在training=True的情况下,随机裁剪才能正常工作。 - Ron

0

让我告诉你,数据增强需要进行大量的修正,因为数据并没有得到很好的增强。你只需要编写相应的代码即可。

`data_augmentation = tf.keras.Sequential([
  tf.keras.layers.RandomFlip("horizontal_and_vertical",seed=5),
  tf.keras.layers.RandomRotation(0.5),
])
for i in range(4):
  aug = data_augmentation(image, training = True)
  plt.imshow(aug.numpy().astype('uint8'))
  plt.show()`

现在应该可以工作了,你的图像应该已经被增强了。 这是一个错误,我认为它会在下一个更新中被修复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接