归一化什么时候用以及用在哪里

news/2025/1/7 14:58:05/

主要内容:

  • 使用目的(feature normalization/data standardization):使不同特征的数值范围和分布更加一致,从而提高模型的训练效率和测试性能:
    • testset 和valset也要进行一致的变化来避免量纲不一致造成的影响等
    • 不能用到整个set(会引入test set/val set的信息)
  • 在使用预训练模型时,如何对图像进行归一化处理,以及这种处理方式对模型性能的影响

参考:

  • https://discuss.pytorch.org/t/should-we-use-our-normalization-for-training-a-pretrained-model/34905
  • https://stackoverflow.com/questions/49444262/normalize-data-before-or-after-split-of-training-and-testing-data

与pretrain model相关的处理

用预训练模型推理

  • 直接使用预训练模型:如果只是想直接在自己的图像上使用预训练模型进行推理(即直接使用模型进行预测,而不是进一步训练),则需要将图像归一化到与 ImageNet 数据集相同的统计特性(stats)上。因为预训练模型是在 ImageNet 数据集上训练的,它已经学习到了 ImageNet 数据集的特征和分布。通过将图像归一化到 ImageNet 的统计特性上,可以使模型更好地理解和处理图像,从而提高预测的准确性。
  • 输出类别限制:不过,这样做会有一个限制,即模型的输出类别将局限于 ImageNet 数据集中的类别。ImageNet 数据集包含了大约 1000 个类别,如果图像属于这些类别之一,那么模型可以正确识别;但如果图像属于其他类别,模型可能无法准确识别,因为模型没有学习过这些类别的特征。

微调预训练模型

  • 微调的必要性:如果想要让预训练模型适应特定任务或数据集(即图像类别与 ImageNet 类别不同,或者有特定的图像特征需要模型学习),则需要对预训练模型进行微调(finetune)。微调是指在预训练模型的基础上,使用自己的数据集继续训练模型,使其更好地适应自己的数据。
  • 使用自己的统计数据进行归一化:在微调过程中,建议使用自己的数据集的统计特性来对图像进行归一化。因为自己的数据集可能与 ImageNet 数据集在分布、特征等方面存在差异,或者使用能可以更好地反映数据集特性的统计数据,从而使模型在微调过程中更有效地学习和适应数据。
  • 数据集差异的影响:存在过两个数据集之间存在很大差异的情况,使得这种差异对模型的性能产生了巨大的影响。说明在不同数据集之间,数据的分布和特征差异可能会对模型的学习和预测产生显著的影响。然而,对于非常小的数据集差异,不确定其影响程度,可能需要更多的实验和分析来确定.

代码示例

直接使用预训练模型进行推理

import torch
import torchvision
import torchvision.transforms as transforms
from PIL import Image# 加载预训练模型
model = torchvision.models.resnet50(pretrained=True)# 定义归一化参数,使用 ImageNet 的均值和标准差
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])# 定义图像预处理流程
transform = transforms.Compose([transforms.Resize(256),  # 将图像大小调整为 256x256transforms.CenterCrop(224),  # 从图像中心裁剪出 224x224 的区域transforms.ToTensor(),  # 将 PIL 图像转换为 PyTorch 张量normalize  # 使用 ImageNet 的统计数据进行归一化
])# 加载图像
image_path = 'path/to/your/image.jpg'
image = Image.open(image_path)# 对图像进行预处理
preprocessed_image = transform(image)# 将预处理后的图像添加一个批次维度,以匹配模型的输入要求
preprocessed_image = preprocessed_image.unsqueeze(0)# 将模型设置为评估模式
model.eval()# 使用预训练模型进行推理
with torch.no_grad():output = model(preprocessed_image)# 输出预测结果
print(output)

微调预训练模型

import torch
import torchvision
import torchvision.transforms as transforms
from PIL import Image
from torch.utils.data import DataLoader, Dataset
import numpy as np# 加载预训练模型
model = torchvision.models.resnet50(pretrained=True)# 假设你有一个自定义数据集类
class CustomDataset(Dataset):def __init__(self, image_paths, labels, transform=None):self.image_paths = image_pathsself.labels = labelsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, index):image_path = self.image_paths[index]image = Image.open(image_path)label = self.labels[index]if self.transform:image = self.transform(image)return image, label# 计算自定义数据集的均值和标准差
def calculate_dataset_statistics(dataset):data_loader = DataLoader(dataset, batch_size=1, shuffle=False)mean = torch.zeros(3)std = torch.zeros(3)for images, _ in data_loader:for i in range(3):mean[i] += images[:, i, :, :].mean()std[i] += images[:, i, :, :].std()mean.div_(len(dataset))std.div_(len(dataset))return mean, std# 创建自定义数据集实例
image_paths = ['path/to/image1.jpg', 'path/to/image2.jpg', ...]
labels = [0, 1, ...]  # 假设标签是整数
custom_dataset = CustomDataset(image_paths, labels)# 计算自定义数据集的均值和标准差
custom_mean, custom_std = calculate_dataset_statistics(custom_dataset)# 定义归一化参数,使用自定义数据集的均值和标准差
normalize = transforms.Normalize(mean=custom_mean.tolist(),std=custom_std.tolist())# 定义图像预处理流程
transform = transforms.Compose([transforms.Resize(256),  # 将图像大小调整为 256x256transforms.CenterCrop(224),  # 从图像中心裁剪出 224x224 的区域transforms.ToTensor(),  # 将 PIL 图像转换为 PyTorch 张量normalize  # 使用自定义数据集的统计数据进行归一化
])# 更新自定义数据集实例的预处理流程
custom_dataset.transform = transform# 创建数据加载器
data_loader = DataLoader(custom_dataset, batch_size=32, shuffle=True)# 将模型设置为训练模式
model.train()# 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 微调预训练模型
for epoch in range(10):  # 假设训练 10 个周期for images, labels in data_loader:optimizer.zero_grad()output = model(images)loss = criterion(output, labels)loss.backward()optimizer.step()
  • 第一个示例中,直接使用预训练模型进行推理,图像归一化使用的是 ImageNet 的统计数据,这样可以使模型更好地理解和处理图像,提高预测的准确性。

  • 第二个示例中,对预训练模型进行微调,图像归一化使用的是自定义数据集的统计数据,这样可以使模型更好地适应自定义数据集的特征和分布,提高模型在特定任务上的性能。


http://www.ppmy.cn/news/1560936.html

相关文章

浙江省地方数据资产入表指南-报批稿 解读+阅读

任务1: 摘要:本标准《浙江省地方数据资产入表指南》提供了数据资产确认的工作框架、指导和建议,适用于指导组织进行数据资产确认工作。该指南涉及数据资产的识别、确认条件判断、确认流程、变更确认和终止确认等内容。 重点内容: 1. 数据资产确认框架:提供数据资产确认的工…

基于微信小程序的校园自助打印系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

docker 转移文件到容器内部 以修改nextcloud添加域名信任 为例子

# 进入容器 docker exec -it nextcloud_app /bin/sh # 查权 ls -l /var/www/html/config/config.php # 备份 cp /var/www/html/config/config.php /var/www/html/config/config.php.bak # 将外部文件导入到容器中 docker cp /home/apple/config.php nextcloud_app:/var/…

【Block总结】ESSA注意力,适用于高光谱图像的注意力

论文介绍 论文链接:https://arxiv.org/pdf/2307.14010 研究背景:高光谱图像(HSI)的超分辨率(SR)任务中,传统方法存在光谱信息利用不充分和上采样后产生伪影的问题。研究目的:提出E…

QoS质量配置

他们祝你挺拔,再挺拔一点;我只祝你,永远年少,永远一骑当先. 1. QoS的概念 QoS(服务质量) 是指一个网络能够利用各种各样的基础技术向选定的网络通信提供更好 的服务的能力。这些基础技术包括:帧中继(Frame …

【软考网工笔记】操作系统管理与配置——Windows

1-域名解析 Cache 域名解析 Cache 即 DNS 快取,DNS 快取需要应用客户机域名解析服务 DNSClient,其进程名为 svchost.exe -k NetworkService,可以输入命令:net stop dnscache 将其结束。原理是在 Windows 系统中,加入了…

游戏引擎学习第72天

无论如何,我们今天有一些调试工作要做,因为昨天做了一些修改,结果没有时间进行调试和处理。我们知道自己还有一些需要解决的问题,却没有及时完成,所以我们想继续进行这些调试。对我们来说,拖延调试工作总是…

sublime text for mac 如何在一行末尾添加内容或符号

在Sublime Text for Mac中,你可以通过以下几种方法在一行的末尾添加内容符 使用快捷键和方向键‌: 1、首先,选中要操作的行(全选按⌘CommandA)。 2、然后,使用快捷键⌘Command⇧ShiftL进入待操作状态&am…