分類 猫と犬のTFデータセットがあります。
import tensorflow_datasets as tfds
SPLIT_WEIGHTS = (8, 1, 1)
splits = tfds.Split.TRAIN.subsplit(weighted=SPLIT_WEIGHTS)
(raw_train, raw_validation, raw_test), metadata = tfds.load(
'cats_vs_dogs', split=list(splits),
with_info=True, as_supervised=True)
この例では、マップ関数を使用して画像を拡大しています。 here のように、Nice ImageDataGenerator
クラスを使用してそれを行うこともできるのかと思いました。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our training data
train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
directory=train_dir,
shuffle=True,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')
私が直面している問題は、ImageDataGenerator
を使用するために つの方法 しか表示できないことです:pandasデータフレーム、numpy配列、および画像のディレクトリです。また、Tensorflowデータセットを使用してこれらの方法を組み合わせますか?
はい、そうですが、少しトリッキーです。
Keras ImageDataGenerator
は_numpy.array
_ sではなく_tf.Tensor
_ sで機能するため、Tensorflowの numpy_function を使用する必要があります。これにより、_tf.data.Dataset
_のコンテンツに対して、配列のように操作を実行できるようになります。
最初に、データセットに対して_.map
_となる関数を宣言しましょう(データセットが画像とラベルのペアで構成されていると仮定)。
_# We will take 1 original image and create 5 augmented images:
HOW_MANY_TO_AUGMENT = 5
def augment(image, label):
# Create generator and fit it to an image
img_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
img_gen.fit(image)
# We want to keep original image and label
img_results = [(image/255.).astype(np.float32)]
label_results = [label]
# Perform augmentation and keep the labels
augmented_images = [next(img_gen.flow(image)) for _ in range(HOW_MANY_TO_AUGMENT)]
labels = [label for _ in range(HOW_MANY_TO_AUGMENT)]
# Append augmented data and labels to original data
img_results.extend(augmented_images)
label_results.extend(labels)
return img_results, label_results
_
この関数を_tf.data.Dataset
_内で使用するには、_numpy_function
_を宣言する必要があります。
_def py_augment(image, label):
func = tf.numpy_function(augment, [image, label], [tf.float32, tf.int32])
return func
_
_py_augment
_は次のように安全に使用できます。
augmented_dataset_ds = image_label_dataset.map(py_augment)
データセットのimage
部分が_(HOW_MANY_TO_AUGMENT, image_height, image_width, channels)
_の形になりました。単純な_(1, image_height, image_width, channels)
_に変換するには、unbatch
を使用するだけです。
unbatched_augmented_dataset_ds = augmented_dataset_ds.unbatch()
したがって、セクション全体は次のようになります。
_HOW_MANY_TO_AUGMENT = 5
def augment(image, label):
# Create generator and fit it to an image
img_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
img_gen.fit(image)
# We want to keep original image and label
img_results = [(image/255.).astype(np.float32)]
label_results = [label]
# Perform augmentation and keep the labels
augmented_images = [next(img_gen.flow(image)) for _ in range(HOW_MANY_TO_AUGMENT)]
labels = [label for _ in range(HOW_MANY_TO_AUGMENT)]
# Append augmented data and labels to original data
img_results.extend(augmented_images)
label_results.extend(labels)
return img_results, label_results
def py_augment(image, label):
func = tf.numpy_function(augment, [image, label], [tf.float32, tf.int32])
return func
unbatched_augmented_dataset_ds = augmented_dataset_ds.map(py_augment).unbatch()
# Iterate over the dataset for preview:
for image, label in unbatched_augmented_dataset_ds:
...
_