###好好好######fine-tuning:利用已有模型训练其他数据集

尝试了将前面层的lr调成0,只训练全连接层,结果放在了每个微调网络的最后;

另外添加了50层的ResNet进行fine-tuning,结果得到了进一步的提高,超越了SVM在这一数据集上的最佳performance(87%)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Deep Learning或者说CNN在图像识别这一领域取得了巨大的进步,那么自然我们就想将CNN应用到我们自己的数据集上,但这时通常就会面临一个问题:通常我们的dataset都不会特别大,一般不会超过1万张,甚至更少,每一类图片只有几十或者十几张。这时候,直接应用这些数据训练一个网络的想法就不可行了,因为深度学习成功的一个关键性因素就是大量带标签数据组成的训练集。如果只利用手头上这点数据,即使我们利用非常好的网络结构,也达不到很高的performance。这时候,fine-tuning的思想就可以很好解决我们的问题:我们通过对ImageNet上训练出来的模型(如CaffeNet,VGGNet,ResNet)进行微调,然后应用到我们自己的数据集上。

由于ImageNet数以百万计带标签的训练集数据,使得如CaffeNet之类的预训练的模型具有非常强大的泛化能力,这些预训练的模型的中间层包含非常多一般性的视觉元素,我们只需要对他的后几层进行微调,在应用到我们的数据上,通常就可以得到非常好的结果。最重要的是,在目标任务上达到很高performance所需要的数据的量相对很少

这是Caffe官方提供的fine-tuing示例:Caffe | Fine-tuning for style recognition

下面我们看另外一个有趣的例子:

Oxford flowers分类

CaffeNet fine-tuned for Oxford flowers dataset

我修改了他们的一些代码,使用了VGG_16而不是VGG_S模型,得到了更好的结果。

这是一个给花分类的例子,我们首先

git clone https://github.com/fish145/fine-tuning
cd Oxford102

克隆整个项目到本地,然后使用

python bootstrap.py

准备图片,并下载CaffeNet和VGG-16这两个预训练模型


运行结束之后我们就可以看到这些美丽的图片了


可以看到,总共8189张图片被划分为训练集(1020张),验证集(1020张)和测试集(6149张)

1.微调CaffeNet

我们首先微调CaffeNet:

CaffeNet

1).CaffeNet包含五层卷积层和三层全连接层,我们保留前面七层的参数,修改最后一层fc8为fc8_oxford_102,将最后预测种类设置为102,相当于我们只需要着重训练这一层的参数,而微调前面的七层

看一下配置文件中值得注意的地方:


这是输入部分,我们这里使用ImageData的形式作为Input,train.txt和valid.txt就是上面程序生成的数据列表,没有使用以往常用的lmdb格式。因为作为微调,数据量相对很少,所以使用这种比较慢的形式也是可以接受的

2).然后设置base_lr为0.001(原始模型中为0.01),因为我们只需要微调前面几层的结构,而将最后一层的learning_rate设置为0.01,来加快这一层的学习;如果你想完全停止除fc8_flickr外其他层的微调,你可以设置那些层的lr_mult为0

看一下solver.prototxt:


可以看到除了base_lr和stepsize被修改外,其余参数都基本一致


新加入的fc8_oxford_102层的learning_rate是前七层的十倍

3).stepsize也需要设置的小一点

接下来开始训练,采用标准的训练过程,用验证集来调整参数,用测试集来测试最终的模型

caffe train -solver=solver.prototxt -weights=pretrained-weights.caffemodel -gpu 0

用以上命令进行训练:


单GPU上训练50000次用了六个小时左右,但其实三万次的模型在测试集上的performance最高,后面应该出现了点过拟合,我们看一下训练过程中的accuracy曲线图


loss下降的非常快,大致30000次迭代之后,已经达到最佳

接下来我们在测试集(6149张)图片上测试我们的模型:

caffe test -model=test.prototxt -weights=snapshot.caffemodel -iterations=123 -gpu 0


最后的accuracy为81.43%,在验证集上的accuracy为84%左右,可以看出模型泛化能力还是非常好的

最后我们用训练出来的模型对自己的图片进行预测:

python predict.py test1.jpg deploy.prototxt pretrained.caffemodel ilsvrc_2012_mean.npy 227

参数依次是测试的图片,配置文件,model,均值文件以及crop之后的图片size


title为花的种类以及为该种类的概率。

如果有数量庞大的花的数据以及一些额外工作,我们就可以得到一个识花的工具了!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

尝试将前五层的卷积层的lr调成0,只训练全连接层,在验证集上的结果如下图:


82.85%,和之前的结果(83.95%)相比只下降了1%,再看一下测试集上:


也只下降了1%左右,但是训练时间并没有差多少,也是6个小时左右,所以用CaffeNet进行fine-tuning的话,这种策略并没有什么收益!

二.微调VGGNet(16 layer)

VGG_16

VGG_16包含13个卷积层和3个全连接层,和上面一样,我们只修改最后一层,具体的结构大家参考项目下的配置文件即可

由于这个结构比较庞大,单GPU(Tesla K80)训练大概需要两天时间~


30000次迭代后,accuracy达到了89.1%,比CaffeNet结构提高了接近6%!如果使用现在最好的ResNet结构,应该可以达到90%以上的accuracy

下面比较一下二者的训练曲线:


然后看一下在测试集上的表现:


在测试集上的accuracy为86.3%,同样是一个飞跃!

最后测试自己的图片就不进行了,感兴趣的可以自行尝试,这个model比前一个的识别能力要更好

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

尝试将前十三层的卷积层的lr调成0,只训练后三层全连接层,结果如下:

accuracy降到81.56%了,在测试集上更是连80%也没有:

但是训练时间降低到了16个小时,整整快了两倍左右,但是对performance影响太大,所以也不推荐使用;

在层数较深的情况下,由于DL本身的特性,在越高层形成的特征越抽象,而前面的卷积层则是颜色和边缘这些比较泛化的特征,所以在fine-tuning时,可以将前几层conv层的lr置为0,但是后面的conv不建议这么做,否则对performance影响太大,得不偿失!

---------------------------------------------------------------------------------------------------------------------------

3.微调ResNet(50 layers)

最近使用fine-tuning完成了一个task,为达到最好的performance,使用了50层的ResNet结构。中间也遇到一些坑,一起写在这里,给大家一个借鉴。

1)数据转换

由于50层的结构太深了,所以我们需要将数据转换成lmdb格式,否则训练起来太慢了,这里使用caffe提供的convert_imageset.ex。

convert_imageset.exe --shuffle --resize_height=256 --resize_width=256 <root>/ train.txt oxford102_train_lmdb

--shuffle代表打乱数据顺序,--resize代表将图片resize至指定尺寸,<root>/为图片所在的根目录,然后是文件集和生成的lmdb数据库名,我们将train,test和valid均转换成lmdb文件

2)生成配置文件

Kaiming大神给我们提供了他们训练出来的模型:OneDrive

也有deploy.prototxt,可以参考deploy用一个script来生成。关于model,值得一提的是,官方的model只有conv1有bias_term,后面的那些卷积层均没有偏置项,所以在生成prototxt时,需要把那些层的bias_term禁用。(这个地方,当时被坑了很久,后来找了很长时间,终于找到了这个bug)

3)训练

使用了两块K80的GPU来进行训练,一是为了缩短训练时间,二则一块GPU没有那么大的显存。最终只花了16个小时就迭代了5万次,也可以看出LMDB数据库的高效性!


再验证集上达到了91.37%的Accuracy.

再来看一下测试集上的表现:


达到了88.08%的准确率,超过了目前在这一数据集上表现最好的SVM方法(87%)

ResNet果然没有让人失望!

总结

通过Caffe官方提供的fine-tuning和本文中给出的示例,可以看出,对于很多CV任务,我们不需要重新建模并训练,可以在ILSVRC大赛中寻找类似的比较好的结果,然后下载预训练的模型,根据我们的任务来微调模型即可。尤其是当我们的数据相对较少时,就更适合选择这种办法。既可以有效利用深度神经网络强大的泛化能力,又可以免去设计复杂的模型以及耗时良久的训练。目前最强大的模型是ResNet

这里推广一个好用的工具:微软识花,是身边一个非常厉害的小伙伴做的,基于260万张花的鉴定照片,得到的可以一键识别400种花卉的工具,国庆出行游玩必备!不过目前只支持ios

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VITS(Variational Inference for Text-to-Speech)是一种端到端的文本到语音合成方法,它可以将文本转化为自然流畅的语音。VITS-Fast Fine-Tuning是对VITS模型进行快速微调的方法。 在传统的语音合成任务中,需要大量的语音对齐标注数据来训练模型。然而,这个过程非常耗时和昂贵。VITS-Fast Fine-Tuning的目标就是通过少量的标注数据来快速微调已有的VITS模型,以在新的任务上取得更好的性能。 VITS-Fast Fine-Tuning方法的关键在于使用变分推断(variational inference)来构建先验和后验分布。通过这个方法,我们可以使用其他大型语音合成数据集训练好的模型作为先验分布,然后使用少量目标任务的标注数据来估计后验分布。这样一来,我们就能够在新任务上快速微调VITS模型。 具体而言,VITS-Fast Fine-Tuning的过程分为两步。第一步是预训练,它使用大型语音数据集训练VITS模型,并生成一个先验分布。第二步是微调,它使用目标任务的标注数据来调整VITS模型的参数,以获得更好的性能。由于预训练的先验分布已经包含了一定的知识,微调的过程可以更快速和高效。 总之,VITS-Fast Fine-Tuning是一种用于快速微调VITS模型的方法。它利用变分推断和预训练的先验分布,通过少量目标任务的标注数据来优化模型性能。这个方法可以加快语音合成模型训练过程,降低训练的时间和成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值