#c 总结 文档总结
文档目录:
-
数据转换:主要讲解「transforms」,涉及到的知识点有「匿名函数」,「对象自调用」
-
创建神经模型:涉及的知识点有「加速训练」「神经网络定义」「调用神经网络」「模型层」「模型参数」
1 数据转换(Transforms)
#c 说明 转换的目的
数据并不总是以「训练机器学习算法」所需的最终处理形式出现。使用转换(transforms)来执行数据的「一些操作」,使其适合训练。
#e TorchVision
中的转换 转换的目的
所有TorchVision数据集都有两个参数:
transform
用于修改特征。
target_transform
用于修改标签,它们接受包含转换逻辑的可调用对象。
#e FashionMNIST
转换
FashionMNIST的特征数据以PIL图像格式存在,标签是整数。为了训练,需要将「特征」转换为使用的的「张量形式」,并将标签转换为one-hot
编码的张量。使用ToTensor
和Lambda
实现这些转换。
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
关键字定义,是一种没有名称的简单函数。它们通常用于执行简短的、一次性的任务,特别是在需要函数对象的地方,但又不想使用完整的函数定义语法,是一个非常有用的工具,它提供了一种快速定义简单函数的方式,使得代码更加简洁,增加了编程的灵活性。
匿名函数的主要属性和特点包括:
- 没有名称:正如“匿名”所暗示的,这类函数没有名称。
- 简洁的定义:通常只有一行代码,适用于简单的逻辑。
- 自动返回值:
lambda
表达式的结果自动成为返回值,无需显式使用return
语句。 - 可接受任意数量的参数:但只能有一个表达式。
创造「匿名函数」的目的:
- 简化代码:对于简单的函数,使用
lambda
可以避免定义标准的函数,从而减少代码量。 - 功能性编程:
lambda
表达式支持函数式编程范式,在处理高阶函数和操作(如map
、filter
、sorted
等)时非常有用。
没有这个概念「匿名函数」有什么影响:
- 代码冗长:对于需要传递简单函数作为参数的场合,如果没有匿名函数,就需要定义标准的函数。这会使得代码变得更加冗长,特别是当这个函数只需要在一个地方使用时。
- 减少灵活性:在某些情况下,使用匿名函数可以使代码更加灵活和简洁。没有匿名函数,某些编程模式(如即时使用的小函数作为参数传递)会更加复杂。
- 降低可读性:虽然过度使用
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()
函数使用这个匿名函数来决定哪些元素应该被包含在结果列表中。
<