Пробую построить нейронную сеть для классификации изображений на кошек и собак , пробовал разные архитектуры по типу Resnet50 , AlexNet ,MobileNetV2 и делал свою архитектуру , в результате не было никаких проблем с точность на тренировочных данных и на валидационных точность в районе 80-91% на тренировочных данных и 75-85% на валидационной ,но когда проверяю точность на тестовой выборке , она всегда на уровне 49-51% .И как то раз решил добавить еще один класс и точность получилось на тестовой выборке 32-34% , если добавить 5 классов то точность в районе 19-21% и баланс классов начиная с бинарной классификации 0,5 потом 0,33 и 0,2 соответственно.
Проверки :
Веса классов:
{'cat': 1.0, 'dog': 1.0}
Class Balance:
{'cat': 0.5, 'dog': 0.5}
train 4800 validation 1200
Код
from sklearn.model_selection import train_test_split
train_df, valid_df = train_test_split(data,
test_size = 0.20,
random_state = 41,
stratify = data['labels'])
print('train', train_df.shape[0], 'validation', valid_df.shape[0])
datagen = ImageDataGenerator(rescale = 1./255,
featurewise_center=False,
samplewise_center=False,
rotation_range=90,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True,
vertical_flip=True,
shear_range = 10
)
validation_datagen = ImageDataGenerator(rescale = 1./255,
)
train_generator = datagen.flow_from_dataframe(
dataframe = train_df,
directory='/content/images/train/',
x_col='image',
y_col='labels',
target_size=(224,224),
batch_size=32,
shuffle=True,
class_mode = 'binary',
color_mode = 'rgb'
)
valid_generator = validation_datagen.flow_from_dataframe(
dataframe = valid_df,
directory='/content/images/train/',
x_col='image',
y_col='labels',
target_size=(224,224),
batch_size=32,
shuffle=False,
color_mode = 'rgb',
class_mode = 'binary'
)
backbone = MobileNetV2(input_shape=(224,224, 3),
weights='imagenet',
include_top=False)
model = Sequential()
model.add(backbone)
model.add(GlobalAveragePooling2D())
model.add(Dense(100, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(20 activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(2, activation='sigmoid'))
model.compile(optimizer=Adam(lr=0.0001), loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(train_generator,
steps_per_epoch=train_generator.samples // 32,
validation_steps=valid_generator.samples // 32,
validation_data=valid_generator, epochs=5)
Уже все перепробовал и lr увеличивал и Adam менял на sgd и в выходном слое делал 2 нейрона и убирал class_mode или менял на sparse и менял на sparse_categorical_crossentropy и архетиктуры разные менял и увеличивал датасет (было 20000 изображений), скачивал и менял разные датасеты изображений ,все равно точность соответствует балансу классов .Может быть неправильно обрабатываю изображения или надо еще как то обработать. Может вообще проблема с самим google colab ? Потому что код пишу там