【PyTorch】第八节:数据的预处理

news2024/11/16 21:47:44

作者🕵️‍♂️:让机器理解语言か

专栏🎇:PyTorch

描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。

寄语💓:🐾没有白走的路,每一步都算数!🐾 

介绍💬

  torchvision.transforms 是一个包含了常用的图像变化方法的工具包,该工具包主要用于图像预处理、数据增强等工作之中。本实验,将详细介绍 torchvision.transforms 中常用的数据处理函数。

知识点🍉

  • 🍓预处理的批操作:将预处理操作打包  →  预处理集合器
  • 🍓葡萄酒数据的预处理
  • 🍓图像数据的预处理

数据的预处理💎

Compose

        首先让我们先来学习 torchvision.transforms.Compose(),它的参数是一个由多个 transforms 包中的方法组成的列表。简单的说,该函数的主要目的就是将所有的预处理操作进行打包,当有数据来时,我们只需要将数据传入该函数中,就能一次性对数据进行所有的预处理操作。如下:

import torch
import torchvision


class ToTensor:
    # 定义一个将原数据转为 Torch 的操作
    def __call__(self, X):
        return torch.from_numpy(X)


class MulTransform:
    # 定义一个将所有数据翻倍的预处理操作
    def __call__(self, X):
        X *= 2
        return X


# 定义预处理集合器
composed = torchvision.transforms.Compose([ToTensor(), MulTransform()])
composed

"""
Compose(
    <__main__.ToTensor object at 0x7fa24c2c6450>
    <__main__.MulTransform object at 0x7fa24bbfdf90>
)
"""

        上面我们定义了一个预处理的集合器,我们只需要将数据传入 composed 中,PyTorch 就会自动对数据进行 ToTensor() 和 MulTransform() 操作。如下:

import numpy as np
data = np.array([1, 2, 3])
composed(data)
# tensor([2, 4, 6])

        从结果可以看出,尽管我们的数据需要进行很多次预处理,但是我们只需要将这些预处理全部放入 Compose 中进行打包,就能形成一个数据预处理集合。当我们需要处理某些数据时,只需要简单的将数据传入这个集合即可

        接下来,我们以葡萄酒的数据预处理为例,修改上一个试验中的 WineDataset 类,使其能够输出归一化后的 Tensor 数据集。

葡萄酒数据的预处理🍀

首先,还是让我们先来定义数据集合:

from torch.utils.data import Dataset
import pandas as pd


class WineDataset(Dataset):
    # 建立一个数据集合继承  Dataset 即可
    def __init__(self, transform):
        # I初始化数据
        # 以pandas的形式读入数据
        xy = pd.read_csv(
            "https://labfile.oss.aliyuncs.com/courses/2316/wine.csv", header=None)
        self.n_samples = xy.shape[0]

        # 这里我们就不做Tensor的转换了,将其全部放入 transform 中
        self.x_data = xy.values[:, 1:]
        self.y_data = xy.values[:, 0].reshape(-1,1) # 转为二维向量,和x匹配
        # 数据预处理集合
        self.transform = transform

    # 返回 dataset[index]
    def __getitem__(self, index):
        sample = self.x_data[index], self.y_data[index]

        if self.transform:
            sample = self.transform(sample)

        return sample
    # 返回数据长度

    def __len__(self):
        return self.n_samples

        可以看出 WineDataset 类中的代码和上一个试验大致相同,我们只是多加了一个 transform 变量,即数据预处理操作的集合。该变量并没有在 WineDataset 类 中被定义,只是作为一个参数被传入。

        这样做有一个好处就是,当我们需要在原来的基础上添加新的预处理操作时,我们只需要在模型外重新定义 transform 变量即可无需修改原来类中的代码。

        接下来,就让我们来定义预处理操作了。首先,让我们来定义数据的归一化操作,这里使用最大最小归一化:

class Normalization:
    def __call__(self, sample):
        inputs, targets = sample
        amin, amax = inputs.min(), inputs.max()  # 求最大最小值
        inputs = (inputs-amin)/(amax-amin)  # (矩阵元素-最小值)/(最大值-最小值)
        return inputs, targets


# 测试代码
a = 10*np.random.random((5, 5))
# 测试数据 前4列表示特征,最后一列表示标签
data = [a[:, 0:4], a[:, 4]]
Normalization()(data)

​  

        接下来,让我们来定义数据的转化操作,即将原数据类型转为 Tensor :

class ToTensor:
    def __call__(self, sample):
        inputs, targets = sample
        return torch.from_numpy(inputs), torch.from_numpy(targets)


# 测试代码
a = 10*np.random.random((5, 5))
# 测试数据 前4列表示特征,最后一列表示标签
data = [a[:, 0:4], a[:, 4]]
ToTensor()(data)

​         最后,让我们使用这两个预处理操作,来处理葡萄酒数据。

        我们无需修改上面代码,只需将其封装到 Compose 中,再传入即可。

# 定义 composed
composed = torchvision.transforms.Compose([Normalization(), ToTensor()])
# 传入该参数,即可获得一系列预处理之后的数据
dataset = WineDataset(transform=composed)
first_data = dataset[0]
features, labels = first_data
# 输出类型观察数据是否发生改变
print(type(features), type(labels))
# 输出内容观察数据是否进行了归一
print(features, labels)

​         如上,我们使用了自定义的预处理方法,完成了 PyTorch 类型的数据集的预处理。当然,除了自定义的预处理方法外,PyTorch 还为我们提供了很多封装好的预处理操作

图像的预处理🍀

  torchvision.transforms 中有很多关于图像预处理的函数。接下来,让我们对一些常用的图像处理函数进行阐述。如果你需要查看所有的函数,可以访问 官方网址。

为了能够更好的阐述这些函数,让我们以一张图片为例。首先,让我们来加载这张图片:

!wget -nc  "https://labfile.oss.aliyuncs.com/courses/2534/cat.jpg"
import torchvision.transforms as transforms
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
%matplotlib inline
img = Image.open("cat.jpg")
imshow(img)

​ 

         从中心开始,裁剪给定大小的 PIL 图像:transforms.CenterCrop

# torchvision.transforms.CenterCrop(size):从中心开始,裁剪给定大小的 PIL 图像
transform = transforms.CenterCrop((64, 200))
new_img = transform(img)
imshow(new_img)

​ 

         改变图片的亮度、对比度和饱和度:transforms.ColorJitter

# transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0):
# 改变图片的亮度、对比度和饱和度
plt.subplot(221)
imshow(img)
# r随机改变亮度
my_img1 = transforms.ColorJitter((0.5, 0.6))(img)
plt.subplot(222)
imshow(my_img1)
# 随机改变对比度
my_img2 = transforms.ColorJitter(0, (0.5, 0.6))(img)
plt.subplot(223)
imshow(my_img2)
# 随机改变饱和度
my_img3 = transforms.ColorJitter(0, 0, (0.5, 0.6))(img)
plt.subplot(224)
imshow(my_img3)
plt.show()

​ 

 将图像转为灰度图像:torchvision.transforms.Grayscale(num_output_channels )

  • 如果返回的图像是单通道 num_output_channels = 1。
  • 如果返回的图像是 3 通道,其中 num_output_channels = 3。
plt.subplot(1, 3, 1)
imshow(img)
my_img1 = transforms.Grayscale(1)(img)
plt.subplot(132)
imshow(my_img1, 'gray')
my_img2 = transforms.Grayscale(3)(img)
plt.subplot(133)
imshow(my_img2)

​ 

         使用给定的 pad 值将给定的 PIL 图像四处填充:ransforms.Pad(padding,fill,padding_mode)

# transforms.Pad(padding,fill = 0,padding_mode ='constant' ):
# 使用给定的 pad 值将给定的 PIL 图像四处填充
plt.subplot(121)
imshow(img)
# 四周加边界
my_img = transforms.Pad(padding=20, fill=(0, 255, 255),
                        padding_mode='constant')(img)
plt.subplot(122).set_title("Pad")
imshow(my_img)

​ 

         保持图像中心不变的中心仿射变换(可以理解为不同程度的旋转,再在空余位置补 0):transforms.RandomAffine (degrees, translate, scale, shear, resample, fillcolor)

# transforms.RandomAffine(degrees, translate=None, scale=None,
#                       shear=None, resample=False, fillcolor=0):
# 保持图像中心不变的中心仿射变换(可以理解为不同程度的旋转,再在空余位置补 0)
my_img1 = transforms.RandomAffine(60)(img)
plt.subplot(221).set_title("rotate_only")
imshow(my_img1)
my_img2 = transforms.RandomAffine(60, translate=(0.3, 0.3))(img)
plt.subplot(222).set_title("rotate_translate")
imshow(my_img2)
my_img3 = transforms.RandomAffine(60, scale=(2.0, 2.1))(img)
plt.subplot(223).set_title("rotate_scale")
imshow(my_img3)
my_img4 = transforms.RandomAffine(0, shear=60)(img)
plt.subplot(224).set_title("shear_only")
imshow(my_img4)
plt.tight_layout()

​ 

         将原图像进行随机裁剪、裁剪后重新放缩到 size 大小:torchvision.transforms.RandomResizedCrop(size, scale,ratio,interpolation)

#torchvision.transforms.RandomResizedCrop(size, scale,ratio,interpolation)
new_img = transforms.RandomResizedCrop((128, 126), scale=(0.08, 1.0),
                                       ratio=(0.75, 1.333333333), interpolation=2)(img)
imshow(new_img)

​ 

         当然除了上面这些相关图像的处理外,torchvision.transforms 中还有很多图像处理的函数,你可以按照上面代码的思路对其他函数进行检验。官方 API 请点击这里。

实验总结🔑

        本实验详细的阐述了 torchvision.transforms 的使用方法和 torchvision.transforms 中内置的图像处理函数。这些预处理操作时非常重要的,一系列好的数据预处理操作,可以大大的加快模型的收敛速度,提高模型的准确率和鲁棒性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NVIDIA GPU 入门】综述

系列文章目录 文章目录系列文章目录前言一、概述二、GPU架构基础2.1 GPU概述2.2 GPU的架构2.3 自主查询GPU相关信息三、CUDA编程概念3.1 CUDA线程模型3.1 线程层次结构1.引入库2.读入数据总结参考文献前言 GPU作为机器学习的基础运算设备&#xff0c;基本上是无人不知无人不晓。…

【bsauce读论文】PSPRAY-基于时序侧信道的Linux内核堆利用技术

会议&#xff1a;USENIX Security’23 作者&#xff1a;来自 Seoul National University 的 Yoochan Lee、Byoungyoung Lee 等人。 主要内容&#xff1a;由于Linux内核的堆分配器SLUB开启的freelist随机化保护&#xff0c;所以堆相关的内核漏洞利用成功率较低&#xff08;平均…

BEV(一)---lift splat shoot

1. 算法原理 1.1 2D坐标与3D坐标的关系 如图&#xff0c;已知世界坐标系上的某点P&#xff08;Xc&#xff0c; Yc&#xff0c; Zc&#xff09;经过相机的内参矩阵可以获得唯一的图像坐标p&#xff08;x&#xff0c; y&#xff09;&#xff0c;但是反过来已知图像上某点p&…

软考初级程序员--学习

1、十进制 转 二进制 1.1、整数十进制87 转换为 二进制为 1010111 1.2 、小数十进制0.125 转为 二进制 为 0.001 使用乘2取整法&#xff0c;一直乘到没有小数 2、二进制 转 十进制 2.1、二进制1010111 转换为 十进制 2.2、 二进制小数0.001 转 十进制 3、循环队列 计算长度通用…

周赛341(模拟、双指针、树上DP)

文章目录周赛341[6376. 一最多的行](https://leetcode.cn/problems/row-with-maximum-ones/)暴力模拟[6350. 找出可整除性得分最大的整数](https://leetcode.cn/problems/find-the-maximum-divisibility-score/)暴力模拟[6375. 构造有效字符串的最少插入数](https://leetcode.c…

JVM系统优化实践(15):GC可视化工具实践

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 线上系统的JVM监测要么使用jstat、jmap、jhat等工具查看JVM状态&#xff0c;或者使用监控系统&#xff0c;如Zabbix、Prometheus、Open-FaIcon、Ganglia等。作为…

pyg的NeighborLoader和LinkNeighborLoader

NeighborLoader 1 数据格式要求 需要传入加载的属性值&#xff1a; class NeighborLoader(data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], num_neighbors: Union[List[int], Dict[Tuple[str, str, str], List[int]]], input_nodes: Union[Tensor, None…

进程调度的基本过程

进程调度的基本过程&#x1f50e; 进程是什么&#x1f50e; 进程管理&#x1f50e; 进程中结构体的属性进程标识符(PID)内存指针文件描述符表结构体中与进程调度相关的属性进程的状态进程的优先级进程的上下文进程的记账信息&#x1f50e; 总结&#x1f50e; 结尾&#x1f50e;…

(第十四届蓝桥真题) 整数删除(线段树+二分)

样例输入&#xff1a; 5 3 1 4 2 8 7 样例输出&#xff1a; 17 分析&#xff1a;这道题我想的比较复杂&#xff0c;不过复杂度还是够用的&#xff0c;我是用线段树二分来做的。 我们用线段树维护所有位置的最小值&#xff0c;那么我们每次删除一个数之前先求一遍最小值&a…

停车场管理系统文件录入(C++版)

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; 文章目录一、案例需求描述1.1、汽车信息模块1.2、普通用户模块1.3、管理员用户模块二、案例分析三…

mysql:使用终端操作数据库

登录进入终端&#xff1a; mysql -u root -p 展示数据库 SHOW DATABASES; 创建数据库&#xff1a; CREATE DATABASE IF NOT EXISTS RUNOOB_TEST DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 1. 如果数据库不存在则创建&#xff0c;存在则不创建。 2. 创建RUNOOB_TEST数据库…

ElasticSearch安装、启动、操作及概念简介

ElasticSearch快速入门 文件链接&#xff1a;https://pan.baidu.com/s/15kJtcHY-RAY3wzpJZIn4-w?pwd0k5a 提取码&#xff1a;0k5a 有些软件对于安装路径有一定的要求&#xff0c;例如&#xff1a;路径中不能有空格&#xff0c;不能有中文&#xff0c;不能有特殊符号&#xf…

JUC并发编程之ReentrantLock

1. 非公平锁实现原理 加锁解锁流程 构造器默认实现的是非公平锁 public ReentrantLock() {sync new NonfairSync();}NonfairSync 继承 Sync&#xff0c; Sync 继承 AbstractQueuedSynchronizer 没有竞争时 第一个竞争出现时 Thread-1 执行了 CAS 尝试将state 由 0 改为 1&…

Stable Diffusion免费(三个月)通过阿里云轻松部署服务

温馨提示&#xff1a;划重点&#xff0c;活动入口在这里喔&#xff0c;不要迷路了。 其实我就在AIGC_有没有一种可能&#xff0c;其实你早就在AIGC了&#xff1f;阿里云邀请你&#xff0c;体验一把AIGC级的毕加索、达芬奇、梵高等大师作画的快感。阿里云将提供免费云产品资源&…

如何使用evosuite为指定被测方法生成测试用例

目录 省流版本 准备工作 环境 evosuite获取 检验环境 参数解释 怎样表示被测方法 怎样指向被测类 其他参数 参考 省流版本 java -jar .\target\depd\evosuite-1.1.0.jar -generateTests -Dtarget_method"isLenient()Z" -class com.google.gson.stream.…

Midjourney教程(二)——Prompt基本结构

Midjourney教程——Prompt基本结构 Basic Prompt 基础版本的prompt仅仅包含图片的描述&#xff0c;能够满足普通的需求&#xff0c;如下图所示 Advanced Prompt 高级版本的prompt主要包含三个部分&#xff0c;如下图所示 Image Prompts(可选) prompt第一部分是Image&#x…

TCP/IP协议详解

一.引言TCP/IP 是 TCP 和 IP 两种协议群的统称&#xff0c;具体来说&#xff0c;IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议二.计算机网络体系结构分层计算机网络体系结构分层计算机网络体系结构分层不难看出&#xff0c;TCP/IP 与 OSI 在分层模块…

【C语言】迷宫问题

【C语言】迷宫问题一. 题目描述二. 思想2.1 算法---回溯算法2.2 思路分析图解三. 代码实现3.1 二维数组的实现3.2 上下左右四个方向的判断3.4 用栈记录坐标的实现3.5 完整代码四. 总结一. 题目描述 牛客网链接&#xff1a;https://www.nowcoder.com/questionTerminal/cf2490605…

STM32看门狗

目录 独立看门狗 IWDG 什么是看门狗&#xff1f; 独立看门狗本质 独立看门狗框图 独立看门狗时钟 分频系数算法&#xff1a; ​编辑 重装载寄存器 键寄存器 溢出时间计算公式 独立看门狗实验 需求&#xff1a; 硬件接线&#xff1a; 溢出时间计算&#xff1…

macOS设置环境变量和别名

因为我的mac所用shell是bash&#xff0c;所以本文中涉及的环境变量和别名配置均在~/.zshrc文件中,且在每次配置完成后&#xff0c;需要执行source ~/.zshrc命令使配置文件生效 环境变量 通过配置环境变量&#xff0c;我们可以将某个路径暴露到全局&#xff0c;这样可以在全局…