keras 中的预处理层到底是如何工作的,特别是在作为模型本身的一部分的情况下?这与在模型外部应用预处理然后输入训练结果进行比较。
我试图了解在 keras 模型中运行数据增强。假设我有 1000 张图像用于训练。在模型之外,我可以应用 10 倍增强并获得 10000 个结果图像用于训练。
但我不明白当你使用预处理层进行增强时会发生什么。这个(或者如果您使用很多)层是否会在训练之前获取每个图像并应用转换?这是否意味着用于训练(和我假设的验证)的图像总数是纪元数*原始图像数?
一种选择比另一种更好吗?这是否取决于增强之前最初拥有的图像数量?
预处理层的好处是模型是真正的端到端,即原始数据进来,预测出来。它使您的模型可移植,因为预处理过程包含在 SavedModel 中。
但是,它将在 GPU 上运行所有内容。通常,在 GPU 优化模型时,在后台使用 CPU 工作线程加载数据是有意义的。
或者,您可以在模型外部和数据集内部使用预处理层。这样做的好处是,您可以轻松创建包含各层的仅推理模型,从而在推理时为您提供可移植性,但在训练期间仍然可以加速。
有关更多信息,请参阅 Keras 指南。
我也有同样的问题。基本上有两种推荐的应用增强方法:
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(512,512,3)),
tf.keras.layers.Rescaling(scale=1/255.0),
tf.keras.layers.RandomFlip(),
tf.keras.layers.RandomRotation(factor=0.5),
tf.keras.layers.Conv2D(256, kernel_size=(5, 5), padding='valid', activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在此方法中,图像数量保持与之前相同。增强会改变图像样式,但每个层每个图像仅运行一次。我找不到任何具体的文档,但创建一个仅包含增强的模型证明是一样的。
augmentation_layer = tf.keras.models.Sequential([tf.keras.layers.RandomRotation(factor=0.5)])
nrows = 4
ncols = 4
fig = plt.gcf()
for images, labels in training_set.as_numpy_iterator():
augmented_images = augmentation_layer(images)
break
for i, image in enumerate(augmented_images):
sp = plt.subplot(nrows, ncols, i+1)
plt.imshow(image/255.0)
plt.suptitle('Augmented Images')
for i, image in enumerate(images):
sp = plt.subplot(nrows, ncols, i+1)
plt.imshow(image/255.0)
plt.suptitle('Actual Images')
PS:
training_set
是从_PrefetchDataset
创建的tf.keras.utils.image_dataset_from_directory
。您可能需要编辑代码才能使其与您的数据集一起使用。
结果表明,对于每个实际图像,仅应用一次变换。
如果您有大量数据并且不需要增加数据集大小,则此方法非常有用。但是,如果您希望创建额外的数据,那么选项 2 更好: