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

这篇具有很好参考价值的文章主要介绍了【PyTorch】第八节:数据的预处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

专栏🎇:PyTorch

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

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

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

介绍💬

  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)

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

        接下来,让我们来定义数据的转化操作,即将原数据类型转为 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)

【PyTorch】第八节:数据的预处理​         最后,让我们使用这两个预处理操作,来处理葡萄酒数据。

        我们无需修改上面代码,只需将其封装到 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 类型的数据集的预处理。当然,除了自定义的预处理方法外,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)

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

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

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

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

         改变图片的亮度、对比度和饱和度: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()

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

 将图像转为灰度图像: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)

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

         使用给定的 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)

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

         保持图像中心不变的中心仿射变换(可以理解为不同程度的旋转,再在空余位置补 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()

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

         将原图像进行随机裁剪、裁剪后重新放缩到 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)

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

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

实验总结🔑

        本实验详细的阐述了 torchvision.transforms 的使用方法和 torchvision.transforms 中内置的图像处理函数。这些预处理操作时非常重要的,一系列好的数据预处理操作,可以大大的加快模型的收敛速度,提高模型的准确率和鲁棒性。文章来源地址https://www.toymoban.com/news/detail-422228.html

到了这里,关于【PyTorch】第八节:数据的预处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <2>【深度学习 × PyTorch】pandas | 数据预处理 | 处理缺失值:插值法 | networkx模块绘制知识图谱 | 线性代数初步

      你永远不可能真正的去了解一个人,除非你穿过ta的鞋子,走过ta走过的路,站在ta的角度思考问题,可当你真正走过ta走过的路时,你连路过都会觉得难过。有时候你所看到的,并非事实真相,你了解的,不过是浮在水面上的冰山一角。—————《杀死一只知更鸟》   🎯

    2024年02月01日
    浏览(49)
  • 【3D 图像分割】基于 Pytorch 的 3D 图像分割6(数据预处理之LIDC-IDRI 标签 xml 标签转储及标记次数统计 )

    由于之前哔站作者整理的 LUNA16 数据处理方式过于的繁琐,于是,本文就对 LUNA16 数据做一个新的整理,最终得到的数据和形式是差不多的。但是,主要不同的是代码逻辑比较的简单,便于理解。 对于 LUNA16 数据集的学习,可以去参考这里:【3D 图像分类】基于 Pytorch 的 3D 立

    2024年02月04日
    浏览(52)
  • Pytorch学习笔记(3):图像的预处理(transforms)

      目录  一、torchvision:计算机视觉工具包  二、transforms的运行机制 (1)torchvision.transforms:常用的图像预处理方法 (2)transforms运行原理   三、数据标准化 transforms.Normalize() 四、数据增强  4.1 transforms—数据裁剪 (1)transforms.CentorCrop (2)transforms.RandomCrop (3)RandomResiz

    2023年04月13日
    浏览(46)
  • 使用 Monai 和 PyTorch 预处理 3D Volumes以进行肿瘤分割

    针对在使用传统图像处理工具时可能遇到的困难,深度学习已成为医疗保健领域的主要解决方案。 因为医学图像比标准图像更难处理(高对比度、人体的广泛变化……)深度学习用于分类、对象检测,尤其是分割任务。 在分割方面,深度学习用于分割人体器官,如肝脏、肺

    2023年04月11日
    浏览(59)
  • 数据采集与预处理01: 项目1 数据采集与预处理准备

    数据采集:足够的数据量是企业大数据战略建设的基础,因此数据采集成为大数据分析的前站。数据采集是大数据价值挖掘中重要的一环,其后的分析挖掘都建立在数据采集的基础上。大数据技术的意义确实不在于掌握规模庞大的数据信息,而在于对这些数据进行智能处理,

    2024年01月25日
    浏览(65)
  • 数据预处理matlab matlab数据的获取、预处理、统计、可视化、降维

    1.1 从Excel中获取 使用readtable() 例1: 使用 spreadsheetImportOptions(Name,Value) 初步确定导入信息, 再用 opts.Name=Value 的格式添加。 例2: 先初始化 spreadsheetImportOptions 对象, 再用 opts.Name=Value 的格式逐个添加。 例3: 将导入信息存到变量里, 再使用 spreadsheetImportOptions(Name,Value)

    2024年02月15日
    浏览(56)
  • 大数据采集技术与预处理学习一:大数据概念、数据预处理、网络数据采集

    目录 大数据概念: 1.数据采集过程中会采集哪些类型的数据? 2.非结构化数据采集的特点是什么? 3.请阐述传统的数据采集与大数据采集的区别? ​​​​​​​ ​​​​​​​4.大数据采集的数据源有哪些?针对不同的数据源,我们可以采用哪些不同的方法和工具? 数据

    2024年01月25日
    浏览(54)
  • 数据分析--数据预处理

    本文主要是个人的学习笔记总结,数据预处理的基本思路和方法,包括一些方法的使用示例和参数解释,具体的数据预处理案例case详见其他文章。如有错误之处还请指正! 目录 数据的质量评定 数据处理步骤 缺失值的处理 标记缺失值 删除 缺失值 填充 缺失值 重复值处理 异

    2024年02月04日
    浏览(58)
  • 数据预处理之数据规约

    目录 一、前言 二、PCA的主要参数: 三、数据归约任务1 四、数据规约任务2 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构

    2024年02月12日
    浏览(47)
  • 数据清洗和预处理

    预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 3.4 Python的函数和模

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包