0

我在 GluonCV (mxnet) 上使用 Faster-RCNN、Yolo 和 SSD 模型来预测一些医学图像。但是,由于数据集中的图像数量很少,因此训练结果并不理想。因此,我决定使用迁移学习并使用“reset_class”方法解冻输出层来训练我的模型。但结果仍低于预期。因此,我试图解冻更多层以提高训练结果的准确性,但我找不到任何内置函数来实现这一点。

基本上,我有以下两个问题:首先,是否可以在 GluonCV 上解冻更多层?其次,如果没有,还有其他方法可以用来进一步提高结果的准确性吗?

4

1 回答 1

0

老实说,我不确定您为什么认为模型参数默认被冻结并且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')

此外,如果您的模型不是由featuresoutput和/或其他单独的块组成(例如,它是单个顺序块):

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')
于 2021-02-18T07:53:08.217 回答