概念
API
元素操作
- 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,表示自动运算对于维的大小
- 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
...