Transfer Learning - Val_loss странное поведение - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь использовать перевод-обучение в 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

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я не уверен, что ошибка была сверху, но я знаю, как ее исправить. Я полностью обучил предварительно обученную сеть (а также один плотный слой с 4 нейронами и softmax). Результаты более чем удовлетворительные. Я также тестировал VGG16, где я тренировался только с плотным выходным слоем, и он полностью работал.

Кажется, что MobileNetV2 изучает функции, которые нежелательны для моего набора данных. Мои наборы данных представляют собой радиолокационные изображения, которые выглядят очень искусственно (распределение сигналов LPI). С другой стороны, эти изображения очень просты (в основном они представляют собой просто грани в изображении в градациях серого), поэтому мне до сих пор неизвестно, почему обучение переносу на основе моделей не работает для MobileNetV2).

0 голосов
/ 06 июня 2019

Здесь вы использовали x = Dropout(0.8)(x), что означает падение на 80%, но я предполагаю, что вам нужно 20%, поэтому замените его на x = Dropout(0.2)(x)

Также, пожалуйста, ознакомьтесь с документацией keras длято же самое, если необходимо.

выдержка из вышеприведенной документации

keras.layers.Dropout (rate, noise_shape = None, seed = None)

rate : число с плавающей точкой от 0 до 1. Дробь единиц ввода уменьшается.

...