Keras model.predict всегда 0

Я использую приложения keras для передачи обучения с помощью resnet 50 и inception v3, но при прогнозировании всегда получаю [[ 0.]]

Приведенный ниже код предназначен для задачи бинарной классификации. Я также пробовал vgg19 и vgg16, но они работают нормально, это просто реснет и начало. Набор данных разделен 50/50. И я меняю только model = applications.resnet50.ResNet50 строку кода для каждой модели.

ниже приведен код:

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)

img_width, img_height = 256, 256
train_data_dir = xxx
validation_data_dir = xxx
nb_train_samples = 14000
nb_validation_samples = 6000 
batch_size = 16
epochs = 50

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

model = applications.resnet50.ResNet50(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))


    from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)

img_width, img_height = 256, 256
train_data_dir = xxx
validation_data_dir = xxx
nb_train_samples = 14000
nb_validation_samples = 6000 
batch_size = 16
epochs = 50

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

model = applications.resnet50.ResNet50(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))


#Freeze the layers which you don't want to train. Here I am freezing the first 5 layers.
for layer in model.layers[:5]:
    layer.trainable = False

#Adding custom Layers 
x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
#x = Dense(1024, activation="relu")(x)
predictions = Dense(1, activation="sigmoid")(x)

# creating the final model 
model_final = Model(input = model.input, output = predictions)

# compile the model 
model_final.compile(loss = "binary_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])


# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

# Save the model according to the conditions  
#checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
#early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')



model_final.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size,
    callbacks=[early_stopping])



from keras.models import load_model
import numpy as np
from keras.preprocessing.image import img_to_array, load_img

#test_model = load_model('vgg16_1.h5')
img = load_img('testn7.jpg',False,target_size=(img_width,img_height))
x = img_to_array(img)
x = np.expand_dims(x, axis=0)
#preds = model_final.predict_classes(x)
prob = model_final.predict(x, verbose=0)
#print(preds)
print(prob)

Обратите внимание, что model_final.evaluate_generator(validation_generator, nb_validation_samples) обеспечивает ожидаемую точность, например 80%, это просто прогноз, который всегда равен 0.

Просто странно, что vgg19 и vgg16 работают нормально, а resnet50 и inception нет. Требуют ли эти модели что-то еще для работы?

Любое понимание было бы здорово.

Заранее спасибо.


person Stig    schedule 26.08.2017    source источник
comment
Как вы делаете предварительную обработку? Я не вижу этого в вашем коде, и это может быть причиной того, что вы получаете такие результаты. Вам необходимо импортировать соответствующую функцию предварительной обработки из Inception3 или ResNet и использовать ее для подготовки изображений (например, from inception_v3 import InceptionV3, preprocess_input).   -  person petezurich    schedule 27.08.2017
comment
Также вам нужно удалить rescale=1. / 255 из генераторов. В противном случае массивы изображений будут масштабироваться дважды. (inception_v3.preprocess_input() уже сделал это за вас)   -  person Yu-Yang    schedule 27.08.2017
comment
Спасибо, я попробую это, что еще делает preprocessing_input? Я не могу найти какие-либо документы для него.   -  person Stig    schedule 27.08.2017
comment
На этапе прогнозирования выполните x = img_to_array(img) print(x) значения, напечатанные в диапазоне от 0 до 255?   -  person Anil Maddala    schedule 20.09.2017


Ответы (1)


Я столкнулся с подобной проблемой. Вы масштабируете все значения RGB от 0-255 до 0-1 во время обучения.

То же самое следует сделать во время предсказания. Попробуйте x = img_to_array(img) x = x/255

person Anil Maddala    schedule 20.09.2017
comment
Благодарю вас! Думал, что схожу с ума. - person cadebe; 08.02.2021