predict_classes() возвращает только 0 или 1 для многоклассовой классификации изображений

Вопрос или проблема

Я пытаюсь создать многоклассовый классификатор изображений, но он возвращает только 0 или 1.

Почему он не возвращает “Камень”, “Бумага”, “Ножницы”? И почему только 0 и 1, но не 2?

КОД:

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Flatten
import numpy as np


train_directory = 'D:\D_data\Rock_Paper_Scissors\Train'
training_datgagen = ImageDataGenerator(rescale = 1./255)
training_generator = training_datgagen.flow_from_directory(
    train_directory,
    target_size = (28,28),
    class_mode="categorical", classes = ["Rock", "Paper" , "Scissor"])

validation_directory = 'D:\D_data\Rock_Paper_Scissors\Train'
validation_datagen = ImageDataGenerator(rescale= 1./255)
validation_generator = validation_datagen.flow_from_directory(
    validation_directory,
    target_size = (28,28),
    class_mode="categorical",
    classes = ["Rock", "Paper" , "Scissor"]
    )


model = Sequential()
model.add(Flatten(input_shape = (28,28,3)))
model.add(Dense(128,activation = 'relu'))
model.add(Dense(64, activation = 'relu'))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(3, activation = 'softmax'))

model.compile(optimizer="adam", loss="categorical_crossentropy",metrics = ['accuracy'],)
filenames = validation_generator.filenames
nb_samples = len(filenames)
desired_batch_size = 1

model.fit_generator(training_generator,epochs=20,validation_data = validation_generator)
predict = model.predict_classes(validation_generator, batch_size = None)

print(predict)

Результат:

[0 1 1 ... 1 0 1]

Я получил ответ, поэтому публикую его для будущих справок других:

3 класса, определенные в

train_directory = 'D:\D_data\Rock_Paper_Scissors\Train'
training_datgagen = ImageDataGenerator(rescale = 1./255)
training_generator = training_datgagen.flow_from_directory(
    train_directory,
    target_size = (28,28),
    class_mode="categorical", classes = ["Rock", "Paper" , "Scissor"])

в class_mode должны быть Камень, Бумага, “Ножницы” это были названия папок, которые я создал, но я допустил ошибку и неправильно написал “Ножницы” в коде.

Большое спасибо всем, кто оставил комментарии!

Ответ или решение

Проблема, с которой вы столкнулись, заключается в том, что ваша модель многоклассовой классификации изображений возвращает только 0 и 1 (вместо 0, 1, и 2), что указывает на неправильную настройку классов в вашем коде. Рассмотрим основные аспекты и рекомендации для решения данной проблемы, а также предложим пути улучшения, чтобы ваша модель могла корректно классифицировать изображения как "Rock", "Paper" и "Scissors".

1. Ошибка в именах классов

Как вы сами указали в результате, основная причина проблемы заключается в неправильном названии одного из классов — "Scissors" (вместо "Scissor"). Это часто приводит к тому, что ваш генератор данных не может корректно распознать все три класса, поддерживающие обучение модели. Важно убедиться, что названия папок с изображениями в вашей директории точно соответствуют названиям классов, указанным в коде.

Решение:

Измените строку:

classes = ["Rock", "Paper", "Scissor"]

на

classes = ["Rock", "Paper", "Scissors"]

2. Проверка потерь на этапе обучения

Если потери (loss) вашей модели не уменьшаются, это может указывать на проблемы с обучением, такие как неправильная архитектура, недостаток данных или чрезмерная сложность модели. Проверьте, улучшаете ли вы потери на обучающей и валидационной выборках.

Рекомендации по оптимизации:

  • Убедитесь, что количество изображений для каждого класса сбалансировано.
  • Попробуйте использовать регуляризацию Dropout для уменьшения переобучения.
  • Параметры оптимизации, такие как скорость обучения, могут быть отрегулированы для улучшения результатов.

3. Использование методов предсказания

Метод predict_classes() был удален из новой версии Keras. Вместо этого используйте predict(), чтобы получить предсказанные вероятности и затем получите класс с максимальной вероятностью.

Пример использования:

predictions = model.predict(validation_generator)
predicted_classes = np.argmax(predictions, axis=1)
print(predicted_classes)

Итак, по этому примеру, у вас будет готовый вектор predicted_classes, содержащий значения 0, 1 и 2, которые соответствуют вашим классам.

4. Загрузка данных и предобработка

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

Заключение

Убедитесь, что у вас правильно настроены классы, а также проверьте архитектуру вашей модели для достижения лучших результатов. Неправильное название класса – распространенная ошибка, которую следует предотвратить в будущем. Следуя вышеизложенным рекомендациям, вы сможете успешно классифицировать изображения и получить ожидаемые результаты.

Оцените материал
Добавить комментарий

Капча загружается...