Я новичок в машинном обучении, у меня есть эта модель 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')
Я подозреваю, что у вас недостаточно данных для обучения. Я думаю, вам понадобятся десятки тысяч точек данных.
@Андрей, это помогло, но теперь я думаю, что у меня проблема с переоснащением...... 5ndG, может быть, это правда, я изменю набор данных в крайнем случае
Иметь softmax на протяжении всего пути очень необычно, вплоть до сумасшествия. Кроме того, ваш вывод представляет собой одну двоичную переменную, которая не соответствует вашим целям.
@dedObed спасибо за помощь! Я изменил большинство из них на relu, сейчас точность составляет всего 15%,
используйте некоторое увеличение данных и уменьшите изображение из тестового набора и присоедините их к поезду.
@SayedSohan я уменьшил размер набора тестовых данных до 300, точность по-прежнему составляет 15%






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