news 2026/1/29 5:51:08

如何在卫星数据上微调预训练的视觉变换器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在卫星数据上微调预训练的视觉变换器

原文:towardsdatascience.com/how-to-fine-tune-a-pretrained-vision-transformer-on-satellite-data-d0ddd8359596?source=collection_archive---------7-----------------------#2024-03-21

PyTorch Lightning 中的逐步教程

https://medium.com/@caroline.arnold_63207?source=post_page---byline--d0ddd8359596--------------------------------https://towardsdatascience.com/?source=post_page---byline--d0ddd8359596-------------------------------- Caroline Arnold

·发表于Towards Data Science ·6 分钟阅读·2024 年 3 月 21 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/052cfa4a7466bc057f2271ab6f3aaa70.png

图像由作者使用Midjourney创建。

Vision Transformer是一个强大的图像分类 AI 模型。它于 2020 年发布,将高效的变换器架构引入了计算机视觉领域。

在预训练阶段,AI 模型会摄取大量数据并学习常见的模式。视觉变换器是在ImageNet-21K数据集上进行预训练的,该数据集包含 1400 万张图像和 21,000 个类别。

卫星图像不包含在 ImageNet-21K 数据集中,如果直接应用,视觉变换器的性能会很差。

在这里,我将向您展示如何在来自EuroSat 数据集的 27,000 张卫星图像上微调一个预训练的视觉变换器。我们将预测土地覆盖类型,如森林、农田和工业区。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5dc989f9eba1a2ab016f8d1fb6985575.png

来自EuroSAT RGB 数据集的示例图像。根据欧盟法律,哨兵数据是免费的并且对公众开放。

我们将在PyTorch Lightning中进行工作,这是一个基于 PyTorch 的深度学习库。Lightning 减少了需要编写的代码量,让我们可以专注于建模。

所有代码均可在GitHub上找到。

设置项目

预训练的 Vision Transformer 可以在 Huggingface 上找到。可以从 GitHub 安装模型架构和权重。我们还需要安装 PyTorch Lightning。我在本教程中使用了版本 2.2.1,但任何版本> 2.0 应该都可以使用。

pip install-q git+https://github.com/huggingface/transformers pip install lightning=2.2.1

我们可以将我们的项目分为四个步骤,下面我们将详细介绍:

将 Vision Transformer 适应我们的数据集

来自 Huggingface 的 Vision Transformer 已针对具有 1,000 个类别的 ImageNet 子集进行了优化。

我们的数据集只有 10 个类别,分别代表不同类型的土地覆盖。因此,我们需要修改 Vision Transformer 的输出部分,换成一个具有正确类别数量的新分类头。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/69ef618dc1fda224692e94b5a4d2833e.png

Vision Transformer 架构。由作者根据原始论文修改。 [arxiv]

从 Huggingface 实例化预训练模型的代码使这变得简单。我们只需通过num_labels指定新的类别数量,并告诉模型忽略我们更改输出大小的事实。

fromtransformersimportViTForImageClassification ViTForImageClassification.from_pretrained("google/vit-base-patch16-224",num_labels=10,ignore_mismatched_sizes=True)

模型提醒我们,现在需要重新训练:

ViTForImageClassification 的一些权重未从 google/vit-base-patch16–224 模型检查点初始化,而是因为形状不匹配而重新初始化:

你可能需要在下游任务上训练这个模型,以便能够用于预测和推理。

我们可以选择不同版本的 Vision Transformer,在这里我们使用的是vit-base-patch16–224,这是最小的模型,它使用从大小为224 x 224像素的图像中提取的16 x 16块。该模型有 8580 万个参数,需要 340 MB 的内存。

将 Vision Transformer 作为 Lightning 模块

在 PyTorch Lightning 中,深度学习模型被定义为一个Lightning 模块。我们只需要指定

训练步骤必须返回损失,这里是交叉熵损失,用于量化预测类别与真实类别之间的差异。

日志记录非常方便。通过调用self.log,我们可以直接将训练和评估的指标记录到我们首选的日志记录器中——在我的情况下是TensorBoard。在这里,我们记录了训练损失和验证准确率。

请注意,为了访问 Huggingface 的 Vision Transformer 做出的预测,我们需要从模型输出中提取它们,作为predictions.logits

EuroSAT 数据集的 Lightning DataModule

你可以从Zenodo下载 EuroSAT 数据集。确保选择 RGB 版本,它已经从原始卫星图像转换过来。我们将在LightningDataModule中定义数据集。

设置阶段使用了torchvision的变换函数。为了符合 Vision Transformer 期望的输入,我们需要将卫星图像放大到 224 x 224 像素,将图像转换为 torch 数据类型并进行标准化。

我们将数据集分割为 70%用于训练(微调),10%用于验证,20%用于测试。通过在类标签上进行分层抽样,我们确保三个子集中的类分布相等。

train_dataloader等函数对于在后续的运行脚本中设置数据加载器非常方便。

将所有内容整合起来:运行脚本

现在我们已经有了数据集和模型的构建块,可以编写执行微调的运行脚本了。

为了清晰起见,我为数据集(eurosat_module)和模型(vision_transformer)创建了单独的模块,需要在脚本中导入。

训练模型

Lightning Trainer接收一个模型和用于训练及验证的数据加载器。它提供了多种可以自定义的标志—在这里我们仅使用了其中的三个:

PyTorch Lightning 的优点是训练现在只需一行代码:

trainer.fit(model=model,train_dataloaders=train_dataloader,val_dataloaders=valid_dataloader)

在幕后,训练器使用反向传播和 Adam 优化器来更新模型权重。当验证准确率在指定的 epoch 数量内没有提高时,训练停止。

实际上,在 EuroSAT 数据集上的微调在几个 epoch 内就完成了。面板展示了训练损失,这是由 TensorBoard 记录的。经过两个 epoch 后,模型已经达到了 98.3%的验证准确率。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1b58b4a473a4f6791d71481a7d1b4de7.png

作者创建的 TensorBoard 快照。

在测试集上进行评估

我们的数据集很小,微调速度很快,所以我们不需要单独存储训练好的模型,可以直接将其应用于测试集。

只需一行代码,我们就能计算测试集上的准确率:

trainer.test(model=model,dataloaders=test_dataloader,verbose=True)

只进行了一次微调,我就达到了 98.4%的测试集准确率,这意味着几乎所有的卫星图像的地表类型都被正确分类了。

即使样本较少,我们也能获得很高的准确性。面板展示了在微调过程中只看到一次的不同训练样本数量下的测试集准确性。仅使用 320 张卫星图像,每类平均 32 张,测试集准确性已经达到 80%。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fe1672f643e4eeda9b56bd587156dbaf.png

图片由作者创建。

关键要点

预训练模型是减少训练时间的一个好方法。它们已经在一般任务上表现得很好,只需要适应你的特定数据集。

在现实应用中,数据通常稀缺。EuroSAT 数据集仅包含 27,000 张图像,大约是 ImageNet-21K 数据量的 0.5%。预训练利用了更大的数据集,我们可以高效地使用特定应用数据集进行微调。

Lightning 非常适合训练深度学习模型,而无需担心所有技术细节。LightningModule 和 Trainer API 提供了方便的抽象,并且具有高性能。

如果你想在 Huggingface 生态系统内微调视觉变换器,我推荐这个教程。

完整代码,包括允许你添加自己数据集的配置文件,已在 GitHub 上发布:

[## GitHub - crlna16/pretrained-vision-transformer: 使用 PyTorch 的预训练视觉变换器…

使用 PyTorch Lightning 的预训练视觉变换器 - crlna16/pretrained-vision-transformer

github.com

参考文献

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/14 20:15:51

Keil4串口调试输出分析:操作指南配合仿真

Keil4串口调试输出实战:用软件仿真高效定位嵌入式问题你有没有遇到过这种情况——代码写完了,烧进板子却“没反应”?断点调试又太慢,变量太多根本抓不住重点。这时候,最直接的办法是什么?让程序自己“说话”…

作者头像 李华
网站建设 2026/1/25 19:08:36

GPT-SoVITS与RVC对比:哪个更适合语音克隆新手?

GPT-SoVITS与RVC对比:哪个更适合语音克隆新手? 在AI生成内容爆发的今天,个性化语音不再是影视特效或大厂专属的技术。越来越多的内容创作者、独立开发者甚至普通用户开始尝试“克隆”自己的声音——用于制作有声书、虚拟主播、智能助手&…

作者头像 李华
网站建设 2026/1/26 8:03:59

GPT-SoVITS语音合成动态范围分析:高低频表现均衡性

GPT-SoVITS语音合成动态范围分析:高低频表现均衡性 在智能语音助手、虚拟偶像、有声读物等应用日益普及的今天,用户对“像人”的声音不再满足于基本可懂,而是追求更细腻的情感表达与真实的听觉质感。尤其当一段合成语音出现在安静的夜晚阅读场…

作者头像 李华
网站建设 2026/1/26 1:42:41

Unity游戏自动翻译插件完全指南:轻松实现多语言游戏体验

Unity游戏自动翻译插件完全指南:轻松实现多语言游戏体验 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在当今全球化的游戏市场中,Unity游戏翻译已成为玩家突破语言障碍的关键技术…

作者头像 李华
网站建设 2026/1/9 13:16:27

GPT-SoVITS虚拟偶像配音实战:打造专属声线IP

GPT-SoVITS虚拟偶像配音实战:打造专属声线IP 在虚拟主播直播间里,一个声音甜美、语调自然的AI助手正与观众实时互动;在有声书平台,一段由用户自定义音色朗读的小说片段悄然上线;而在某部独立动画制作现场,主…

作者头像 李华