在GluonCV上解冻模型层

问题描述

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

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

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...