2.1 数据操作
入门
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。
使用全0、全1、其他常量,或者从特定分布中随机采样的数字]来初始化矩
torch的广播机制(broadcast mechanism)
“广播”这一术语用于描述如何在形状不一的数组上应用算术运算。
在满足特定限制的前提下,较小的数组“广播至”较大的数组,使两者形状互相兼容。广播提供了一个向量化数组操作的机制,这样遍历就发生在C层面,而不是Python层面。广播可以避免不必要的数据复制,通常导向高效的算法实现。不过,也存在不适用广播的情形(可能导致拖慢计算过程的低效内存使用)。
可广播的一对张量需满足以下规则:
- 每个张量至少有一个维度。
- 迭代维度尺寸时,从尾部的维度开始,维度尺寸
或者相等,
或者其中一个张量的维度尺寸为 1 ,
或者其中一个张量不存在这个维度。
例如:
import torch
# 示例1:相同形状的张量总是可广播的,因为总能满足以上规则。
x = torch.empty(3, 6, 4)
y = torch.empty(3, 6, 4)
# 示例2:不可广播( a 不满足第一条规则)。
a = torch.empty((0,)) # 维度为0 输出 :tensor([])
b = torch.empty(2, 2)
# 示例3:a 和 b 可广播:
a = torch.empty(5, 4, 3, 1)
b = torch.empty( 4, 1, 1)
# 倒数第一个维度:两者的尺寸均为1
# 倒数第二个维度:b的尺寸为1
# 倒数第三个维度:两者尺寸相同
# 倒数第四个维度:b该维度不存在
# 示例4:不可广播,因为倒数第三个维度:4 != 3
a = torch.empty(6, 4, 3, 1)
b = torch.empty( 3, 1, 1)
索引和切片
第一个元素的索引是0,最后一个元素索引是-1; [-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素]:
[0:2, : ]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。
节省内存
如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。
我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] =
如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。]
转换为其他Python对象
要(将大小为1的张量转换为Python标量),我们可以调用item函数或Python的内置函数。
2.2 数据预处理
**在Python中常用的数据分析工具中,我们通常使用pandas软件包。**pandas可以与张量兼容.
读取数据集
创建一个人工数据集,并存储在CSV(逗号分隔值)文件
…/data/house_tiny.csv 文件如下:
从创建的CSV文件中加载原始数据集
处理缺失值
注意,“NaN”项代表缺失值。 [**为了处理缺失的数据,典型的方法包括_插值法_和_删除法,_**将data分成inputs和outputs
**插值法:**位置索引iloc
删除法:drop
[对于inputs中的类别值或离散值,我们将“NaN”视为一个类别。] 由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
转换为张量格式
练习
- 删除缺失值最多的列。
- 将预处理后的数据集转换为张量格式。
方案一 删除缺失值最多的列