Получение довольно плохой точности с использованием модели CNN в Keras

Я новичок в машинном обучении, у меня есть эта модель CNN для классификации 7 инструментов: {'фагот': 0, 'эрху': 1, 'флейта': 2, 'валторна': 3, 'гитара': 4, 'саксофон': 5, 'рабочий пример': 6}

есть 1214 изображений для обучения и 1206 изображений для тестирования

это моя модель:

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator


normalizedTrainingSet = ImageDataGenerator(rescale=1 / 255)
normalizedTestingSet = ImageDataGenerator(rescale=1 / 255)


trainingClass = normalizedTrainingSet.flow_from_directory("DataSet/Training",
                                                          target_size=(100, 100),
                                                          batch_size=32,
                                                          class_mode = "categorical",
                                                          shuffle=True)

testingClass = normalizedTrainingSet.flow_from_directory("DataSet/Testing",
                                                         target_size=(100, 100),
                                                         batch_size=32,
                                                         class_mode = "categorical",
                                                         shuffle=True)

print(trainingClass.class_indices)
print(testingClass.class_indices)

model = tf.keras.models.Sequential \
        ([
        tf.keras.layers.Conv2D(200, (3, 3), activation = "softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(142, activation = "softmax"),
        tf.keras.layers.Dense(1, activation = "sigmoid")
    ])

model.compile(loss = "categorical_crossentropy", optimizer = "adam", metrics=['accuracy'])

fittedModel = model.fit(trainingClass, epochs=1, batch_size=100, validation_data=testingClass, shuffle=True)

model.save('newModel')

точность, которую я получаю:

Я хочу добавить эпохи позже, так как для обучения модели потребуется слишком много времени!

Спасибо за помощь!!

Обновлять: Я удалил размер пакета и получил колоссальные 85%, но прогнозы неверны, если я скажу модели прогнозировать изображение, которое находится в наборе обучающих данных, она сделает это очень неправильно...

Обновление2: Я меняю софтмакс на релу, моя точность сейчас 15%...

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator


normalizedTrainingSet = ImageDataGenerator(rescale=1 / 255)
normalizedTestingSet = ImageDataGenerator(rescale=1 / 255)


trainingClass = normalizedTrainingSet.flow_from_directory("DataSet/Training",
                                                          target_size=(100, 100),
                                                          class_mode = "categorical",
                                                          shuffle=True)

testingClass = normalizedTrainingSet.flow_from_directory("DataSet/Testing",
                                                         target_size=(100, 100),
                                                         class_mode = "categorical",
                                                         shuffle=True)

print(trainingClass.class_indices)
print(testingClass.class_indices)

model = tf.keras.models.Sequential \
        ([
        tf.keras.layers.Conv2D(200, (3, 3), activation = "relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation = "relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(142, activation = "softmax"),
        tf.keras.layers.Dense(7, activation = "sigmoid")
    ])

model.compile(loss = "categorical_crossentropy", optimizer = "adam", metrics=['accuracy'])

fittedModel = model.fit(trainingClass, epochs=1, validation_data=testingClass, shuffle=True)

model.save('newModel')

С CNN не имел дело, но хорошей точности в 152 с/38 пачек не ожидал

Andrey 13.12.2020 13:11

Я подозреваю, что у вас недостаточно данных для обучения. Я думаю, вам понадобятся десятки тысяч точек данных.

8n8 13.12.2020 13:14

@Андрей, это помогло, но теперь я думаю, что у меня проблема с переоснащением...... 5ndG, может быть, это правда, я изменю набор данных в крайнем случае

Naito 13.12.2020 13:20

Иметь softmax на протяжении всего пути очень необычно, вплоть до сумасшествия. Кроме того, ваш вывод представляет собой одну двоичную переменную, которая не соответствует вашим целям.

dedObed 13.12.2020 13:22

@dedObed спасибо за помощь! Я изменил большинство из них на relu, сейчас точность составляет всего 15%,

Naito 13.12.2020 13:26

используйте некоторое увеличение данных и уменьшите изображение из тестового набора и присоедините их к поезду.

Sayed Sohan 13.12.2020 13:28

@SayedSohan я уменьшил размер набора тестовых данных до 300, точность по-прежнему составляет 15%

Naito 13.12.2020 13:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш окончательный слой классификации должен иметь 7 нейронов. Активация слоя должна быть softmax, а не сигмовидной. Удалите input_shape=(100, 100, 3) со всех слоев, кроме первого слоя. Изменение активации на relu в плотном слое со 142 нейронами. Для testing_Class установите shuffle=False в flow_from_directory. У вас есть небольшое количество обучающих выборок. Я бы рекомендовал вам использовать увеличение изображения в ImageDataGenerator для training_Class. Например, установите horizontal_flip=True. Документация по добавлению аугментации находится здесь.

Другие вопросы по теме