tnblog
首页
视频
资源
登录

Pytorch 曲线拟合(易化学习笔记二)

1434人阅读 2024/6/5 13:43 总访问:3475711 评论:0 收藏:0 手机
分类: python

Pytorch 曲线拟合(易化学习笔记二)

感染与天数预测

  1. import matplotlib.pyplot as plt
  2. import torch
  3. import torch.nn as nn
  4. # 天数
  5. x=[1.,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
  6. # 感染人数
  7. y=[4.,18,32,175,398,540,273,195,229,666,482,725,739,1075,1011,960,1313,1505,1551,1658,1946,2557,2492,3105,3489,3555,3784,4480,4989,5176]
  8. plt.plot(x, y, 'o')
  9. plt.show()
  10. # 转换为torch的张量类型,才能用它的AI模型
  11. x = torch.tensor(x)
  12. # 升维
  13. x = x.unsqueeze(1)
  14. print("x shape=",x.shape)
  15. # 转换为torch的张量类型,才能用它的AI模型
  16. y = torch.tensor(y)
  17. x=x/30
  18. y=y/5176
  19. # 升维
  20. y = y.unsqueeze(1)
  21. print("y shape=",y.shape)
  22. ## 构建模型(用线性拟合)
  23. # 设置内置的线性回归, 输入:1w维 输出:1维
  24. model = nn.Linear(1,1)
  25. # 使用均值损失函数
  26. criterion = nn.MSELoss()
  27. # 设置优化器为SGD(随机梯度下降,学习速率为10^-5)
  28. optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
  29. ## 训练评估
  30. # 轮询次数13000次
  31. num_epochs = 13000
  32. for epoch in range(num_epochs):
  33. # 向前传播
  34. out = model(x)
  35. loss = criterion(out, y)
  36. # 向后传播
  37. # 注意每次迭代都需要清零
  38. optimizer.zero_grad()
  39. loss.backward()
  40. optimizer.step()
  41. # 每1000个batch打印一次cost值,显示一下图像拟合效果
  42. if epoch % 1000 == 0:
  43. print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.item()))
  44. #//中途,图形显示拟合效果
  45. #predict = model(x)
  46. #predict = predict.data.numpy()
  47. #plt.plot(x.numpy(), y.numpy(), 'ro', label='样本点集')
  48. #plt.plot(x.numpy(), predict, label='拟合后的直线')
  49. #plt.show()
  50. model.eval()
  51. predict = model(x)
  52. predict = predict.data.numpy()
  53. # o:圆点显示
  54. plt.plot(x.numpy(), y.numpy(), 'o', label='样本点集')
  55. # r-: 红色的直线
  56. plt.plot(x.numpy(), predict, 'r-',label='拟合后的直线')
  57. plt.show()


我们发现通过一维进行训练,效果很差。
接下来我们添加一层,并添加16个神经元。

曲线拟合(较好的一种)

  1. import torch
  2. import torch.nn as nn
  3. from torch.autograd import Variable
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. ## 数据处理
  7. # 天数
  8. x=[1.,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
  9. # 感染人数
  10. y=[4.,18,32,175,398,540,273,195,229,666,482,725,739,1075,1011,960,1313,1505,1551,1658,1946,2557,2492,3105,3489,3555,3784,4480,4989,5176]
  11. # 先转成张量,再转成变量,
  12. x = Variable(torch.Tensor(x))
  13. # 只有变量,才可以装载梯度信息,动态计算图,在GPU上加速运算
  14. y = Variable(torch.Tensor(y))
  15. x = x.unsqueeze(1)
  16. y = y.unsqueeze(1)
  17. # 归一化到1以内的比例时,避免loss值太大时 梯度爆炸
  18. x=x/30
  19. y=y/5176
  20. print("x shape=",x.shape)
  21. print("y shape=",y.shape)
  22. # 图示 样本点数据
  23. plt.scatter(x.numpy(), y.numpy())
  24. plt.show()
  25. ## 构建模型(用多层感知机)
  26. # 构建序列容器(逐层叠加,上一层输出是下一层输入)
  27. model = nn.Sequential(
  28. nn.Linear(1, 16),# 隐藏层(输入维度:1,输出维度16)
  29. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  30. nn.Linear(16, 1), # 输出层(输入维度:16,输出维度1)
  31. )
  32. # 均值损失函数
  33. criterion = nn.MSELoss()
  34. # 优化器为SGD(随机梯度下降),学习速率为10^-2
  35. optimizer = torch.optim.SGD(model.parameters(), lr=1e-1)
  36. ## 训练评估
  37. y_loss = []
  38. # 训练轮数
  39. num_epochs = 50000
  40. for epoch in range(num_epochs):
  41. # 向前传播
  42. # 模型对输入进行预测
  43. preds = model(x)
  44. # 计算损失(预测值与 标签值比较)
  45. loss = criterion(preds, y)
  46. # 向后传播
  47. # 每次迭代都需把,梯度清零(因pytorch默认会累积梯度)
  48. optimizer.zero_grad()
  49. # 反向传播,计算梯度
  50. loss.backward()
  51. # 按学习率减去少量梯度来调整权重
  52. optimizer.step()
  53. # 每训练400次,查看一次loss, loss越小,preds值越接近targets
  54. if (epoch + 1) % 400 == 0:
  55. print('Epoch[{}/{}], loss:{:.8f}'.format(epoch + 1, num_epochs, loss.item()))
  56. # 每200次,记录一次损失值
  57. y_loss.append(float(loss.data.numpy()))
  58. # 绘制拟合曲线的效果图
  59. y_pre = model(x)
  60. plt.title("Fit Curve")
  61. plt.plot(x.data.numpy(),y.data.numpy(),'o')
  62. plt.plot(x.data.numpy(),y_pre.data.numpy())
  63. plt.legend("y","y_pre")
  64. plt.show()
  65. # 绘制 loss 值变化曲线图
  66. x_loss = np.arange(0,len(y_loss),1)
  67. #print(y_loss)
  68. plt.title("Loss")
  69. plt.plot(x_loss,y_loss)
  70. plt.show()

疫情扩散的预测

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. import numpy as np
  4. import torch
  5. import torch.nn as nn
  6. from torch.autograd import Variable
  7. data = pd.read_csv('usdata.csv',usecols=[0,1,2,3,4])
  8. #//print(data['总确诊'])
  9. # 疫情确诊人数(曲线简单)
  10. y = np.array(data['累计确诊'])
  11. # 可分别查看 新增 治愈 死亡的曲线图。
  12. # 其中新增的曲线较复杂,其它几个曲线简单且类似
  13. x = np.arange(0,len(y)) # 天数
  14. #print(x)
  15. #print(y)
  16. # 以红色点显示 感染人数
  17. plt.plot(x, y, 'ro', label='ill pepple')
  18. plt.show()
  19. # 先转成张量,再转成变量,只有变量,才可以装载梯度信息,动态计算图,在GPU上加速运算
  20. x = Variable(torch.Tensor(x))
  21. y = Variable(torch.Tensor(y))
  22. x = x.unsqueeze(1)
  23. y = y.unsqueeze(1)
  24. # 归一化
  25. x=x/580
  26. y=y/100000000
  27. print("x shape=",x.shape)
  28. print("y shape=",y.shape)
  29. ## 构建模型
  30. # 用多层感知机
  31. model = nn.Sequential( # 构建序列容器(逐层叠加,上一层输出是下一层输入)
  32. nn.Linear(1, 32),# 隐藏层(输入维度:1,输出维度16)
  33. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  34. nn.Linear(32, 1),# 输出层(输入维度:16,输出维度1)
  35. )
  36. # 均值损失函数
  37. criterion = nn.MSELoss()
  38. # 优化器为SGD(随机梯度下降),学习速率为10^-1
  39. optimizer = torch.optim.SGD(model.parameters(), lr=1e-1)
  40. ## 训练评估
  41. y_loss = []
  42. # 训练轮数
  43. num_epochs = 40000
  44. for epoch in range(num_epochs):
  45. # 向前传播
  46. # 模型对输入进行预测
  47. preds = model(x)
  48. # 计算损失(预测值与 标签值比较)
  49. loss = criterion(preds, y)
  50. # 向后传播
  51. # 每次迭代都需把,梯度清零(因pytorch默认会累积梯度)
  52. optimizer.zero_grad()
  53. # 反向传播,计算梯度
  54. loss.backward()
  55. # 按学习率减去少量梯度来调整权重
  56. optimizer.step()
  57. # 每训练400次,查看一次loss, loss越小,preds值越接近targets
  58. if (epoch + 1) % 400 == 0:
  59. print('Epoch[{}/{}], loss:{:.8f}'.format(epoch + 1, num_epochs, loss.item()))
  60. # 每400次,记录一次损失值
  61. y_loss.append(float(loss.data.numpy()))
  62. # 绘制拟合曲线的效果图
  63. y_pre = model(x)
  64. plt.title("Fit Curve")
  65. plt.plot(x.data.numpy(),y.data.numpy(),'o')
  66. plt.plot(x.data.numpy(),y_pre.data.numpy())
  67. plt.legend("y","y_pre")
  68. plt.show()
  69. # 绘制 loss 值变化曲线图
  70. x_loss = np.arange(0,len(y_loss),1)
  71. #print(y_loss)
  72. plt.title("Loss")
  73. plt.plot(x_loss,y_loss)
  74. plt.show()

预测新增病例

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. import numpy as np
  4. import torch
  5. import torch.nn as nn
  6. from torch.autograd import Variable
  7. data = pd.read_csv('usdata.csv',usecols=[0,1,2,3,4])
  8. # 疫情确诊人数(曲线简单)
  9. y = np.array(data['新增病例']) # 新增病例
  10. x = np.arange(0,len(y)) # 天数
  11. y = np.nan_to_num(y, nan=0.0)
  12. #print(x)
  13. #print(y)
  14. # 先转成张量,再转成变量,只有变量,才可以装载梯度信息,动态计算图,在GPU上加速运算
  15. x = Variable(torch.Tensor(x))
  16. y = Variable(torch.Tensor(y))
  17. x = x.unsqueeze(1)
  18. y = y.unsqueeze(1)
  19. print("x shape=",x.shape,x)
  20. print("y shape=",y.shape,y)
  21. # 归一化
  22. x = x / 580
  23. y = y / 100000000
  24. plt.plot(x, y, 'ro', label='ill pepple')
  25. plt.show()
  26. #y=y/111820082
  27. ## 构建模型
  28. # 用多层感知机
  29. model = nn.Sequential( # 构建序列容器(逐层叠加,上一层输出是下一层输入)
  30. nn.Linear(1, 16),# 隐藏层(输入维度:1,输出维度16)
  31. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  32. nn.Linear(16, 24),# 输出层(输入维度:16,输出维度1)
  33. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  34. nn.Linear(24, 32),# 输出层(输入维度:16,输出维度1)
  35. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  36. nn.Linear(32, 16),# 输出层(输入维度:16,输出维度1)
  37. nn.ReLU(), # 激活函数: 采用ReLU,只提取正值
  38. nn.Linear(16, 1),# 输出层(输入维度:16,输出维度1)
  39. )
  40. # 均值损失函数
  41. criterion = nn.MSELoss()
  42. # 优化器为SGD(随机梯度下降),学习速率为10^-1
  43. optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
  44. #optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
  45. ## 训练评估
  46. y_loss = []
  47. # 训练轮数
  48. num_epochs = 40000
  49. for epoch in range(num_epochs):
  50. # 向前传播
  51. # 模型对输入进行预测
  52. preds = model(x)
  53. # 计算损失(预测值与 标签值比较)
  54. loss = criterion(preds, y)
  55. # 向后传播
  56. # 每次迭代都需把,梯度清零(因pytorch默认会累积梯度)
  57. optimizer.zero_grad()
  58. # 反向传播,计算梯度
  59. loss.backward()
  60. # 按学习率减去少量梯度来调整权重
  61. optimizer.step()
  62. # 每训练400次,查看一次loss, loss越小,preds值越接近targets
  63. if (epoch + 1) % 400 == 0:
  64. print('Epoch[{}/{}], loss:{:.8f}'.format(epoch + 1, num_epochs, loss.item()))
  65. y_loss.append(float(loss.data.numpy())) #//每400次,记录一次损失值
  66. # 绘制拟合曲线的效果图
  67. y_pre = model(x)
  68. plt.title("Fit Curve")
  69. plt.plot(x.data.numpy(),y.data.numpy(),'o')
  70. plt.plot(x.data.numpy(),y_pre.data.numpy())
  71. plt.legend("y","y_pre")
  72. plt.show()
  73. # 绘制 loss 值变化曲线图
  74. x_loss = np.arange(0,len(y_loss),1)
  75. #print(y_loss)
  76. plt.title("Loss")
  77. plt.plot(x_loss,y_loss)
  78. plt.show()


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Pytorch 初探

Pytorch 初探[TOC] Pytorch简介PyTorch由 Facebook 的 AI 研究团队开发的一个开源的机器学习库,它提供了张量(tensor)计...

Pytorch 自动求导与简单的线性回归

Pytorch 自动求导与简单的线性回归[TOC] 环境安装安装pytorch%pip install torch torchvision torchaudio 自动计算反向...

Pytorch Tensor 常见的形式

Pytorch Tensor 常见的形式[TOC] 值 描述 scalar 0维张量 vector 1维张量 matrix 2维张量 ...

Pytorch 气温预测

Pytorch 气温预测[TOC] 准备数据集下载temps.csv数据集。# 下载包 !wget https://raw.githubusercontent.com/AiDaShi/lea...

Pytorch Mnist分类任务

Pytorch Mnist分类任务[TOC] Mnist分类任务了解目标——网络基本构建与训练方法,常用函数解析——torch.nn.functional...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据与在线实践数据链接: https://pan.baidu.com/s/1VkrHDZGukkF900zLncMn5g 密码: 3lom...

Pytorch 基于经典网络架构训练图像分类模型

Pytorch 基于经典网络架构训练图像分类模型[TOC] 数据预处理部分:数据增强:torchvision中transforms模块自带功能,比较...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据集Dataloader制作如何自定义数据集:1.数据和标签的目录结构先搞定(得知道到哪读数据)...

Pytorch 新闻分类任务学习笔记

Pytorch 新闻分类任务(学习笔记)[TOC] 目录结构 models文件夹该文件夹显示搭建的网络结构。里面有TextCNN.py和TextRNN....

Pytorch Flask服务部署图片识别学习笔记

Pytorch Flask服务部署图片识别(学习笔记)[TOC] Flask 简介Flask是一个用Python编写的轻量级Web应用框架。它简单易用,...

Pytorch 预测产量易化学习笔记一

Pytorch 预测产量(易化学习笔记一)[TOC] 实验目的(二维)通过温度进行产量预测。 实验代码导入数据集import torch im...

Pytorch 识别手写数字易化学习笔记三

Pytorch 识别手写数字(易化学习笔记三)[TOC] 识别手写数字LeNet-5手写数字识别的非常高效的卷积神经网络。高效原因:1....

Pytorch cifar10识别普适物体易化学习笔记四

Pytorch cifar10识别普适物体(易化学习笔记四)[TOC] CIFAR-10简介CIFAR-10(Canadian Institute For Advanced Research...

Pytorch loguru日志收集易化学习笔记五

Pytorch loguru日志收集(易化学习笔记五)[TOC] loguru日志简介Loguru 是一个 Python 日志库,旨在简化日志记录的设置和...

Pytorch TensorBoard运用易化学习笔记六

Pytorch TensorBoard运用(易化学习笔记六)[TOC] TensorBoard简介TensorBoard是TensorFlow的可视化工具包,旨在帮助研究...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术