Причина здесь
model.add(Dense(32, activation = 'softmax'))
и здесь
class_mode = 'binary'
Причиной ошибки является то, что вашей модели требуется, чтобы выходная форма была (batch_size, 32)
, но по class_mode = 'binary'
вы получилитолько (batch_size, 1)
.
Во-первых, вам нужно знать, сколько классов составляют ваши изображения, сколько папок в TRAIN_SET
в этом случае, и поместить его в Dense()
. Например, если у вас есть 7 классов, тогда вам понравится
model.add(Dense(7, activation = 'softmax'))
и изменится class_mode = 'binary'
на class_mode = 'categorical'
. Для классификации нескольких классов вы не можете маркировать как 0
это собака 1
это кошка 2
это утка и 3
это лошадь, вы не можете разрезать утку пополам и получить кошку или минус лошадьна лошади и получить собаку. Вам нужна кодировка one-hot
.
Во-вторых, о классах binary
, если ваши данные только о 2 классах, таких как кошка и собака, тогда вы можете просто получить ответ модели, как "это изображение собака"тогда, если это правда, это собака или если это ложь, это кошка.
В этом случае вы можете использовать
model.add(Dense(1, activation = 'sigmoid')) # beware, it's 'sigmoid' here, not 'softmax'
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) # binary_crossentropy here, not categorical
и
class_mode = 'binary'
Редактировать
Один горячий похож, позволяетопределите наркотики = 0, ужас = 1, насилие = 2 и сексуальное = 3, если ответ violence
, тогда целевые данные будут [0, 0, 1, 0]
. Модель будет предсказывать как [0.1, 0.05, 0.8, 0.05]
, вероятность каждого класса вместо фактического числа 2. Как я уже сказал, вы не можете добавить horror
с violence
и получить sexual
в качестве результата, поэтому вам нужно определить их отдельно, иметьмодель предсказывает, какой класс наиболее вероятен здесь.
Редактировать 2
Двоичная точность используется, когда каждое ваше изображение может быть более чем одним классом, как Эмма Уотсон может быть обеими актрисами,человек или женщина, ни классы не ошибаются. Выходной результат может быть как [1, 0, 1, 1, 0]
, суммирование не должно быть 1. Но в вашем случае здесь это categorical classification
, а не binary
, каждое изображение, сгенерированное из flow_from_directory
, будет помечено как categorical
, есливы хотите, чтобы он был мультиклассовым, вы все равно можете использовать binary_accuracy
и получить тот же результат, но это не для этой цели, кто-то может почесать голову при чтении вашего кода позже, поэтому я думаю, что лучше использовать accuracy
,