#python #tensorflow #keras
#python #тензорный поток #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%, но прогнозы неверны, если я скажу модели предсказать изображение, которое находится в обучающем наборе данных, оно будет очень неправильным…
Update2: я меняю softmax на relu, теперь моя точность составляет 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')
Комментарии:
1. Я не имел дела с CNN, но я бы не ожидал хорошей точности в 152 сек / 38 партиях
2. Я подозреваю, что у вас недостаточно обучающих данных. Я бы подумал, что вам понадобятся десятки тысяч точек данных.
3. @Andrey, это вроде помогло, но теперь я думаю, что у меня проблема с переоснащением …… 5ndG может быть, это правда, я изменю набор данных в качестве последнего средства
4. Пройти
softmax
весь путь — это очень необычно, вплоть до сумасшествия. Кроме того, ваш вывод представляет собой единственную двоичную переменную, которая не соответствует вашим целям.5. @dedObed спасибо за помощь! Я изменил большинство из них на relu, теперь точность составляет всего 15%,
Ответ №1:
Ваш окончательный уровень классификации должен иметь 7 нейронов. Активация для слоя должна быть softmax, а не sigmoid. Удалите input_shape=(100, 100, 3) со всех слоев, кроме первого слоя. Измените активацию на relu в плотном слое с 142 нейронами. Для testing_Class установите shuffle=False в flow_from_directory. У вас небольшое количество обучающих выборок. Я бы рекомендовал вам использовать увеличение изображения в ImageDataGenerator для training_Class. Например, установите horizontal_flip=True . Документация по добавлению дополнения находится здесь.