Разморозить слои моделей на GluonCV

Я использую модели Faster-RCNN, Yolo и SSD на GluonCV (mxnet) для прогнозирования на некоторых медицинских изображениях. Однако результат обучения не идеален, поскольку количество изображений в наборе данных невелико. В результате я решил использовать трансферное обучение и разморозить выходной слой с помощью метода reset_class для обучения моих моделей. Но результат все же ниже ожиданий. Таким образом, я пытаюсь разморозить больше слоев, чтобы повысить точность результата обучения, но не смог найти никакой встроенной функции для этого.

По сути, у меня есть два следующих вопроса: во-первых, можно ли разморозить больше слоев на GluonCV? Во-вторых, если нет, могу ли я использовать какой-либо другой способ еще больше повысить точность результата?

1 ответ

Если честно, я не уверен, почему вы считаете, что параметры модели заморожены по умолчанию и reset_classразморозит выходной слой. Тем не менее, если вы хотите разморозить определенные параметры, вам нужно выбрать их с помощью collect_params метод и установить их grad_req приписывать 'write'. Например, имея следующую сверточную сеть

      import mxnet as mx

class ConvNet(mx.gluon.nn.HybridSequential):
    def __init__(self, n_classes, params=None, prefix=None):
        super().__init__(params=params, prefix=prefix)

        self.features = mx.gluon.nn.HybridSequential()
        self.features.add(mx.gluon.nn.Conv2D(channels=6, kernel_size=5, padding=2,
                          activation='relu'))
        self.add(mx.gluon.nn.MaxPool2D(pool_size=2, strides=2))
        self.add(mx.gluon.nn.Flatten())

        self.output = mx.gluon.nn.Dense(units=n_classes)

    def hybrid_forward(self, F, x):
        x = self.features(x)
        return self.output(x)

net = ConvNet(10)

вы можете разморозить блок свертки (функций) с помощью

      net.features.collect_params().setattr('grad_req', 'write')

Кроме того, если ваша модель не состоит из features, output, и / или другие отдельные блоки (например, это один последовательный блок):

      net = mx.gluon.nn.HybridSequential()
net.add(mx.gluon.nn.Conv2D(channels=6, kernel_size=5, padding=2,
                           activation='relu'))
net.add(mx.gluon.nn.MaxPool2D(pool_size=2, strides=2))
net.add(mx.gluon.nn.Flatten())
net.add(mx.gluon.nn.Dense(units=10))

чтобы разморозить блок свертки, попробуйте следующее:

      net.collect_params('conv*').setattr('grad_req', 'write')
Другие вопросы по тегам