Разморозить слои моделей на 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')