Рисунок 1. Пример визуальных данных датасета
Рисунок 1. Соотношение изображений по категориям
# Загрузка библиотек
from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras import layers, models
# Загрузка модели EfficientNetB0
base_model = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(128, 128, 3))
base_model.trainable = False # Замораживаем предобученные слои
# Построение модели
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dense(1, activation='sigmoid') # Для бинарной классификации (REAL/FAKE)
])
# Компиляция модели
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Обучение модели
history = model.fit(train_generator, epochs=20, validation_data=test_generator)
# Оценка модели
test_loss, test_acc = model.evaluate(test_generator)
print(f'Точность EfficientNet: {test_acc:.2f}')
# Загрузка библиотек
from tensorflow.keras.applications import Xception
from tensorflow.keras import layers, models
# Загрузка модели Xception
base_model = Xception(weights='imagenet', include_top=False, input_shape=(299, 299, 3))
base_model.trainable = False # Замораживаем предобученные слои
# Построение модели
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dense(1, activation='sigmoid') # Для бинарной классификации (REAL/FAKE)
])
# Компиляция модели
model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=['accuracy'])
# Обучение модели
history = model.fit(train_generator, epochs=10, validation_data=test_generator)
# Оценка модели
test_loss, test_acc = model.evaluate(test_generator)
print(f'Точность Xception: {test_acc:.2f}')
# Загрузка библиотек
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, models
# Загрузка модели ResNet50
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False # Замораживаем предобученные слои
# Построение модели
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dense(1, activation='sigmoid') # Для бинарной классификации (REAL/FAKE)
])
# Компиляция модели
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Обучение модели
history = model.fit(train_generator, epochs=10, validation_data=test_generator)
# Оценка модели
test_loss, test_acc = model.evaluate(test_generator)
print(f'Точность ResNet50: {test_acc:.2f}')
Рисунок 2. Изображения, неверно распознанные сетью EfficientNet
Рисунок 3. Нормализованная матрица ошибок