建站工具官网,遵化市城乡建设规划局网站,seo快排软件,阿里巴巴网页设计教程笔记为自我总结整理的学习笔记#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接#xff1a; http://t.csdnimg.cn/dscW7 pytorch——常用工具模块 数据处理 torch.utils.data模块DatasetDataLoadersamplertorch.utils.data的使用 计算机视觉工具包 torchvisiontorchvision.d… 笔记为自我总结整理的学习笔记若有错误欢迎指出哟~ 深度学习专栏链接 http://t.csdnimg.cn/dscW7 pytorch——常用工具模块 数据处理 torch.utils.data模块DatasetDataLoadersamplertorch.utils.data的使用 计算机视觉工具包 torchvisiontorchvision.datasets模块torchvision.transforms模块torchvision.models模块 可视化工具 Visdom两个重要概念Visdom的使用vis.imagevis.text 数据处理 torch.utils.data模块
在解决深度学习问题的过程中往往需要花费大量的精力去处理数据包括图像、文本、语音或其它二进制数据等。数据的处理对训练神经网络来说十分重要良好的数据处理不仅会加速模型训练更会提高模型效果。考虑到这点PyTorch提供了几个高效便捷的工具以便使用者进行数据处理或增强等操作同时可通过并行化加速数据加载。
Dataset 类用于表示数据集可以通过继承这个类来创建自定义的数据集。DataLoader 类用于批量加载数据可以指定批量大小、是否打乱数据等参数。
Dataset
在PyTorch中数据加载可通过自定义的数据集对象。数据集对象被抽象为Dataset类实现自定义的数据集需要继承Dataset并实现两个Python魔法方法
__getitem__返回一条数据或一个样本。obj[index]等价于obj.__getitem__(index)__len__返回样本的数量。len(obj)等价于obj.__len__()
DataLoader
要创建一个 DataLoader我们需要指定以下参数
数据集实例这通常是你自定义的数据集类的实例例如 CustomDataset。批量大小batch_size用于指定每个批量包含的样本数量。是否打乱数据shuffle指定是否在每个 epoch 开始时对数据进行打乱通常在训练过程中会打乱数据而在验证或测试过程中不会。多线程加载num_workers指定用于数据加载的线程数可以加快数据加载速度。
sampler
在 PyTorch 中torch.utils.data.sampler 模块包含了多种用来对数据进行采样的类例如 SequentialSampler、RandomSampler、SubsetRandomSampler 等。这些采样器可以用于创建自定义的数据采样策略以满足不同的训练需求。
下面是一些常用采样器的用法举例
SequentialSampler顺序采样器在每个 epoch 中按顺序遍历整个数据集。
from torch.utils.data import DataLoader, SequentialSampler# 创建顺序采样器
sampler SequentialSampler(dataset)# 使用采样器创建数据加载器
data_loader DataLoader(dataset, batch_size32, samplersampler)RandomSampler随机采样器每个 epoch 随机对数据集进行采样。
from torch.utils.data import DataLoader, RandomSampler# 创建随机采样器
sampler RandomSampler(dataset, replacementTrue, num_samples100)# 使用采样器创建数据加载器
data_loader DataLoader(dataset, batch_size32, samplersampler)SubsetRandomSampler从给定索引中随机采样子集。
from torch.utils.data import SubsetRandomSampler# 创建一个索引列表
indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 使用随机子集采样器创建数据加载器
sampler SubsetRandomSampler(indices)
data_loader DataLoader(dataset, batch_size32, samplersampler)WeightedRandomSampler加权随机采样允许根据每个样本的权重来进行采样从而更灵活地处理不平衡的数据集。这在处理类别不平衡、稀有事件或其他特定情况下非常有用。
from torch.utils.data import DataLoader, WeightedRandomSampler# 假设有一个数据集和对应的样本权重
dataset YourDataset()
weights [0.1, 0.5, 0.8, 0.3, 0.6] # 每个样本的权重# 创建加权随机采样器
sampler WeightedRandomSampler(weights, num_samples10, replacementTrue)# 使用采样器创建数据加载器
data_loader DataLoader(dataset, batch_size32, samplersampler)在这个示例中WeightedRandomSampler 接受一个权重列表作为输入并可以指定采样的样本数目和是否使用放回抽样replacementTrue 表示可以重复采样同一个样本。
这些示例展示了如何使用不同的采样器来创建数据加载器并指定不同的采样策略。可以根据具体的训练需求选择合适的采样器并结合数据加载器来灵活地管理数据的采样和训练过程。
torch.utils.data的使用
假设有一个包含图像数据和对应标签的数据集将创建一个自定义的数据集类来加载这些数据并使用 DataLoader 来批量加载数据供模型训练使用。
import torch
from torch.utils.data import Dataset, DataLoader# 假设你有图像数据和对应标签的数据集
class CustomDataset(Dataset):def __init__(self, data, targets, transformNone):self.data dataself.targets targetsself.transform transformdef __len__(self):return len(self.data)def __getitem__(self, index):x self.data[index]y self.targets[index]if self.transform:x self.transform(x)return x, y# 创建数据集实例
# 假设 data 和 targets 是你的图像数据和对应标签
custom_dataset CustomDataset(data, targets, transformyour_transforms)# 使用 DataLoader 批量加载数据
batch_size 32
shuffle True
num_workers 4 # 可以加快数据加载速度的线程数data_loader DataLoader(custom_dataset, batch_sizebatch_size, shuffleshuffle, num_workersnum_workers)# 遍历数据加载器获取批量数据
for inputs, labels in data_loader:# 在这里执行模型训练或推理pass
创建了一个自定义的数据集类 CustomDataset该类继承自 torch.utils.data.Dataset并实现了 len 和 getitem 方法。创建了数据集实例 custom_dataset并使用 DataLoader 实例 data_loader 批量加载数据。通过遍历数据加载器可以获取批量的输入数据和对应的标签用于模型的训练或推理过程。
计算机视觉工具包 torchvision
PyTorch 的计算机视觉工具包 torchvision 提供了一系列用于图像处理和计算机视觉任务的工具和数据集。它包含了常用的数据集如 ImageNet、CIFAR10、COCO 等、图像变换操作、模型架构以及预训练的模型等功能方便用户快速构建和训练计算机视觉模型。
以下是 torchvision 中一些常用的功能和模块 数据集和数据加载器torchvision.datasets 模块提供了常用的图像数据集例如 CIFAR, COCO, MNIST 等并且可以通过 torchvision.transforms 模块中的图像变换操作对数据进行预处理。同时torchvision.transforms 还提供了各种图像变换操作如裁剪、缩放、翻转等用于数据增强和预处理。 模型架构和预训练模型torchvision.models 模块包含了一些经典的计算机视觉模型如 ResNet、VGG、AlexNet 等同时还提供了这些模型在 ImageNet 数据集上预训练的参数。这些预训练模型可以用于迁移学习或者基准测试。 图像工具函数torchvision.utils 模块中提供了一些图像操作的工具函数比如保存图像、绘制边界框、可视化图像等功能。
使用 torchvision 可以大大简化计算机视觉任务的开发过程提高开发效率特别是在处理图像数据、构建模型、模型评估等方面提供了很多便利。
torchvision.datasets模块
torchvision.datasets 模块是 PyTorch 中用于加载和处理常见图像数据集的模块。这个模块提供了许多流行的图像数据集使得用户可以轻松地获取这些数据集并用于模型训练和评估。
一些常见的数据集包括 MNIST: 包含手写数字图片的数据集常用于图像分类任务。 CIFAR10 和 CIFAR100: 分别包含 10 个类别和 100 个类别的彩色图片数据集也用于图像分类任务。 ImageNet: 包含数百万张图片涵盖了数千个类别常用于大规模图像分类和目标检测任务。 COCO (Common Objects in COntext): 包含了大量的标注的图像用于目标检测、实例分割等任务。
torchvision.datasets 不仅提供了这些数据集的接口还提供了数据加载器data loader从而可以方便地将数据集加载到模型中进行训练和测试。
使用 torchvision.datasets我们可以通过几行简单的代码来加载这些数据集并且可以对数据进行预处理、数据增强等操作为模型训练提供方便。
例如以下是使用 torchvision.datasets 加载 CIFAR-10 数据集的示例代码
import torchvision
import torchvision.transforms as transforms# 定义数据转换操作
transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载训练集和测试集
trainset torchvision.datasets.CIFAR10(root./data, trainTrue,downloadTrue, transformtransform)
testset torchvision.datasets.CIFAR10(root./data, trainFalse,downloadTrue, transformtransform)这样就可以轻松地获取 CIFAR-10 数据集并且进行相应的数据预处理为模型训练做准备。
torchvision.transforms模块
transforms 模块是 PyTorch 中 torchvision 库的一部分它提供了各种图像预处理和数据增强的函数用于在训练神经网络时对图像数据进行处理。
以下是 transforms 模块中常用的一些函数 Pad(padding, fill0, padding_modeconstant)对图像进行填充。 ToTensor()将 PIL 图像或 ndarray 转换为 tensor并且将数值范围缩放到 [0, 1] 或 [-1, 1]。 Normalize(mean, std)对 tensor 进行标准化减去均值然后除以标准差。这个操作通常用于对输入数据进行归一化处理。 Resize(size)调整图像大小为指定的尺寸。 RandomHorizontalFlip()随机水平翻转图像用于数据增强。 RandomVerticalFlip()随机垂直翻转图像用于数据增强。 RandomRotation(degrees)随机旋转图像一定角度用于数据增强。 RandomCrop(size)随机裁剪图像到指定的尺寸用于数据增强。 ColorJitter(brightness0, contrast0, saturation0, hue0)随机改变图像的亮度、对比度、饱和度和色相用于数据增强。 ToPILImage()将张量tensor转换为 PIL 图像格式
这些函数可以通过 transforms.Compose() 组合在一起构成一个图像预处理流水线然后应用于加载的图像数据上以便在训练神经网络时进行数据处理和增强。
import torchvision.transforms as transforms
from PIL import Image# 加载图像
image_path data/dogcat/cat.12484.jpg
image Image.open(image_path)
image.show()# 定义图像变换操作
transform transforms.Compose([transforms.Pad(padding10, fill0, padding_modeconstant), # 填充操作transforms.Resize(256), # 调整图像大小为 256x256transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.RandomVerticalFlip(), # 随机垂直翻转transforms.RandomRotation(degrees45), # 随机旋转图像最多45度transforms.RandomCrop(224), # 随机裁剪图像到224x224#transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.1), # 颜色增强transforms.ToTensor(), # 转换为张量#transforms.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]), # 标准化
])# 应用图像变换操作
transformed_image transform(image)# 显示处理后的图像
transforms.ToPILImage()(transformed_image).show() torchvision.models模块
torchvision.models 模块提供了在 PyTorch 中使用的一系列经典的预训练模型例如 ResNet、VGG、AlexNet、GoogLeNet 等。这些预训练模型可以用于图像分类、目标检测、语义分割等任务并且方便用户进行迁移学习或微调。
使用 torchvision.models 模块我们可以轻松地访问这些经典模型并且可以加载预训练的权重参数从而在自己的数据集上进行模型训练或推理。
以下是一些常用的预训练模型 ResNet: 包括 ResNet-18、ResNet-34、ResNet-50 等不同深度的 ResNet 模型用于图像分类任务。 VGG: 包括 VGG-11、VGG-16、VGG-19 等不同深度的 VGG 模型也用于图像分类任务。 AlexNet: AlexNet 是一个较早期的深度卷积神经网络模型也常用于图像分类任务。 GoogLeNet: GoogLeNet 是由 Google 提出的深度卷积神经网络适用于图像分类和目标检测任务。 DenseNet: 密集连接网络DenseNet是另一个流行的卷积神经网络结构适用于图像分类和其他计算机视觉任务。
通过 torchvision.models我们可以很方便地加载这些模型并且可以直接用于自己的任务或者进行进一步的微调以适应特定的数据集和任务需求。
以下是一个示例展示了如何使用 torchvision.models 加载预训练的 ResNet-18 模型
import torchvision.models as models# 加载预训练的 ResNet-18 模型
resnet18 models.resnet18(pretrainedTrue)# 对模型进行微调或者用于推理可视化工具 Visdom
Visdom 官方文档https://github.com/fossasia/visdom
Visdom 是一个用于创建实时交互式可视化的工具最初是由 Facebook 的人工智能研究团队开发的其开源于2017年3月用于支持深度学习模型的可视化和监控。它提供了一个基于 Web 的用户界面允许用户在浏览器中实时查看和操作可视化结果。Visdom 主要针对 PyTorch 和 Torch 等深度学习框架但也可以与其他框架集成使用。
Visdom 的主要特点包括 实时交互式可视化Visdom 支持实时更新可视化结果并且允许用户通过简单的交互方式进行操作如缩放、平移、标注等从而更好地理解数据和模型的行为。 多种类型的可视化Visdom 提供了多种类型的可视化工具包括折线图、条形图、散点图、热力图、直方图、图像等满足了不同类型数据的可视化需求。 多用户支持Visdom 支持多用户共享可视化结果多个用户可以同时查看和操作可视化数据这在团队协作以及教学研究方面非常有用。 语言无关性Visdom 可以与多种编程语言进行集成尤其是在 Python 和 Lua 等语言中应用较为广泛。 灵活的部署方式Visdom 可以作为一个独立的服务器运行也可以嵌入到现有的 Python 代码中使得可视化过程更加灵活和定制化。
总的来说Visdom 是一个功能强大、易于使用的可视化工具特别适用于深度学习模型的训练过程监控、结果展示以及模型行为分析。通过实时交互式的可视化用户可以更好地理解和优化他们的深度学习模型。
两个重要概念
在 Visdom 中有两个重要的概念窗口window和环境environment。 窗口Window 在 Visdom 中窗口是指用户界面中的一个可视化区域用于展示特定类型的数据可视化结果比如折线图、散点图、图像等。每个窗口都有一个唯一的标识符可以通过这个标识符来更新或关闭窗口中的内容。用户可以在同一环境下创建多个窗口用于同时展示不同类型的数据可视化结果比如训练损失曲线、模型预测结果等。 环境Environment 环境是 Visdom 中用于组织窗口的概念可以理解为一个命名空间用于区分不同类型或不同任务的可视化结果。不同环境的可视化结果相互隔离互不影响在使用时如果不指定env默认使用main。不同用户、不同程序一般使用不同的env。
这两个概念的引入使得 Visdom 在展示和组织数据可视化结果时更加灵活和清晰同时也方便用户对不同类型的数据进行管理和交互操作。
Visdom的使用
要使用 Visdom 进行可视化您需要按照以下步骤进行设置和操作 安装 Visdom 首先您需要在您的环境中安装 Visdom。可以使用以下命令使用 pip 安装 Visdom 库 pip install visdom启动 Visdom 服务器 在安装完成后您需要启动 Visdom 服务器。可以在终端中运行以下命令启动服务器 python -m visdom.server这将在本地启动一个 Visdom 服务器并显示服务器的 URL 地址默认为 http://localhost:8097。 连接到 Visdom 服务器 在您的 Python 脚本中您需要导入 Visdom 库并连接到正在运行的 Visdom 服务器。可以使用以下代码片段连接到服务器 import visdom# 创建 Visdom 客户端对象
vis visdom.Visdom()此时您的客户端将通过默认的本地连接地址连接到 Visdom 服务器。 创建窗口并显示数据 您可以使用 Visdom 客户端对象创建窗口并将数据显示在窗口中。以下是一个简单的示例展示如何在折线图窗口中显示一些数据 import visdom# 创建 Visdom 客户端对象
vis visdom.Visdom()# 创建折线图窗口并显示数据
vis.line(Y[0], X[0], winmy_plot, optsdict(titleMy Plot))
vis.line(Y[4, 2, 3], X[1, 2, 3], winmy_plot, updateappend)这将创建一个名为 “my_plot” 的折线图窗口并在窗口中显示数据点 (1, 4)(2, 2)(3, 3)。之后您可以通过不断更新数据来更新窗口中的图表。
这只是一个简单的使用示例Visdom 还提供了许多其他类型的窗口和选项用于展示和操作各种类型的数据。
import torch as t
import visdom# 新建一个连接客户端
# 指定env utest1默认端口为8097host是‘localhost
vis visdom.Visdom(envutest1,use_incoming_socketFalse)x t.arange(1, 30, 0.01)
y t.sin(x)
vis.line(Xx, Yy, winsinx, opts{title: ysin(x)})vis visdom.Visdom(envu’test1’)用于构建一个客户端客户端除指定env之外还可以指定host、port等参数。 vis作为一个客户端对象可以使用常见的画图函数包括 line类似Matlab中的plot操作用于记录某些标量的变化如损失、准确率等image可视化图片可以是输入的图片也可以是GAN生成的图片还可以是卷积核的信息text用于记录日志等文字信息支持html格式histgram可视化分布主要是查看数据、参数的分布scatter绘制散点图bar绘制柱状图pie绘制饼状图
Visdom同时支持PyTorch的tensor和Numpy的ndarray两种数据结构但不支持Python的int、float等类型因此每次传入时都需先将数据转成ndarray或tensor。上述操作的参数一般不同但有两个参数是绝大多数操作都具备的
win用于指定pane的名字如果不指定visdom将自动分配一个新的pane。如果两次操作指定的win名字一样新的操作将覆盖当前pane的内容因此建议每次操作都重新指定win。opts选项接收一个字典常见的option包括title、xlabel、ylabel、width等主要用于设置pane的显示格式。
往往我们在训练网络的过程中需不断更新数值如损失值等这时就需要指定参数updateappend来避免覆盖之前的数值。
import torch as t
import visdom# 新建一个连接客户端
# 指定env utest1默认端口为8097host是‘localhost
vis visdom.Visdom(envutest1,use_incoming_socketFalse)# append 追加数据
for ii in range(0, 10):# y xx t.Tensor([ii])y xvis.line(Xx, Yy, winpolynomial,nameTrace, updateappend if ii0 else None)# updateTrace 新增一条线
x t.arange(0, 9, 0.1)
y (x ** 2) / 9
vis.line(Xx, Yy, winpolynomial, namethis is a new Trace,updatenew)vis.image
image接收一个二维或三维向量 H × W H\times W H×W或 3 × H × W 3 \times H\times W 3×H×W前者是黑白图像后者是彩色图像。images接收一个四维向量 N × C × H × W N\times C\times H\times W N×C×H×W C C C可以是1或3分别代表黑白和彩色图像。可实现类似torchvision中make_grid的功能将多张图片拼接在一起。images也可以接收一个二维或三维的向量此时它所实现的功能与image一致。
import torch as t
import visdom# 新建一个连接客户端
# 指定env utest1默认端口为8097host是‘localhost
vis visdom.Visdom(envutest,use_incoming_socketFalse)# 可视化一个随机的黑白图片
vis.image(t.randn(64, 64).numpy())# 随机可视化一张彩色图片
vis.image(t.randn(3, 64, 64).numpy(), winrandom2)# 可视化36张随机的彩色图片每一行6张
vis.images(t.randn(36, 3, 64, 64).numpy(), nrow6, winrandom3, opts{title:random_imgs})vis.text
在 Visdom 的 vis.text 函数中可以使用 HTML 标签来自定义文本的样式和布局。以下是一个示例展示如何在 vis.text 中使用不同的 HTML 标签和属性
import visdom# 连接到 Visdom 服务器
viz visdom.Visdom()# 创建一个文本窗口并使用 HTML 标签来设置样式和布局
html_content
h1 stylecolor: red;这是一个标题/h1
p stylefont-size: 20px;这是一个段落/p
ulli列表项1/lili列表项2/lili列表项3/li
/ul
viz.text(html_content)在这个示例中我们使用 HTML 标签和属性来设置文本的样式和布局。通过使用 h1 标签我们将文本设置为红色的标题。使用 p 标签我们将文本设置为字体大小为 20px 的段落。使用 ul 和 li 标签我们创建了一个无序列表。
当调用 viz.text 并传入带有 HTML 标签的文本内容时Visdom 会解析该内容并相应地显示在文本窗口中。
请注意有些 HTML 标签和属性可能在 Visdom 中不被完全支持或者显示效果可能会因浏览器兼容性而有所区别。