问题描述
我在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,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')