Вопрос или проблема
Я пытаюсь создать многоклассовый классификатор изображений, но он возвращает только 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)
, что является стандартным, но убедитесь, что ваши изображения по размеру как минимум соответствуют этому требованию.
Заключение
Убедитесь, что у вас правильно настроены классы, а также проверьте архитектуру вашей модели для достижения лучших результатов. Неправильное название класса – распространенная ошибка, которую следует предотвратить в будущем. Следуя вышеизложенным рекомендациям, вы сможете успешно классифицировать изображения и получить ожидаемые результаты.