При экспериментах с тонкой настройкой моделей CNN, как выбрать подходящую головную сеть для подключения к модели? - PullRequest
0 голосов
/ 24 февраля 2020

Я экспериментирую с тренировочными моделями на наборе данных, содержащем изображения симптомов болезней растений.

Я обучил модель VGG16 с нуля, а также использовал трансферное обучение.

В трансферном обучении я удалил глава модели VGG16, предварительно обученный на базе данных imag enet. Затем я подключил эту пользовательскую головку к ней.

from keras.layers.core import Dropout
from keras.layers.core import Flatten
from keras.layers.core import Dense
head_model = base_model.output
head_model = Flatten(name='flatten')(head_model)
head_model = Dense(256,activation='relu')(head_model)
head_model = Dropout(0.5)(head_model)
# Add a softmaxc layer
head_model = Dense(len(class_names),activation='softmax')(head_model)

Я заморозил все слои в базовой модели и тренировал голову около 25 эпох.

Затем я разморозил некоторые слои в конец базовой модели и обучение для еще 100 эпох.

Это приводит к большей точности, чем обучение с нуля.

Я хочу также поэкспериментировать с моделью ResNet50.

Мой вопрос: как мне определить подходящий головной раздел для прикрепления? Для вышесказанного, я получил архитектуру головы из учебника. Но я не очень понимаю причины этого. Например, слои CONV там не используются. Только плотный, сплющенный и выпадающий. Почему не используются слои CONV?

Как выбрать подходящую головку для Re sNet?

EDIT

У меня есть 100- 1500 изображений в классе. Всего 10 классов.

Точность тренировки для повторного snet

После прогрева. Здесь я замораживаю все слои базовой модели и тренирую произвольную головку только в течение 25 эпох.

[INFO] evaluating after initialization...
                                        precision    recall  f1-score   support

          Tomato___Tomato_mosaic_virus       0.00      0.00      0.00       532
                 Tomato___Early_blight       0.00      0.00      0.00       239
                  Tomato___Late_blight       0.00      0.00      0.00       470
                    Tomato___Leaf_Mold       0.00      0.00      0.00       238
               Tomato___Bacterial_spot       0.00      0.00      0.00       435
                  Tomato___Target_Spot       0.00      0.00      0.00       362
Tomato___Tomato_Yellow_Leaf_Curl_Virus       0.30      1.00      0.46      1355
                      Tomato___healthy       0.00      0.00      0.00        98
           Tomato___Septoria_leaf_spot       0.00      0.00      0.00       414
      Tomato___Two-spotted_spider_mite       0.00      0.00      0.00       397

                           avg / total       0.09      0.30      0.14      4540

После завершения прогрева я попытался постепенно разморозить некоторые слои. Вот результаты.

Слои, начиная с 165, незамерзшие. (работает за 60 эпох)

425/425 [==============================] - 233s 548ms/step - loss: 0.2656 - accuracy: 0.9201 - val_loss: 93.4192 - val_accuracy: 0.2998

Слои из 161 незамерзших (пробег около 50 эпох)

425/425 [==============================] - 221s 521ms/step - loss: 0.2627 - accuracy: 0.9235 - val_loss: 91.5139 - val_accuracy: 0.1066

Слои из 168 незамерзших (пробег 50 эпох) val_accuracy = 0.30198

Итак, val_accuracy увеличивается очень редко. И это также уменьшается.

В отличие от vgg16 получает очень хорошую точность.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Любые определенные модели CNN, такие как VGG16, Re snet, Inception и многие другие, имеют проверенную архитектуру, основанную на часах обучения и экспериментах. Следовательно, обычно не нужно менять существующую архитектуру или добавлять к ней больше уровней CONV. Единственное требуемое отличие - это изменение в полностью подключенных слоях или в простых словах «голова». Поскольку голова работает только над числами, в большинстве случаев более 2 плотных слоев более чем достаточно. Я наблюдал, как модели становятся тяжелыми (больше времени на тренировку и память), если мы используем более 2 плотных слоев

0 голосов
/ 04 мая 2020

Субъективно выбирать . Как выбрать подходящую головку для Re sNet? или любой другой хорошо известной архитектуры. Старайтесь не менять архитектуру, а играйте с головным узлом . Я предпочитаю использовать GlobalAveragePooling2D ()

Одно из преимуществ глобального среднего пула перед полностью связанными слоями состоит в том, что он более естественен для структуры свертки, обеспечивая соответствие между картами объектов и категориями. Таким образом, карты характеристик могут быть легко интерпретированы как карты достоверности категорий.

А полностью подключенные слои подвержены переобучению, что затрудняет обобщающую способность всей сети.

def add_new_last_layer(base_model, nb_classes):
    x = base_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(1024)(x)
    x = Activation('relu')(x)

    x = Dropout(0.3)(x)
    x = Dense(512)(x)
    x = Activation('relu')(x)

    predictions = Dense(nb_classes, activation='softmax')(x)
    # Creating final model
    model = Model(inputs=base_model.input, outputs=predictions)
    return model
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...