我正在尝试了解如何使用 Albumentations 构建数据增强管道以提供 Keras 模型。我正在关注这个示例-> https://albumentations.ai/docs/examples/tensorflow-example/,他们在其中创建了一个数据集对象 PrefetchDataset 并将其传递给 model.fit()。请参见下面的代码:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import tensorflow_datasets as tfds
from functools import partial
from albumentations import (
Compose, RandomBrightness, JpegCompression, HueSaturationValue, RandomContrast, HorizontalFlip,
Rotate
)
AUTOTUNE = tf.data.experimental.AUTOTUNE
#load data
data, info= tfds.load(name="tf_flowers", split="train", as_supervised=True, with_info=True)
data
# augmentations
transforms = Compose([
Rotate(limit=40),
RandomBrightness(limit=0.1),
JpegCompression(quality_lower=85, quality_upper=100, p=0.5),
HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=0.5),
RandomContrast(limit=0.2, p=0.5),
HorizontalFlip(),
])
def aug_fn(image, img_size):
data = {"image":image}
aug_data = transforms(**data)
aug_img = aug_data["image"]
aug_img = tf.cast(aug_img/255.0, tf.float32)
aug_img = tf.image.resize(aug_img, size=[img_size, img_size])
return aug_img
def process_data(image, label, img_size):
aug_img = tf.numpy_function(func=aug_fn, inp=[image, img_size], Tout=tf.float32)
return aug_img, label
# create dataset
ds_alb = data.map(partial(process_data, img_size=120),
num_parallel_calls=AUTOTUNE).prefetch(AUTOTUNE)
# ...And then just pass this dataset object to the model
def create_model(input_shape):
pass
# define model layers...
model = create_model(input_shape)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy', run_eagerly=True)
model.fit(ds_alb, epochs=2)
我的问题是:这个对象ds_alb
在训练期间是否为每批返回不同的图像(根据随机参数集)?我已经阅读了代码,似乎所有的增强Compose
都只执行了一次,在这里:
ds_alb = data.map(partial(process_data, img_size=120), num_parallel_calls=AUTOTUNE).prefetch(AUTOTUNE)
但我相信构建这条管道的目的是在每次传递时提供不同的增强图像,而不是只增强一次……有些东西我不明白。如何检查是否正在生成不同的图像?