Я пытаюсь использовать перевод-обучение в MobileNetV2 из keras.application в фитоне.Мои изображения принадлежат 4 классам с количеством 8000, 7000, 8000 и 8000 изображений в первом, втором, третьем и последнем классе.Мои изображения имеют серое масштабирование и размеры от 1024x1024 до 128x128.
Я удалил плотные слои классификации из MobileNetV2 и добавил свои собственные плотные слои:
global_average_pooling2d_1 (Glo Shape = (None, 1280) 0 Parameters
______________________________________________________________________________
dense_1 (Dense) Shape=(None, 4) 5124 Parameters
______________________________________________________________________________
dropout_1 (Dropout) Shape=(None, 4) 0 Parameters
________________________________________________________________
dense_2 (Dense) Shape=(None, 4) 20 Parameters
__________________________________________________________________________
dense_3 (Dense) Shape=(None, 4) 20 Parameters
Total params: 2,263,148
Trainable params: 5,164
Non-trainable params: 2,257,984
Как вы можете видеть, я добавил 2плотные слои с выпадением в качестве регуляризатора.Кроме того, я использовал следующее
opt = optimizers.SGD(lr=0.001, decay=4e-5, momentum=0.9)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
batch_size = 32
Мои результаты на тренировках очень странные ...:
Эпоха
1 потеря: 1,3378 - в соответствии: 0,3028 - val_loss:1,4629 - val_acc: 0,2702
2, потеря: 1,2807 - в соотв. 0,3351 - val_loss: 1,3297 - val_acc: 0,3208
3, потеря: 1,2641 - в соотв. 0,3486 - val_loss: 1,4428 - val_acc: 0,3707
4 потери: 1,2178 - согласно: 0,3916 - val_loss: 1,4231 - val_acc: 0,3758
5 потерь: 1,2100 - acc: 0,3909 - val_loss: 1,4009 - val_acc: 0,3625
6потеря: 1.1979 - согласно: 0.3976 - val_loss: 1.5025 - val_acc: 0.3116
7 потеря: 1.1943 - acc: 0.3988 - val_loss: 1.4510 - val_acc: 0.2872
8 потеря: 1.1926 - acc:0,3965 - val_loss: 1,5162 - val_acc: 0,3072
9, потеря: 1,1888 - согласно: 0,4004 - val_loss: 1,5659 - val_acc: 0,3304
10, потеря: 1,1906 - согласно: 0,3969 - val_loss: 1,5655 -val_acc: 0,3260
11 потери: 1,1864 - в соотв. 0,3999 - val_loss: 1,6286 - val_acc: 0,2967
(...)
Подводя итог, потеря тренировок больше не уменьшается и все еще очень высока.Модель также подходит.Вы можете спросить, почему я добавил только 2 плотных слоя с 4 нейронами в каждом.В начале я пробовал разные конфигурации (например, 128 нейронов и 64 нейрона, а также разные регуляторы), затем переоснащение было огромной проблемой, т. Е. Точность тренировок была почти 1, а потери на тесте все еще были далеки от 0.
Я немного запутался в происходящем, потому что здесь что-то невероятно не так.
Попытки тонкой настройки: различное количество нейронов в плотных слоях в части классификации варьируется от 1024 до 4. Различное обучениенормы (0,01, 0,001, 0,0001) Различные размеры партий (16,32, 64) Различные регуляторы L1 с 0,001, 0,0001
Результаты: всегда огромное переоснащение
base_model = MobileNetV2(input_shape=(128, 128, 3), weights='imagenet', include_top=False)
# define classificator
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(4, activation='relu')(x)
x = Dropout(0.8)(x)
x = Dense(4, activation='relu')(x)
preds = Dense(4, activation='softmax')(x) #final layer with softmax activation
model = Model(inputs=base_model.input, outputs=preds)
for layer in model.layers[:-4]:
layer.trainable = False
opt = optimizers.SGD(lr=0.001, decay=4e-5, momentum=0.9)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
batch_size = 32
EPOCHS = int(trainY.size/batch_size)
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=EPOCHS, batch_size=batch_size)
В результате должно бытьнет переобучения и val_loss близко к 0. Я знаю, что из некоторой статьи, работающей над подобными наборами изображений.
ОБНОВЛЕНИЕ: Вот некоторые изображения val_loss, train_loss и точности: 2 плотных слоя с 16 и 8нейроны, lr = 0,001 с распадом 1e-6, размер партии = 25