【<动手学深度学习>笔记】张量常用函数
tips:学习李沐老师的《动手学深度学习v2》课程中整理的自用笔记
一、数据操作
1.1 维度样例
名称 | 维度 | 应用 | 例子 |
---|---|---|---|
0d 标量 | 0 | 类别 | 1.0 |
1d 向量 | 1 | 特征向量 | [1.0 , 2.0] |
2d 矩阵 | 2 | 样本;特征矩阵 | [[1.0 , 2.0 ] [5.0 , 6.0]] |
3d | 3 | RGB图片,宽x高x通道 | |
4d | 4 | 一个RGB图片的批量,批量x宽x高x通道 | |
5d | 5 | 视频批量,批量x时间x宽x高x通道 |
1.2 创建数组——torch.arange
- 参数说明:
1)一个参数,end:默认start=0,step=1;
2)两个参数,start,end:默认step=1;
- 实例:
import torch
x1 = torch.arange(5)
x2 = torch.arange(1, 4)
x3 = torch.arange(1, 3, 0.5)
print("x1:", x1)
print("x1:", x2)
print("x1:", x3)
1.3 访问属性——shape、numel、reshape
- x.shape:结果是向量
- x.numel():结果是标量
- x.reshape(h,w):仅改变张量的形状,不改变值
- 实例:
import torch
x = torch.arange(12)
xShape = x.shape
xNumel = x.numel()
xReshape = x.reshape(3, 4)
print(x)
print(xShape)
print(xNumel)
print(xReshape)
1.4 全0、全1数组——torch.zeros、torch.ones
- 实例:
torch.zeros((2,3,4))
1.5 创建具体数值的张量——torch.tensor
- 通过嵌套列表构建
- 实例:
import torch
x = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]])
print(x)
1.6 按行/列连结张量——torch.cat
- 函数参数:
torch.cat((tensorList),dim=)
参数名 | 用法 |
---|---|
tensorList | 连接张量 |
dim | dim=0,按行连接;dim=1,按列连接 |
- 实例:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = torch.tensor([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]])
withRow = torch.cat((x, y), dim=0)
withColumn = torch.cat((x, y), dim=1)
print("x:", x)
print("y:", y)
print("row:", withRow)
print("col:", withColumn)
1.7 广播机制Broadcast
- 出现情况:两个张量的维度向右对齐,在维度大小上满足:
1)维度大小相等
2)维度不等,且有一个是1或不存在 - 应用:满足以上条件的张量做运算时,理论上不可计算,实际上默认通过广播机制自动扩张成相同的size进行运算。实际应用中,时常会因为默认的广播机制导致运算不符合预期,但不报错。注意debug。
- 实例分析:AB从右向左看,最末尾的维度值是4,满足1);次末尾维度虽然维度大小不等,但B维度是1,满足2);最高位维度虽然不等,但B的维度不存在,满足2);所以A和B运算触发广播机制,最终扩张为shape=(3,2,4)。
A.shape=(3,2,4)
B.shape=(1,4)
- 实例代码:
import torch
x = torch.tensor([[1, 2, 3]])
y = torch.tensor([[1], [2], [3]])
z = x+y
print("x:", x)
print("y:", y)
print("z:", z)
1.8 切片读取
- 读取某些特定的行/列
1)只有一个参数:某一行/列;正数从0计数,负数从-1计数。
2)两个参数(a:b):某一范围,左闭右开
3)只有冒号 :代表行/列全部读取,可以默认不写,例如x[0:2,:]与x[0:2]一致。
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x[1:3])
print(x[1:3, :])
- 行实例:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x[0])
print(x[-1])
print(x[1:3])
1.9 切片写入
- 与读取同理,应用冒号做赋值
- 实例:给第三四行的前两列赋值为10
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [7, 8, 9]])
print(x)
x[2:4, 0:2] = 10
print(x)
1.10 numpy张量
- numpy与tensor转换
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [7, 8, 9]])
y = x.numpy()
z = torch.tensor(y)
print(type(y))
print(type(z))
二、数据预处理
python相关的os操作见:python杂项记录——tqdm/注释/self参数/OS/部分语法/split()/cv2库
2.1 scv文件读写
-
csv文件:使用逗号分隔值,存储数据集的文件。一般第一行是列名,之后每一行为一条数据。
-
生成csv文件例子:
import os
import pandas as pd
file_path = os.path.join('test01', 'data') # 父目录
file_name ='test01_data.csv'
os.makedirs(file_path, exist_ok=True) # 目录不存在则新建
data_file = os.path.join(file_path, file_name) # scv目录
with open(data_file, 'w') as f:
f.write('Id,Name,Price\n') # 列名称
f.write('01,Cake,100\n') # 数据
f.write('02,Candy,50\n')
data = pd.read_csv(data_file) # 读取.scv文件
print(data)
运行效果:
2.2 数据缺失处理——插值
- 数据部分数值缺失时,可以选择丢弃(不推荐,浪费数据信息)和插值。