目录
一、数据操作
张量:由一个数值组成的数组
torch.arange(12) # 包含以0开始的前12个整数
张量的形状:
x.shape # torch.Size([12])
改变一个张量的形状而不改变元素数量和元素值:
X = x.reshape(3, 4) # 或x.reshape(-1,4) 或 x.reshape(3,-1)
全0:
torch.zeros((2, 3, 4))
全1:
torch.ones((2, 3, 4))
随机初始化参数的值:
torch.randn(3, 4) # 每个元素从均值为0、标准差为1的正态分布中随机采样
标准算术运算符(+、-、*、/和**)
求幂:
torch.exp(x)
把多个张量连结在一起:
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0) # 沿行(轴0,形状的第一个元素)连结两个矩阵
torch.cat((X, Y), dim=1) # 按列(轴1,形状的第二个元素)连结两个矩阵
通过逻辑运算符构建二元张量:
X == Y # 如果X和Y在该位置相等,新张量中相应位置为True,否则为False
广播机制:先通过适当复制元素来扩展一个或两个数组,然后对生成的数组执行按元素操作
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a + b # 矩阵a将复制列, 矩阵b将复制行,然后再按元素相加
索引:第一个元素的索引是0,最后一个元素索引是-1
X[-1] # X最后一个元素
X[1:3] # X第2、3个元素
X[0:2, :] # 访问X第1行和第2行的所有元素
为X额外分配内存:
X = X + Y # 将取消引用X指向的张量,而是指向新分配的内存处的张量
切片:
X[:] = X + Y # 原地执行数据更新
X += Y # 原地执行数据更新
二、数据预处理
(使用pandas软件包)
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
# 把一个文件路径的字符串连接起来,形成这个文件的完整的路径。../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')
从创建的CSV文件中加载原始数据集:
import pandas as pd # 导入pandas包
data = pd.read_csv(data_file) # 读取data_file文件
print(data)
三、线性代数
访问张量的长度:
len(x)
复制A:
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)B = A.clone() # 通过分配新内存,将A的一个副本分配给B
矩阵A的转置:
A.T
降维:
A_sum_axis0 = A.sum(axis=0) # 沿0轴降维以生成输出向量
A_sum_axis1 = A.sum(axis=1) # 汇总所有列的元素降维(轴1)
平均值:
A.sum(axis=[0, 1]) # SameasA.sum()
A.mean()
A.sum() / A.numel()
A.sum() / A.shape
沿指定轴降低张量的维度:
A.mean(axis=0)
A.sum(axis=0) / A.shape[0]
sum_A = A.sum(axis=1, keepdims=True) # 保持轴数不变
乘积
点积:相同位置的按元素乘积再求和
torch.dot(x, y) # torch.sum(x * y)
矩阵-向量积:
torch.mv(A, x) # A的列维数(沿轴1的长度)必须与x的维数(其长度)相同
矩阵-矩阵乘法:
torch.mm(A, B) # A的列维数必须与B的行数相同
范数
L2范数:
u = torch.tensor([3.0, -4.0])
torch.norm(u) # tensor(5.)
L1范数:
torch.abs(u).sum() # tensor(7.)
四、 自动微分
x = torch.arange(4.0)
x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
y = 2 * torch.dot(x, x)
y.backward() # 求导
x.grad #输出导数
x.grad.zero_() #把x.grad清零