Fine-tuning 深度学习操作指南

本文介绍如何利用迁移学习解决小样本图像识别问题,通过调整预训练模型的最后几层以适应新任务,实现在少量数据下取得高精度。实验对比了CaffeNet、VGGNet及ResNet的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述


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

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分类

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

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

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

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

python bootstrap.py

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

这里写图片描述

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

这里写图片描述

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

1.微调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曲线图

这里写图片描述

这里写图片描述

oss下降的非常快,大致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

这里写图片描述
这里写图片描述

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

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


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

这里写图片描述

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

这里写图片描述

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

2.微调VGGNet(16 layers)

VGG_16

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

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

这里写图片描述

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

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

这里写图片描述

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

这里写图片描述

在测试集上的accuracy86.3%,同样是一个飞跃!这一结果已经无限逼近这个数据集上目前的最佳结果了(87%,使用SVM方法)

最后测试自己的图片就不进行了,感兴趣的可以自行尝试,这个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至指定尺寸,/为图片所在的根目录,然后是文件集和生成的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,很多视觉任务都可以通过fine-tuning ResNet得到非常好的performance!

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

参考:https://zhuanlan.zhihu.com/p/22624331

<think>好的,用户想了解如何进行DeepSeek模型的微调。首先,我需要回顾一下已有的知识,特别是参考内容中的信息。根据引用[2],参数高效微调(PEFT)方法有多种,比如适配器、提示调优、前缀调优等,这些方法可以只更新少量参数而达到接近全参数微调的效果。DeepSeek可能也采用了类似的PEFT方法,比如LoRA或者适配器。 接下来,用户可能需要具体的步骤指导。通常,微调需要准备数据集、选择微调方法、配置训练参数、进行训练和评估。我需要将这些步骤分解开来,结合DeepSeek的实际情况。另外,用户可能对代码示例感兴趣,比如使用Hugging Face的Transformers库或者DeepSeek提供的特定工具。 还需要考虑用户可能的背景。他们可能是开发者或研究人员,对深度学习有一定了解,但需要具体的操作指南。因此,回答需要结构清晰,步骤明确,并提供资源链接,如GitHub仓库或官方文档,如引用[3]中的项目地址可能相关。 另外,用户的问题可能涉及模型微调的技术细节,比如不同的PEFT方法比较、参数设置、计算资源需求等。需要确保回答覆盖这些方面,并引用相关文献或官方资料支持。 最后,生成相关问题时要围绕微调方法、性能优化、应用场景等展开,帮助用户进一步探索。</think>### DeepSeek模型微调方法 DeepSeek模型的微调主要采用**参数高效微调技术(PEFT)**,其核心思想是通过更新少量参数实现接近全参数微调的效果。以下是具体实施步骤: #### 1. 微调方法选择 - **LoRA(Low-Rank Adaptation)**:在Transformer层注入低秩矩阵,仅训练新增参数。公式表示为: $$W' = W + \alpha \cdot \Delta W$$ 其中$\Delta W = A \cdot B^T$为低秩分解矩阵[^2] - **Adapter Tuning**:在FFN层后插入适配器模块,结构为: $$h_{out} = h_{in} + f(W_{down} \cdot \sigma(W_{up} \cdot h_{in}))$$ 通常保留原始参数$W$固定,仅训练$W_{down}$和$W_{up}$ #### 2. 实施流程 1. **环境准备** ```python pip install deepseek transformers peft ``` 2. **加载预训练模型** ```python from deepseek import DeepseekModel model = DeepseekModel.from_pretrained("deepseek-7b-base") ``` 3. **配置PEFT参数** ```python from peft import LoraConfig lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1 ) ``` 4. **训练配置** ```python training_args = TrainingArguments( output_dir="./results", learning_rate=3e-4, per_device_train_batch_size=4, gradient_accumulation_steps=8, num_train_epochs=3, fp16=True ) ``` 5. **开始微调** ```python from transformers import Trainer trainer = Trainer( model=model, args=training_args, train_dataset=dataset, data_collator=collator ) trainer.train() ``` #### 3. 性能优化建议 - **梯度检查点**:启用`gradient_checkpointing`可减少40%显存消耗 - **混合精度训练**:使用`fp16`或`bf16`格式加速训练 - **批量策略**:通过`gradient_accumulation_steps`模拟更大批量 #### 4. 注意事项 - 建议从官方仓库获取最新配置文件[^3] - 全参数微调需要联系官方获取商业授权[^1] - 典型微调耗时参考: | 模型规模 | 显存需求 | 训练速度 | |---------|---------|---------| | 7B | 24GB | 120 tokens/s | | 13B | 40GB | 80 tokens/s |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值