Предсказание Keras возвращает только один класс в двоичной задаче - PullRequest
1 голос
/ 09 июля 2020

Я реализовал Efficien tNet в Keras для двоичной задачи с использованием генератора изображений. В тестовом случае, когда я предсказываю вывод, он возвращает массив с набором вероятностей, но относится только к одному классу, здесь код и вывод:

test_image_generator = ImageDataGenerator(
rescale=1./255
)
real_test=test_image_generator.flow_from_directory(
directory='/content/real_test',
target_size=(224, 224),
color_mode="rgb",
batch_size=1,
class_mode=None,
shuffle=False,
#seed=42
)

Результат:

real_test.reset()
from keras.models import load_model
efficient_net_custom_model = load_model('model_efficientnet4.h5',compile=False)
pred = efficient_net_custom_model.predict_(real_test, steps = len(real_test), verbose = 1)
print (pred)

Теперь при печати прогноза для 4 разных изображений он возвращает:

[[0.45415235]
[0.52390164]
[0.9999932 ]
[0.99946016]]

В основном только одна вероятность вывода (я думаю) для каждого изображения, и невозможно сказать, какой класс является фактическим. не так ли? Как я могу решить эту проблему?

Спасибо

Изменить:

Включая код модели

def output_custom_model(prebuilt_model):
print(f"Processing {prebuilt_model}")
prebuilt = prebuilt_model(include_top=False,
                        input_shape=(224, 224, 3),
                        weights='imagenet')
output = prebuilt.output
output = GlobalMaxPooling2D()(output)
output = Dense(128, activation='relu')(output)
output = Dropout(0.2)(output)
output = Dense(1, activation='sigmoid')(output)

model = Model(inputs=prebuilt.input, outputs=output)
model.compile(optimizer='sgd', loss='binary_crossentropy',
          metrics=METRICS)
return model


efficient_net_custom_model = output_custom_model(EfficientNetB4)
filepath='model_efficientnet4.h5'


efficient_net_history = 
efficient_net_custom_model.fit_generator(train_generator,
                             epochs=20,
                             validation_data=validation_generator,
                             )

1 Ответ

1 голос
/ 09 июля 2020

В некоторых типах сетей двоичный выход - всего один, и он представляет первый класс обучающих данных. Мы предполагаем, что ваши данные обучения выглядят следующим образом:

img1data, class1
img2data, class1
..
imgNdata, class2

Ваша сеть приняла class1 как класс по умолчанию, и данные результаты являются оценками этого класса. Таким образом, эти результаты показывают оценки class1.

[[0.45415235]
[0.52390164]
[0.9999932 ]
[0.99946016]]

Из-за бинарной классификации первый результат показывает, что оценка class1 составляет 0,45, поэтому class2 должен быть 0,55, изображение принадлежит class2. Последний результат показывает, что оценка class1 составляет 0,999, поэтому class2 должен быть 0,0006, изображение принадлежит class1. И так далее ...

Вы можете написать метод для выполнения этих операций и определения класса, к которому принадлежит изображение.

def find_class(result):
    if result >= 0.5:
        return "class1"
    else:
        return "class2"

find_class(result[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...