预备知识
说明:本章内容为博主根据原教程记录自己的学习笔记,来源:https://zh-v2.d2l.ai/ ,内容版权归原作者所有。
# 预备知识
# 数据操作
# 入门
张量:表示一个由数值组成的数组,这个数组可以有多个维度。
**向量(vector)**对应于具有一个轴的张量.
**矩阵(matrix)**对应于具有两个轴的张量.
基本操作指令
torch.arange(12) / x(tensor).shape / .reshape(3,4) / .numel()
torch.zeros((2,3,4)) / toch.ones((2,3,4)) / torch.randn(3,4) / torch.tensor([[],[],[]])
1
2
2
# 运算符
按元素运算:需要结构匹配
张量连结操作:torch.cat((X,Y),dim=0/1)
(dim决定连结方式,0为并列,1为拼接)
逻辑运算符的判断:按元素比较,相等为1,不等为0
# 广播机制
broadcasting mechanism
- 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
- 对生成的数组执行案元素操作
在大多数情况下,将沿着数组中长度为1的轴进行广播(必须一个为行,一个为列)
# 索引和切片
X[-1], X[1:3] / X[1, 2] = 9 / X[0:2, :] = 12
1
# 节省内存
运行一些操作可能会导致为新结果分配内存.
before = id(Y)
Y = Y + X
id(Y) == before
1
2
3
2
3
- 参数很多,我们希望它原地更新
- 如果不原地更新,可能出现指向冲突的情况
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
before = id(X)
X += Y
id(X) == before
1
2
3
4
5
6
7
2
3
4
5
6
7
# 转换为其他Python对象
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
1
2
3
4
5
2
3
4
5
# 数据预处理
# 读取数据集
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # 列名
f.write('NA,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
import pandas as pd
data = pd.read_csv(data_file)
print(data)
1
2
3
2
3
# 处理缺失值
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
1
2
3
4
5
6
2
3
4
5
6
# 转换为张量格式
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
1
2
3
4
2
3
4
# 线性代数
from mxnet import np, npx
npx.set_np()
x = np.array(3.0)
y = np.array(2.0)
print(x + y, x * y, x / y, x ** y)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
编辑 (opens new window)