Я пытаюсь построить модель двоичной классификации. Моя база данных содержит 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)