Tensor张量 多维数组
- 介绍张量的属性
torch.tensor(
data='list/numpy',
dtype='torch.FloatTensor',
grad='梯度',
shape='张量的形状',
grad_fn='创建Tensor所需要的函数,求导的关键',
requires_grad='是否需要grad',
is_leaf='是否叶子结点 也是张量',
pin_memory='是否存于锁业内存',
device='CPU/CUDA')
- 介绍张量的创建
#first create
arr=np.ones((5,5))
torch.tensor(arr,dtype='torch.FloatTensor',device='CPU/CUDA')
#second create
torch.from_numpy(np.array([[1,2,3],[1,2,3]]))
#third create
torch.zeros((5,5),out=torch.tensor([1]))
torch.ones_like((3,3))
torch.full((3,3),2)
torch.arrange(2,10,2)#等差,开始结束以及公差
torch.linspace(2,10,5)#均分,开始结束个数
torch.logspace(2,10,3,10)#均分对数开始结束个数和对数的底
torch.eye(3,3)#单位对角矩阵行列
torch.zeros(size='形状'
out='输出张量'
layout='内存的布局形式 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。')
id(torch.zeros((5,5),out=torch.tensor([1]))) #取内存地址out=t
#概率创建
torch.normal(),randn(),randint_like(),randperm(),bernoulli()#高斯正态随机整数伯努利
- 张量的操作
#拼接
torch.cat(dim='维度0、1')
torch.stack(dim='维度')#接着上次的拼接
#切分
torch.chunk(chunks='切分的份数',dim='维度')
torch.split()
#索引拼接和切分
torch.index_select(input, dim, index, out=None)
torch.masked_select(input, mask, out=None)
#变换
torch.reshape(input, shape)
- 练习–线性回归y=ax+b
1.随机生成200个x,对应有200个y=5x+2
2.预测的pre_y=ax+b
3.loss=((y-pre_y)**2).mean()
4.a/b=a/b-a/b.grad*study_rate
a/b.grad.data.zero_()
import torch
import matplotlib.pyplot as plt
learning_rate=0.05
x=torch.rand([200])
y=5*x+2
a=torch.rand(1,requires_grad=True)
b=torch.rand(1,requires_grad=True)
for i in range(300):
y_pre=torch.add(torch.mul(a,x),b)
loss = ((y - y_pre) ** 2).mean()
loss.backward()
a.data -= learning_rate*a.grad.data
b.data -= learning_rate * b.grad.data
a.grad.zero_()
b.grad.zero_()
plt.scatter(x.data.numpy(),y.data.numpy())
plt.plot(x.data.numpy(),y_pre.data.numpy())
plt.show()
- 自动求导
torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None)
tensors: 用于求导的张量,如 loss
retain_graph: 保存计算图。PyTorch 采用动态图机制,默认每次反向传播之后都会释放计算图。这里设置为 True 可以不释放计算图。后续二次求导
create_graph: 创建导数计算图,用于高阶求导
grad_tensors: 多梯度权重。当有多个 loss 混合需要计算梯度时,设置每个 loss 的权重。 - 求取梯度
torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False)
outputs: 用于求导的张量,如 loss
inputs: 需要梯度的张量
create_graph: 创建导数计算图,用于高阶求导
retain_graph:保存计算图
grad_outputs: 多梯度权重计算 - 逻辑回归 sigmoid 函数,也被称为 Logistic 函数
-f(z)= 1/(1+e.pow(-Z)) z=WX+b
PyTorch 的五大模块:数据、模型、损失函数、优化器和迭代训练。
- 数据收集:样本和标签。
数据划分:训练集、验证集和测试集
数据读取:对应于 PyTorch 的 DataLoader。其中 DataLoader 包括 Sampler 和 DataSet。Sampler 的功能是生成索引, DataSet 是根据生成的索引读取样本以及标签。
数据预处理:对应于 PyTorch 的 transforms
torch.utils.data.DataLoader(dataset决定数据从哪里读取以及如何读取, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None)