我在 GluonCV (mxnet) 上使用 Faster-RCNN、Yolo 和 SSD 模型来预测一些医学图像。但是,由于数据集中的图像数量很少,因此训练结果并不理想。因此,我决定使用迁移学习并使用“reset_class”方法解冻输出层来训练我的模型。但结果仍低于预期。因此,我试图解冻更多层以提高训练结果的准确性,但我找不到任何内置函数来实现这一点。
基本上,我有以下两个问题:首先,是否可以在 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')
此外,如果您的模型不是由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')