当前位置:   article > 正文

Pytorch 模型训练步骤_pytorch训练函数

pytorch训练函数

目录

1、导入必要库

2、加载数据

3、构建网络

4、训练模型

5、保存模型参数

        1)、仅仅保存和加载模型参数

        2)、保存和加载整个模型

        3)、保存多个模型参数


1、导入必要库

  1. import torch
  2. from torch import optim, nn
  3. import torch.utils.data as Data

2、加载数据

  1. x = torch.linspace(1, 10, 10) # x data (torch tensor)
  2. y = torch.linspace(10, 1, 10) # y data (torch tensor)
  3. # 注意:x的数据类型是 torch.FloatTensor
  4. # y的数据类型是 torch.LongTensor
  5. # x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # FloatTensor = 32-bit floating
  6. # y = torch.cat((y0, y1), ).type(torch.LongTensor) # LongTensor = 64-bit integer
  7. # 注意:这个y的数据类型,如果是分类,可以这样(LongTensor:长整型),但是做预测,就需要修改为.double()或者.float()
  8. # 先转换成 torch 能识别的 Dataset
  9. torch_dataset = Data.TensorDataset(x, y)
  10. # 把 dataset 放入 DataLoader
  11. loader = Data.DataLoader(
  12. dataset=torch_dataset, # torch TensorDataset format
  13. batch_size=3, # mini batch size
  14. shuffle=True, # 要不要打乱数据 (打乱比较好)
  15. num_workers=0, # 多线程来读数据
  16. )

3、构建网络

  1. # 定义网络结构 build net
  2. class Net(torch.nn.Module):
  3. def __init__(self,n_feature,n_hidden,n_output):
  4. super(Net, self).__init__()
  5. self.fc1 =torch.nn.Linear(n_feature,n_hidden)
  6. self.fc2 =torch.nn.Linear(n_hidden,n_output)
  7. # 定义一个前向传播过程函数
  8. def forward(self, x):
  9. x=F.relu(self.fc1(x))
  10. x=self.fc2(x)
  11. return x
  12. # 实例化一个网络为 model
  13. model = Net(n_feature=1,n_hidden=10,n_output=10)
  14. print(model)

4、训练模型

  1. optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
  2. loss_func = nn.CrossEntropyLoss()
  3. # 训练模型
  4. model.train()
  5. for epoch in range(5):
  6. for step, (b_x, b_y) in enumerate(loader):
  7. output = model(b_x)
  8. loss = loss_func(output, b_y)
  9. optimizer.zero_grad()
  10. loss.backward()
  11. optimizer.step()
  12. # 测试模型
  13. model.eval()
  14. for step, (b_x, b_y) in enumerate(loader):
  15. output = model(b_x)
  16. loss = loss_func(output, b_y)
  17. _, pred_y = torch.max(output.data, 1)
  18. correct = (pred_y == b_y).sum()
  19. total = b_y.size(0)
  20. print('Epoch: ', step, '| test loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % (float(correct)/total))

5、保存模型参数

        1)、仅仅保存和加载模型参数

  1. # 保存模型参数
  2. torch.save(model.state_dict(), './path/model.pkl')
  3. # 读取模型参数
  4. model.load_state_dict(torch.load('./path/model.pkl'))

        2)、保存和加载整个模型

  1. # 保存整个模型
  2. torch.save(model, './path/model.pkl')
  3. # 加载整个模型
  4. model = torch.load('./path/model.pkl')

        3)、保存多个模型参数

  1. # 多个模型参数保存
  2. torch.save({
  3. 'epoch': epoch,
  4. 'model_state_dict': model.state_dict(),
  5. 'optimizer_state_dict': optimizer.state_dict(),
  6. 'loss': loss,
  7. ...
  8. }, PATH)
  9. # 模型参数加载
  10. checkpoint = torch.load(PATH)
  11. model.load_state_dict(checkpoint['model_state_dict'])
  12. optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
  13. epoch = checkpoint['epoch']
  14. loss = checkpoint['loss']

附录:

在已有的数据集中增加数据:

  1. import torch
  2. import torch.utils.data as Data
  3. a = Data.TensorDataset(torch.tensor([5]), torch.tensor([0]))
  4. b = Data.TensorDataset(torch.tensor([[85],[54]]), torch.tensor([[6],[4]]))
  5. a += b
  6. for i in a:
  7. print(i)

这样,我们就可以利用这种方法在训练时候增加数据:

  1. import torch
  2. import torch.utils.data as Data
  3. from torch.utils.data import DataLoader
  4. train_dataset = Data.TensorDataset(torch.tensor([5]), torch.tensor([0]))
  5. # 创建数据加载器
  6. train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
  7. n_queries = 100
  8. for i in range(n_queries):
  9. model.train(train_loader)
  10. # 添加新样本至训练数据集
  11. new_data = torch.utils.data.TensorDataset(torch.tensor([[85],[54]]), torch.tensor([[6],[4]]))
  12. train_dataset += new_data
  13. # 更新训练数据加载器
  14. train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

在数据库中,指定删除对应索引下的数据

  1. import torch
  2. import torch.utils.data as Data
  3. from torch.utils.data import Subset
  4. import numpy as np
  5. # 原始数据集
  6. b = Data.TensorDataset(torch.tensor([[85],[54],[12],[23]]), torch.tensor([[6],[4],[8],[7]]))
  7. # 我们需要数据的去除的下标
  8. indices = torch.tensor([0,2],dtype=torch.int)
  9. # b数据中全部数据下标
  10. indices_ = torch.tensor(range(len(b)),dtype=torch.int)
  11. # b数据中去除后的下标
  12. # 注意,indices_和indices对比的字符类型必须相同,否则无法比较
  13. indices_new = indices_.numpy()[~np.isin(indices_.numpy(), indices)]
  14. # 在b数据中,根据下标重新建立数据加载模块
  15. # 注意,这个indices_new下标,无论什么格式都可以,即torch、numpy、列表都行,但是 必须是整数
  16. new_dataset = Subset(b, indices_new)
  17. # 创建数据加载器
  18. train_loader = Data.DataLoader(new_dataset, batch_size=32, shuffle=True)
  19. for i in new_dataset:
  20. print(i)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/849379?site
推荐阅读
相关标签
  

闽ICP备14008679号