Python--pytorch

概念

  • 基于numpy
  • tensor张量,实现GPU加速

API

  • import torch

元素操作

  • torch.empty(5, 3) 5行3列 数据是内存里的脏数据
  • torch.rand(5, 3) 5行3列 数据是范围在[0, 1)均匀分布的数据
  • torch.randn(5, 3) 随机值,数据值符合均值为0,方差(variance)为1分布
  • torch.zeros(5, 3, dtype=torch.long) 5行3列全0
  • torch.tensor([xxx]) 直接创建张量
  • tensor_x.new_ones(5, 3, dtype=torch.double) 创建全1张量
  • torch.randn_like(tensor_x, dtype=torch.float) 创建与tensor_x相同尺寸的张量,数据值符合均值为0,方差(variance)为1分布
  • tensor_x.size() 返回tensor_x张量的尺寸

运算操作

  • torch.add(tensor_x, tensor_y) 或者 tensor_x + tensor_y 或者 tensor_x.add_(tensor_y)这种方式会修改tensor_x,相当于tensor_x = tensor_x + tensor_y
  • 切片操作
  • tensor_x.view(size) 把tensor_x张量的数据按size生成新的尺寸的张量,如果size里面有-1,表示自动运算对于维的大小
    • 类似numpy的reshape resize
  • tensor_scalar_x.item() 如果张量tensor_scalar_x张量只有一个元素,item()返回对应的元素
  • tensor_x.tolist() 转成列表或单个值
  • tensor_x.numpy() 把张量转成numpy数组,得到的numpy数组与tensor_x张量共享内存,一个变化,另一个也会跟着变化
  • torch.from_numpy(np_x) 把numpy数组np_x转成张量,并且共享内存
  • torch.cuda.is_available() 判断是否安装gpu和cuda
  • torch.device('cuda') 创建gpu设备
  • torch.tensor(size, device=device) 创建张量是,可以指定gpu设备
  • tensor_cpu_x.to(device) 可以把cpu中的张量tensor_cpu_x转移到gpu设备上
  • tensor_gpu_x.to('cpu') 把gpu中的张量tensor_gpu_x转移到cpu上

一般训练代码步骤

  • 定义模型
  • 创建模型实例
  • 选择优化器,创建优化器实例
  • 调用优化器zero_grad()方法
  • 准备数据 input
  • output = 模型实例(input)
  • 选择损失函数,创建损失实例
  • 计算损失
  • 梯度清零:模型实例.zero_grad()
  • 反向传播:调用损失实例backward()
  • 更新参数:优化器实例.step()
  • 参考步骤:
import torch
import torch.nn as nn
import torch.optim as optim


# 自定义模型类型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 定义各种层

    def forward(self, x):
        # 使用各种层处理输入数据
        pass


# 实例化模型
net = Net()

# 模拟输入
input = torch.randn(1, 1, 32, 32)

# 使用DataLoader
# train_loader = torch.utils.data.DataLoader(train_datas, batchsize=batchsize, shuffle=True, num_worker=2)
# test_loader = torch.utils.data.DataLoader(test_datas, batchsize=batchsize, shuffle=False, num_worker=2)

# 模拟目标值
target = torch.randn(10)
target = target.view(1, -1)

# 选择优化器
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 选择损失函数
criterion = nn.MSELoss()

# 循环训练轮次
"""
for epoch in range(2):
  # 获取数据,每次一批,没批的数量由batch_size决定
  for i, data in enumerate(train_loader):
    inputs, labels = data
"""

optimizer.zero_grad()
# 使用模型训练
output = net(input)

# 计算损失
loss = criterion(output, target)

net.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()

# 模型保存
path = 'xxx'
torch.save(net.state_dict(), path)


# 测试集测试
# 加载模型
net = Net()
net.load_state_dict(torch.load(path))


with torch.no_grad():
  for data in test_loader:
    inputs, labels = data
    ...

posted @ 2024-12-10 22:53  liDB  阅读(2)  评论(0编辑  收藏  举报