微调 讨论区


#1

http://zh.diveintodeeplearning.org/chapter_computer-vision/fine-tuning.html


如何使用densenet121 预训练模型进行微调?
#2

from mxnet.gluon.model_zoo import vision as models
pretrained_net = models.resnet18_v2(pretrained=True)

下了好久都没下载成功,有下好模型的朋友分享一下吗?


#3

@szha,我看咱们 Index of /models/imagenet/resnet/18-layers 这个链接里没有resnet18_v2的模型。gluon可以加载咱们以前mxnet的模型嘛?


#4

在国内可以设置环境变量MXNET_GLUON_REPO为https://apache-mxnet.s3.cn-north-1.amazonaws.com.cn/来加速从Gluon下载数据集和预训练模型参数。


#5

image
用cifar10 试了下resnet50_v2,只跑了20epoch,效果并不好,难道我打开的方式不对。


#6

cifar10图片是32x32,imagenet是224x224。感觉这是主要区别


#7

MXNET_GLUON_REPO=https://apache-mxnet.s3.cn-north-1.amazonaws.com.cn/ jupyter notebook

完美!!!


#8

如果要效果好的话,是不是也得把小数据集变成224x224?这是普遍的做法吗?


#9

可能是要这样。一般实际应用中,图片通常用224x224这个尺寸,而不是32x32.所以modelzone里都是用前者


#10

好的,谢谢沐神。我再试试224x224的尺寸。


#11

好像做微调的时候,原模型用的什么预处理,现在也要用什么预处理,比如对图像减均值等


#12

请教各位小伙伴,沐神在Fine-tuning中介绍到:

在微调里,我们一般新建一个网络,它的定义跟之前训练好的网络一样,除了最后的输出数等于当前数据的类别数。新网络的features被初始化前面训练好网络的权重,而classfier则是从头开始训练。

代码为:

from mxnet import init

finetune_net = models.resnet18_v2(classes=2)
finetune_net.features = pretrained_net.features
finetune_net.classifier.initialize(init.Xavier())

但这会使得finetune_net中的参数名出现两个 prefix:

print(finetune_net.features[1].params)

resnetv20_conv0_ (
  Parameter resnetv20_conv0_weight (shape=(64, 3, 7, 7), dtype=<class 'numpy.float32'>)
)
print(finetune_net.classifier[0].params)

resnetv21_batchnorm2_ (
  Parameter resnetv21_batchnorm2_gamma (shape=(0,), dtype=<class 'numpy.float32'>)
  Parameter resnetv21_batchnorm2_beta (shape=(0,), dtype=<class 'numpy.float32'>)
  Parameter resnetv21_batchnorm2_running_mean (shape=(0,), dtype=<class 'numpy.float32'>)
  Parameter resnetv21_batchnorm2_running_var (shape=(0,), dtype=<class 'numpy.float32'>)
)

这样当我要保存微调后的模型时,

finetune_net.save_params(param_file)

会出现如下错误:

ValueError: Prefix resnetv21_ is to be striped before saving, but Parameter resnetv20_batchnorm0_gamma does not start with resnetv21_. If you are using Block.save_params, This may be due to your Block shares parameters from other Blocks or you forgot to use with name_scope() during init. Consider switching to Block.collect_params.save and Block.collect_params.load instead.

这个问题该怎么解决呢?

谢谢!


#13

我之前试过用gluon微调,你可以看看 https://fiercex.github.io/post/gluon_features_fine/


#14

谢谢,我去试一试。


#15

目前还不能自动加载过去的模型,主要原因是gluon的图必须和以前symbol里的图要一致
如果图一致的话可以按照forward时候用到的parameter的顺序来填


#16

我用CPU计算,test acc始终上不去,用的就是教程里的代码 捕获
另外,使用net.save_params保存会报错,和上面的一样


使用 net.collect_params().Save 没问题,不知道为啥。我比较关注为什么test acc为什么上不去


#17

没有改过数据集吗?


#18

没改过,只是下载地址我改成了国内的那个,我晚上再试一遍


#19

from mxnet.gluon.model_zoo import vision as models
from mxnet import init
import mxnet as mx

net = models.densenet121(classes=10)

使用gluon提供的densenet121网络结构,如何更改某一层的参数值:
比如:
print(net.features[13])
是平均池化层
AvgPool2D(size=(7, 7), stride=(7, 7), padding=(0, 0), ceil_mode=False)

我想修改为:AvgPool2D(size=(3, 3), stride=(3, 3), padding=(0, 0), ceil_mode=False)
没有找到接口来修改参数值(没有在mxnet.io中找到),请问在哪里可以找到这些接口啊?该使用哪个函数接口啊?谢谢


#20

我又试了下,重新下载的数据,复制的代码,test acc还是这样