PyTorch回归训练

傷城~ 2022-01-23 23:07 423阅读 0赞

1. 创建用于回归的虚拟数据集

2. 划分训练集和测试集

3. 参数初始化比较

4 批训练方法

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. __title__ = ''
  5. """
  6. import torch
  7. from torch import nn
  8. import torch.nn.functional as F
  9. import torch.utils.data as Data
  10. import matplotlib.pyplot as plt
  11. from sklearn.model_selection import train_test_split
  12. import numpy as np
  13. from torchvision import datasets, transforms
  14. from torch.nn import init
  15. #创建fake data
  16. # torch.manual_seed(99)
  17. # x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1)
  18. # y = x.pow(2) + 0.1 * torch.normal(torch.zeros(x.size()))
  19. # plt.scatter(x.numpy(), y.numpy())
  20. # plt.show()
  21. np.random.seed(666)
  22. X = np.linspace(-1, 1, 1000)
  23. y = np.power(X, 2) + 0.1 * np.random.normal(0, 1, X.size)
  24. print(X.shape)
  25. print(y.shape)
  26. # plt.scatter(X, y)
  27. # plt.show()
  28. # 创建训练集和测试集
  29. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1024)
  30. X_train = torch.from_numpy(X_train).type(torch.FloatTensor)
  31. X_train = torch.unsqueeze(X_train, dim=1) #转换成二维
  32. y_train = torch.from_numpy(y_train).type(torch.FloatTensor)
  33. y_train = torch.unsqueeze(y_train, dim=1)
  34. print(X_train.type)
  35. X_test = torch.from_numpy(X_test).type(torch.FloatTensor)
  36. X_test = torch.unsqueeze(X_test, dim=1) #转换成二维
  37. # train_size = int(0.7 * len(X))
  38. # test_size = len(X) - train_size
  39. # X_train, X_test = Data.random_split(X, [train_size, test_size])
  40. # print(len(X_train), len(X_test))
  41. BATCH_SIZE = 50
  42. LR = 0.02
  43. EPOCH = 5
  44. #将数据装载镜data中, 对数据进行分批训练
  45. torch_data = Data.TensorDataset(X_train, y_train)
  46. loader = Data.DataLoader(dataset=torch_data, batch_size=BATCH_SIZE, shuffle=True)
  47. #创建自己的nn
  48. class Net(nn.Module):
  49. def __init__(self):
  50. super(Net, self).__init__()
  51. self.hidden = nn.Linear(1, 20)
  52. self.predict = nn.Linear(20, 1)
  53. def forward(self, x):
  54. x = F.relu(self.hidden(x))
  55. x = self.predict(x)
  56. return x
  57. def weights_init(m):
  58. if isinstance(m, nn.Linear):
  59. init.kaiming_normal(m.weight.data)
  60. # init.xavier_normal(m.bias.data)
  61. adam_net = Net()
  62. # adam_net.apply(weights_init) # 对整个网络层进行参数初始化
  63. # 有初始化损失 xavier_normal :
  64. #{1: tensor(0.0972, grad_fn=<MseLossBackward>), 2: tensor(0.0731, grad_fn=<MseLossBackward>),
  65. # 3: tensor(0.0881, grad_fn=<MseLossBackward>), 4: tensor(0.1120, grad_fn=<MseLossBackward>),
  66. # 5: tensor(0.1012, grad_fn=<MseLossBackward>)}
  67. # 有初始化损失 kaiming_normal : 表现相对较好---
  68. #{1: tensor(0.1476, grad_fn=<MseLossBackward>), 2: tensor(0.0234, grad_fn=<MseLossBackward>),
  69. # 3: tensor(0.0162, grad_fn=<MseLossBackward>), 4: tensor(0.0170, grad_fn=<MseLossBackward>),
  70. # 5: tensor(0.0218, grad_fn=<MseLossBackward>)}
  71. # 没有初始化损失
  72. # {1: tensor(0.0265, grad_fn=<MseLossBackward>), 2: tensor(0.0121, grad_fn=<MseLossBackward>),
  73. # 3: tensor(0.0096, grad_fn=<MseLossBackward>), 4: tensor(0.0109, grad_fn=<MseLossBackward>),
  74. # 5: tensor(0.0104, grad_fn=<MseLossBackward>)}
  75. #设置优化器和损失函数
  76. opt_adam = torch.optim.Adam(adam_net.parameters(), lr=LR)
  77. loss_func = nn.MSELoss()
  78. #对数据进行分批训练
  79. # 在神经网络中传递完整的数据集一次是不够的,
  80. # 而且我们需要将完整的数据集在同样的神经网络中传递多次。
  81. # 但是请记住,我们使用的是有限的数据集,
  82. # 并且我们使用一个迭代过程即梯度下降。因此仅仅更新权重一次或者说使用一个 epoch 是不够的。
  83. # 比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。
  84. all_loss = {}
  85. for epoch in range(EPOCH):
  86. print('epoch', epoch)
  87. for step, (b_x, b_y) in enumerate(loader):
  88. print('step', step)
  89. pre = adam_net(b_x)
  90. loss = loss_func(pre, b_y)
  91. opt_adam.zero_grad()
  92. loss.backward()
  93. opt_adam.step()
  94. # print(loss)
  95. all_loss[epoch+1] = loss
  96. print(all_loss)
  97. #对测试集进行预测
  98. adam_net.eval()
  99. predict = adam_net(X_test)
  100. predict = predict.data.numpy()
  101. plt.scatter(X_test.numpy(), y_test, label='origin')
  102. plt.scatter(X_test.numpy(), predict, color='red', label='predict')
  103. plt.legend()
  104. plt.show()

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNTg3NTc1_size_16_color_FFFFFF_t_70

没有使用参数初始化的结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNTg3NTc1_size_16_color_FFFFFF_t_70 1

使用参数初始化的结果

项目推荐:

2000多G的计算机各行业电子资源分享(持续更新)

2020年微信小程序全栈项目之喵喵交友【附课件和源码】

Spring Boot开发小而美的个人博客【附课件和源码】

Java微服务实战296集大型视频-谷粒商城【附代码和课件】

Java开发微服务畅购商城实战【全357集大项目】-附代码和课件

最全最详细数据结构与算法视频-【附课件和源码】

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,423人围观)

还没有评论,来说两句吧...

相关阅读

    相关 pytorch-线性回归

    线性回归 主要内容包括: 1. 线性回归的基本要素 2. 线性回归模型从零开始的实现 3. 线性回归模型使用pytorch的简洁实现 线性回归的基本要素