PyTorch(四)数据转换与构建神经网络

#c 总结 文档总结

文档目录:

  1. 数据转换:主要讲解「transforms」,涉及到的知识点有「匿名函数」,「对象自调用」

  2. 创建神经模型:涉及的知识点有「加速训练」「神经网络定义」「调用神经网络」「模型层」「模型参数」

1 数据转换(Transforms)

#c 说明 转换的目的

数据并不总是以「训练机器学习算法」所需的最终处理形式出现。使用转换(transforms)来执行数据的「一些操作」,使其适合训练。

#e TorchVision中的转换 转换的目的

所有TorchVision数据集都有两个参数:
transform用于修改特征。
target_transform用于修改标签,它们接受包含转换逻辑的可调用对象。

#e FashionMNIST转换

FashionMNIST的特征数据以PIL图像格式存在,标签是整数。为了训练,需要将「特征」转换为使用的的「张量形式」,并将标签转换为one-hot编码的张量。使用ToTensorLambda实现这些转换。

import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
ds = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
    target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))    
)
'''
    target_transform参数用于对目标(标签)进行转换。
    lamdba:定义一个匿名函数,y是函数的参数
    torch.zeros(10, dtype=torch.float)创建一个长度为10,数据类型为float的零向量
    .scatter_(0, torch.tensor(y), value=1)就地操作,在零向量的y索引的位置上的值设置为1,设置一个one-hot编码
    '''

#d 匿名函数

匿名函数,通常在Python中通过lambda关键字定义,是一种没有名称的简单函数。它们通常用于执行简短的、一次性的任务,特别是在需要函数对象的地方,但又不想使用完整的函数定义语法,是一个非常有用的工具,它提供了一种快速定义简单函数的方式,使得代码更加简洁,增加了编程的灵活性。

匿名函数的主要属性和特点包括:

  1. 没有名称:正如“匿名”所暗示的,这类函数没有名称。
  2. 简洁的定义:通常只有一行代码,适用于简单的逻辑。
  3. 自动返回值lambda表达式的结果自动成为返回值,无需显式使用return语句。
  4. 可接受任意数量的参数:但只能有一个表达式。

创造「匿名函数」的目的

  • 简化代码:对于简单的函数,使用lambda可以避免定义标准的函数,从而减少代码量。
  • 功能性编程lambda表达式支持函数式编程范式,在处理高阶函数和操作(如mapfiltersorted等)时非常有用。

没有这个概念「匿名函数」有什么影响

  • 代码冗长:对于需要传递简单函数作为参数的场合,如果没有匿名函数,就需要定义标准的函数。这会使得代码变得更加冗长,特别是当这个函数只需要在一个地方使用时。
  • 减少灵活性:在某些情况下,使用匿名函数可以使代码更加灵活和简洁。没有匿名函数,某些编程模式(如即时使用的小函数作为参数传递)会更加复杂。
  • 降低可读性:虽然过度使用lambda可能会降低代码的可读性,但在适当的场合使用它们可以使代码更加直观。没有lambda表达式,对于那些最适合使用匿名函数的场景,代码可能会变得更难理解。

#e 快速决策 匿名函数

想象你在一个快餐店,需要快速决定每个人的饮料。你可以为每个人设置一个简单的规则(匿名函数):如果某人喜欢甜的,就选择可乐;如果不喜欢甜的,就选择无糖的绿茶。

在这个例子中,「决策规则」就像一个匿名函数,它根据一个「输入」(是否喜欢甜的)来快速决定「输出」(选择哪种饮料)。虽然这不是编程中的直接应用,但它展示了匿名函数概念的一个类比——根据输入快速产生输出,而不需要为这个决策过程命名或详细定义。

#e 列表排顺 匿名函数

在Python中,我们经常需要根据列表中元素的「某个属性」或「值」来对列表进行排序。使用lambda表达式,我们可以轻松地定义排序的关键字。
在这个例子中,lambda x: x[1]是一个匿名函数,它接受一个参数x(在这里是列表中的一个元组)并返回「元组」的第二个元素作为排序的依据。

# 根据元组的第二个元素进行排序
tuples = [(1, 'banana'), (2, 'apple'), (3, 'cherry')]
tuples.sort(key=lambda x: x[1])
print(tuples)  # 输出: [(2, 'apple'), (1, 'banana'), (3, 'cherry')]

#e filter()函数 匿名函数

filter()函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器。使用lambda表达式,我们可以定义过滤的条件。
这里,lambda x: x % 2 == 0是一个匿名函数,它接受一个参数x并检查x是否为偶数。filter()函数使用这个匿名函数来决定哪些元素应该被包含在结果列表中。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

remandancy.h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值