Как увеличить точность классификации?
Мне необходимо разработать бинарный классификатор для распознавания двух образов, используя для этого предобученную архитектуру свёрточной нейронной сети. Решил использовать MobileNetV2. Использовал и некоторые другие, но MobileNet показала себя лучше. В общем, написал следующий код:
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Dropout, experimental
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D, Activation
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Загрузка датасета с муравьями и пчелами
train_dir = "./ants_bees_dataset_master/train"
test_dir = "./ants_bees_dataset_master/val"
# Задаем размеры изображений
img_height, img_width = 224, 224
batch_size = 32
# Создаем генераторы изображений для обучения и тестирования с аугментацией данных
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
test_generator = test_datagen.flow_from_directory(test_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary')
# Создание модели
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3))
base_model.trainable = False
model = Sequential([
base_model,
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
GlobalAveragePooling2D(),
Dense(1024, activation='relu'),
BatchNormalization(),
Dropout(0.5),
Dense(512, activation='relu'),
BatchNormalization(),
Dropout(0.5),
Dense(256, activation='relu'),
Dense(1, activation='sigmoid')
])
# Компиляция модели
model.compile(optimizer=Adam(lr=0.001),
loss='binary_crossentropy',
metrics=['accuracy'])
# Обучение модели
history = model.fit(train_generator,
steps_per_epoch=train_generator.n // batch_size,
epochs=6,
validation_data=test_generator,
validation_steps=test_generator.n // batch_size)
# Визуализация процесса обучения
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()
# Оценка модели на тестовых данных
test_loss, test_acc = model.evaluate(test_generator, verbose=2)
print("Accuracy:", test_acc)
Эта модель работает с точностью максимум 0.94 (максимум получалось 0.9474). По требованию нужна точность 97%. Но я не понимаю как её повысить до такого значения. Пробовал менять оптимизатор, количество слоёв, нейронов, количество эпох и даже саму модель, ничего не помогает. Есть ли способ повысить точность, не прибегая к использованию другого датасета и т.п? Может, модель какую-то другую нужно использовать? Добавил аугментацию данных:
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3))
base_model.trainable = False
model = Sequential([
experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)),
experimental.preprocessing.RandomRotation(0.5),
experimental.preprocessing.RandomZoom(0.5),
experimental.preprocessing.RandomContrast(0.6),
base_model,
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
GlobalAveragePooling2D(),
Dense(1024, activation='relu'),
BatchNormalization(),
Dropout(0.5),
Dense(512, activation='relu'),
BatchNormalization(),
Dropout(0.5),
Dense(256, activation='relu'),
Dense(1, activation='sigmoid')
])
# Компиляция модели
model.compile(optimizer=Adam(lr=0.001),
loss='binary_crossentropy',
metrics=['accuracy'])
С аугментацией стало только хуже, все графики с ней выглядят примерно так Без аугментации графики вроде как показывают переобучение модели Но я убирал слои, уменьшал количество нейронов, уменьшал скорость обучения, всё равно были примерно такие графики. Только пару раз выпало 94% с нормальным графиком(модель, которая представлена в начале).