こけこっこー

がんばる

ImageDataGenerator flow_from_directoryを使い、名前付きでクラスごとのデータを読み込む

kerasの ImageDataGenerator を使って画像を読み込み、kaggleの画像分類問題をやっていたのですが、 validationデータで良い正答率が出るにもかかわらず、testデータにするとうまく分類できない状況に陥りました。

原因は flow_from_directoryclasses を指定していなかったことでした。

現象

前提として、データは以下のようなディレクトリ構造で配置しています。

data/
    train/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...
    validation/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...

続いてコードです。

    train_generator = train_datagen.flow_from_directory(
        train_images, # 上記 train を指定
        target_size=(image_height, image_width),
        batch_size=batch_size,
        class_mode='categorical')

    validation_generator = test_datagen.flow_from_directory(
        test_images, # 上記 validation/ を指定
        target_size=(image_height, image_width),
        batch_size=1,
        class_mode='categorical')

flow_from_directoryclass_modecategorical にしておけば上記のディレクトリ構造からいい感じに分類をやってくれるそうです。 ということで、分類を test/validation/ 以下のディレクトリ名でやってくれると思ったのですが、そうではありませんでした。 このまま実行するとディレクトリ名に関係なく0からディレクトリ数までの数字を割り振って分類されます。 つまりdogs, catsではなく0, 1のように分類されるということです。

解決策

この問題を解決するためには classes を指定してやる必要があります。

    classes = ['dogs', 'cats']

    train_generator = train_datagen.flow_from_directory(
        train_images, # 上記 train を指定
        target_size=(image_height, image_width),
        batch_size=batch_size,
        classes=classes,
        class_mode='categorical')

    validation_generator = test_datagen.flow_from_directory(
        test_images, # 上記 validation/ を指定
        target_size=(image_height, image_width),
        batch_size=1,
        classes=classes,
        class_mode='categorical')