一个Python 深度学习框架,它将数据封装成张量(Tensor)来进行处理。PyTorch中的张量就是元素为同一种数据类型的多维矩阵。在PyTorch中,张量以"类" 的形式封装起来,对张量的一些运算、处理的方法被封装在类中。
Pytorch的安装:pip install torch==2.0.1 -ihttps://pypi.tuna.tsinghua.edu.cn/simple
1、张量的创建
torch.tensor() | 根据指定数据创建张量 | data = torch.tensor(data) |
torch.Tensor() | 根据指定形状创建张量,也可以用来创建指定数据的张量 | data = torch.Tensor(2,3) data = torch.Tensor([10,20]) |
torch.arange() | 创建线性张量 | data = torch.arange(0,10,2) |
torch.linspace() | 创建线性张量 | data = torch.linspace(0,11,10) |
torch.randn() | 创建随机张量 | data = torch.randn(2,3) |
torch.zeros() | 创建全0张量 | data = torch.zeros(2,3) |
torch.ones() | 创建全1张量 | data = torch.ones(2,3) |
torch.full() | 创建全为指定值张量 | data = torch.full([2,3],10) |
2、张量的类型转换
data.type(torch.DoubleTensor) | 将data元素类型转换为float64类型 | data,double() |
data.type(torch.IntTensor) | 将data元素类型转换为int64类型 | data.int() |
data.type(torch.LongTensor) | 将data元素类型转换为long类型 | data.long() |
data.type(torch.FloatTensor) | 将data元素类型转换为float32类型 | data.float() |
print(data.dtype) | 打印元素的类型 | |
Tensor.numpy() | 可以将张量转换成ndarray数组 | data_tensor.numpy() |
from_numpy() | 将ndarray数组转为Tensor | data_tensor = torch.from_numpy(data_numpy) |
torch.tensor() | 将ndarray转化为Tensor | data_tensor = torch.tensor(data_numpy) |
item() | 对于只有一个元素的张量,使用item()可以将该值从张量中提取出来 | print(data.item()) |
3、张量数值计算
add | new_data = data.add(10) | 不改变源数据 |
add_ | data.add_(10) | 修改源数据 |
sub | new_data = data.sub(10) | 不改变源数据 |
sub_ | data.sub_(10) | 修改源数据 |
mul | new_data = data.mul(10) | 不改变源数据 |
mul_ | data.mul_(10) | 修改源数据 |
div | new_data = data.div(10) | 不改变源数据 |
div_ | data.div_(10) | 修改源数据 |
neg(取相反数) | new_data = data.neg(10) | 不改变源数据 |
neg_ | data.neg_(10) | 修改源数据 |
torch.mul(data1,data2) | 对应位置的元素相乘 | data = torch.mul(data1.data2) |
data1*data2 | 对应位置的元素相乘 | data = data1*data2 |
torch.matmul(data1,data2) | 矩阵相乘 | data = torch.matmul(data1,data2) |
data1@data2 | 矩阵相乘 | data3 = data1@data2 |
4、张量运算函数
data.mean() | 均值 | |
data.sqrt() | 平方根 | |
data.sum() | 求和 | |
data.exp() | 指数计算 | |
data.log() | 对数计算 | |
torch.pow(data,2) | 平方 |
5、张量索引操作
data[0] | 取第0行 | 简单行列索引 |
data[:.0] | 取第0列 | |
data[[0,1],[1,2]] | 取(0,1) (1,2)两个元素的位置 | 列表索引 |
data[[[0],[1]],[1,2]] | 取0,1行的1,2列共4个元素 | |
data[:3,:2] | 前3行的前2列数据 | 列表索引 |
data[2:,:2] | 第2行到最后的前2列元素 | |
data[0,:,:] | 获取0轴的第一个数据 | 多维索引 |
data[:,0,:] | 获取1轴的第一个数据 | |
data[:,:,0] | 获取2轴的第一个数据 |
6、张量形状操
data.shape | 获取张量形状 | print(data.shape) |
data.size | 获取张量形状 | print(data.shape) |
data.reshape(1,6) | 修改张量形状 | |
data.squeeze() | 删除形状为1的维度 | mydata = data.squeeze() |
data.unsqueeze(dim=1) | 在1维度上拓展维度 | mydata = data.unsqueeze(dim=1) |
transpose() | 交换张量的指定维度 | torch.transpose(data,1,2) |
permute() | 一次交换更多的维度 | mydata = data.permute([1,2,0]) |
data.is_contiguous() | 判断是否使用整块内存 | print(data.is_contiguous()) |
view() | 只能用于整块内存,一般配合contiguous使用 | mydata = data.view(3,2) |
7、张量拼接操作
torch.cat([data1,data2],dim=0) | 按0维度拼接,不改变维度数 |
8、自动微分模块
import torch
# 1.当X为标量时梯度的计算
def test01():
x = torch.tensor(5)
#目标值
y = torch.tensor(0.)
#设置要更新的权重和偏置的初始值
w = torch.tensor(1., requires_grad=True, dtype=torch.float32)
b = torch.tensor(3., requires_grad=True, dtype=torch.float32)
#设置网络的输出值
z = x * w + b
#矩阵乘法#设置损失函数,并进行损失的计算
loss = torch.nn.MSELoss()
loss = loss(z, y)
#自动微分
loss.backward()
#打印w,b变量的梯度
# backward函数计算的梯度值会存储在张量的grad变量中
print("W的梯度:", w.grad)
print("b的梯度", b.grad)
9、案例-线性回归案例
pytorch中进行模型构建的整个流程一般分为四个步骤:
- 准备数据集
- 构建要使用的模型
- 设置损失函数和优化器
- 模型训练