Я пытаюсь создать нейронную сеть, которая может определить, есть ли кошка на картинке. Я нашел этот урок на сайте tenorflow и попытался приспособить его к моей проблеме. Учебное пособие предназначено для классификации кошек и собак, но поскольку я хочу только обнаруживать кошек, я изменил категории на кошек и не кошек.
Для не кошек я загрузил набор случайных изображений.
Я добавил два генератора к коду из учебника:
test_data_gen = test_image_generator.flow_from_directory(batch_size=batch_size,
directory=test_dir,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')
pred_data_gen = pred_image_generator.flow_from_directory(batch_size=batch_size,
directory=pred_dir,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')
И затем протестировал модель следующим образом:
print('\n# Evaluate on test data')
results = model.evaluate_generator(test_data_gen)
print('test loss, test acc:', results)
print('\n# Generate predictions')
predictions = model.predict(pred_data_gen)
print(len(predictions))
print(predictions)
Это вывод:
# Evaluate on test data
test loss, test acc: [0.45212748232815003, 0.9324082]
# Generate predictions for custom samples
256
[[ -8.023465 ]
[ -7.781438 ]
[ 50.281197 ]
[-10.172492 ]
[ -5.1096087 ]
[ 43.0299 ]
[ 21.416649 ]
...
[-10.866359 ]
[-14.797473 ]
[ 84.72212 ]
[ 23.712345 ]
[ -6.4916744 ]
[-18.384903 ]
[ 33.10642 ]]
Точность теста очень высока, но я понятия не имею, что означают эти результаты. Я думал, что они должны быть между 0 и 1, но они даже имеют отрицательные значения. Как мне интерпретировать эти результаты?
РЕДАКТИРОВАТЬ:
Это моя модель (до добавления функции активации сигмоида в последний слой):
model = Sequential([
Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
MaxPooling2D(),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 3, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(512, activation='relu'),
Dense(1)
])
Я изменил последний слой равен Dense(1, activation='sigmoid')
, и результат выглядит следующим образом:
# Evaluate on test data
test loss, test acc: [0.714477022488912, 0.5949367]
# Generate predictions for custom samples
256
[[1.]
[1.]
[1.]
...
[1.]
[1.]
[1.]]
Все прогнозируемые значения являются единицами, даже если в тестовом наборе только половина изображений является кошками.
EDIT2:
Вот как я собираю и подгоняю модель:
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
model.summary()
history = model.fit_generator(
train_data_gen,
steps_per_epoch=total_train // batch_size,
epochs=epochs,
validation_data=val_data_gen,
validation_steps=total_val // batch_size
)