Нейтральный ImageDataGenerator хуже, чем без - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь построить модель двоичной классификации. Моя база данных содержит 2400 изображений с классификационной меткой 0 или 1. Без ImageDataGenerator я достигаю val: a cc ~ 80% и включая ImageDataGenerator, я получаю только ~ 50% a cc, даже если ImageDataGenerator не редактирует изображения , Кто-нибудь знает, почему я получаю худшее решение с помощью ImageDataGenerator?

В обоих случаях я запускаю блок подготовки:

#preparation
import os
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm_notebook as tqdm
from PIL import Image
from keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from sklearn.utils import shuffle

#import images
def read_images(path):
    files = os.listdir(path)
    files = [file for file in files if file[-4:] == ".jpg"]

    images = []
    for file in tqdm(files):
        image = Image.open(path + "/" + file)
        image = image.resize((299, 299), Image.LANCZOS)
        image = image.convert("RGB")
        image = np.asarray(image)
        images.append(image)
    return images    


good = read_images("good")
bad = read_images("bad")

good = np.asarray(good)
bad = np.asarray(bad)
x = np.concatenate([good,bad])


y_bad = np.zeros(len(bad))
y_good = np.ones(len(good))
y = np.concatenate([y_good,y_bad])

y = y.reshape(-1, 1)

#preprocessing
x = preprocess_input(x)

#bottlenecking part1
inception_resnet_v2_model = InceptionResNetV2(include_top=False, input_shape=(299, 299, 3))
inception_resnet_v2_model.trainable = False

Вот блок без ImageDataGenerator:

#Without ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten
from keras.layers.normalization import BatchNormalization 
from keras.initializers import he_uniform 
from keras.optimizers import Adam
from keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input

#bottlenecking part2 
x_train_inception_resnet_v2 = inception_resnet_v2_model.predict(x,verbose=1)
x_train_inception_resnet_v2, y = shuffle(x_train_inception_resnet_v2, y)

model = Sequential()

model.add(Flatten(input_shape=(8, 8, 1536))) 
model.add(Dense(256, activation="relu")) 
model.add(Dropout(0.5)) 
model.add(Dense(256,activation="relu")) 
model.add(Dropout(0.5)) 
model.add(Dense(1, activation="sigmoid"))

model.compile(optimizer=Adam(lr=0.00001), loss="binary_crossentropy", metrics=["accuracy"])

history = model.fit(x_train_inception_resnet_v2, y, validation_split=0.2, epochs=96, batch_size=64, shuffle=True)

Вот блок с ImageDataGenerator:

#Including ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten
from keras.layers.normalization import BatchNormalization
from keras.initializers import he_uniform
from keras.optimizers import Adam
from keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input

#Init ImageDataGenerator
datagen = ImageDataGenerator(
        rescale=1.0/255.0)

datagen.fit(x)

generator = datagen.flow(
        x,
        shuffle= False,
        batch_size=1)

#bottlenecking part2
x_train_inception_resnet_v2 = inception_resnet_v2_model.predict_generator(generator, steps=2400, verbose=1, workers=8)
x_train_inception_resnet_v2, y = shuffle(x_train_inception_resnet_v2, y)

model = Sequential()

model.add(Flatten(input_shape=(8, 8, 1536)))
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(256, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(1, activation="sigmoid"))

model.compile(optimizer=Adam(lr=0.00001), loss="binary_crossentropy", metrics=["accuracy"])

history = model.fit(x_train_inception_resnet_v2, y, validation_split=0.2, epochs=96, batch_size=64, shuffle=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...