3-7 使用深度学习解决温度即示数问题

3-7 使用深度学习解决温度即示数问题

直接上代码

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import torch
torch.set_printoptions(edgeitems=2, linewidth=75)

设置Jupyter Notebook在单元格中内嵌显示图像,导入所需库并设置PyTorch的打印选项。

#%%
t_c = [0.5,  14.0, 15.0, 28.0, 11.0,  8.0,  3.0, -4.0,  6.0, 13.0, 21.0]
t_u = [35.7, 55.9, 58.2, 81.9, 56.3, 48.9, 33.9, 21.8, 48.4, 60.4, 68.4]
t_c = torch.tensor(t_c)
t_u = torch.tensor(t_u)

定义摄氏温度和未知温度的样本数据,并将它们转换为PyTorch张量。

#%%
def model(t_u, w, b):return w * t_u + b

定义线性模型:$ t_p = w \times t_u + b $。

#%%
def loss_fn(t_p, t_c):squared_diffs = (t_p - t_c) ** 2return squared_diffs.mean()

定义损失函数,使用均方误差(MSE)来计算预测值和真实值之间的差异。

#%%
def dloss_fn(t_p, t_c):dsq_diffs = 2 * (t_p - t_c) / t_p.size(0)return dsq_diffsdef dmodel_dw(t_u, w, b):return t_udef dmodel_db(t_u, w, b):return 1.0

定义损失函数对预测值的梯度,以及模型对参数(w和b)的梯度。

#%%
def grad_fn(t_u, t_c, t_p, w, b):dloss_dtp = dloss_fn(t_p, t_c)dloss_dw = dloss_dtp * dmodel_dw(t_u, w, b)dloss_db = dloss_dtp * dmodel_db(t_u, w, b)return torch.stack([dloss_dw.sum(), dloss_db.sum()])

计算损失函数对参数w和b的梯度。

#%%
w = torch.zeros(())
b = torch.zeros(())

初始化参数w和b为0。

#%%
delta = 0.1
loss_rate_of_change_w = (loss_fn(model(t_u, w + delta, b), t_c) - loss_fn(model(t_u, w - delta, b), t_c)) / (2.0 * delta)
learning_rate = 1e-2
w = w - learning_rate * loss_rate_of_change_wloss_rate_of_change_b = (loss_fn(model(t_u, w, b + delta), t_c) - loss_fn(model(t_u, w, b - delta), t_c)) / (2.0 * delta)
b  = b - learning_rate * loss_rate_of_change_b

计算参数w和b的梯度并进行一次梯度下降更新。

#%%
def training_loop(n_epochs, learning_rate, params, t_u, t_c):for epoch in range(1, n_epochs+1):w, b = paramst_p = model(t_u, w, b)loss = loss_fn(t_p, t_c)grad = grad_fn(t_u, t_c, t_p, w, b)params = params - learning_rate * gradprint("Epoch %d, Loss %f" % (epoch, float(loss)))return params

定义训练循环函数,通过多个训练周期更新参数。

#%%
training_loop(n_epochs = 100,learning_rate = 1e-5,params = torch.tensor([1.0, 0.0]),t_u = t_u,t_c = t_c)

调用训练循环函数,执行100个训练周期。

#%%
t_un = 0.1 * t_u
params = training_loop(n_epochs = 3000,learning_rate = 1e-2,params = torch.tensor([1.0, 0.0]),t_u = t_un,t_c = t_c
)

对输入数据进行缩放并再次训练模型,这次训练3000个周期。

#%%
t_p = model(t_un, *params)
fig = plt.figure(dpi=600)
plt.xlabel("Temperature Fahrenheit")
plt.ylabel("Temperature Celsius")
plt.plot(t_u.numpy(), t_p.detach().numpy())
plt.plot(t_u.numpy(), t_c.numpy(), 'o')
plt.savefig("temp_unknown_plot.png", format='png')

绘制模型预测值与真实值的对比图。

#%%
params = torch.tensor([1.0, 0.0], requires_grad=True)

初始化参数并设置requires_grad=True以允许梯度计算。

#%%
loss = loss_fn(model(t_u, *params), t_c)
loss.backward()
params.grad

计算损失并反向传播以获取梯度。

#%%
def training_loop(n_epochs, learning_rate, params, t_u, t_c): for epoch in range(1, n_epochs + 1): if params.grad is not None: params.grad.zero_() t_p = model(t_u, *params) loss = loss_fn(t_p, t_c)loss.backward() with torch.no_grad(): params -= learning_rate * params.gradif epoch % 500 == 0: print('Epoch %d, Loss %f' % (epoch, float(loss))) return params

更新训练循环以在每个周期中清零梯度,并在没有梯度计算的上下文中更新参数。

#%%
params = training_loop(n_epochs = 3000,learning_rate = 1e-2,params = params,t_u = t_un,t_c = t_c
)

使用新的训练循环进行训练。

#%%
import torch.optim as optim
params = torch.tensor([1.0, 0.0], requires_grad=True)
learning_rate = 1e-5
optimizer = optim.SGD([params], lr=learning_rate)t_p = model(t_u, *params)
loss = loss_fn(t_p, t_c)
loss.backward()optimizer.step()
params

使用PyTorch的优化器(SGD)进行参数更新。

#%%
def training_loop(n_epochs, optimizer, params, t_u, t_c):for epoch in range(1, n_epochs + 1):t_p = model(t_u, *params)loss = loss_fn(t_p,t_c)optimizer.zero_grad()loss.backward()optimizer.step()if epoch % 500 == 0:print("Epoch %d, Loss %f" % (epoch, float(loss)))return params

更新训练循环以使用优化器进行参数更新。

#%%
params = torch.tensor([1.0, 0.0], requires_grad=True)
learning_rate = 1e-2
optimizer = optim.SGD([params], lr=learning_rate)training_loop(n_epochs = 5000,optimizer = optimizer,params = params,t_u = t_un,t_c = t_c
)

调用更新后的训练循环。

#%%
t_c = torch.tensor(t_c).unsqueeze(1)
t_u = torch.tensor(t_u).unsqueeze(1)

调整数据的形状,使其成为二维张量。

#%%
t_u.shape

检查数据的形状。

#%%
n_samples = t_u.shape[0]
n_val = int(0.2 * n_samples)shuffled_indices = torch.randperm(n_samples)train_indices = shuffled_indices[:-n_val]
val_indices = shuffled_indices[-n_val:]t_u_train = t_u[train_indices]
t_c_train = t_c[train_indices]t_u_val = t_u[val_indices]
t_c_val = t_c[val_indices]t_un_train = 0.1 * t_u_train
t_un_val = 0.1 * t_u_val

将数据划分为训练集和验证集,并对训练数据进行缩放。

#%%
import torch.nn as nnlinear_model = nn.Linear(1,1)
linear_model(t_un_val)

定义一个线性模型并进行前向传播。

#%%
x = torch.ones(10,1)
linear_model(x)

测试线性模型的前向传播。

#%%
optimizer = optim.SGD(linear_model.parameters(), lr=1e-2)
list(linear_model.parameters())

定义优化器并查看模型参数。

#%%
def train_loop(n_epochs, optimizer, model, loss_fn,t_u_train, t_u_val, t_c_train, t_c_val):for epoch in range(1, n_epochs + 1):t_p_train = model(t_u_train)loss_train = loss_fn(t_p_train, t_c_train)t_p_val = model(t_u_val)loss_val = loss_fn(t_p_val, t_c_val)optimizer.zero_grad()loss_train.backward()optimizer.step()if epoch == 1 or epoch % 1000 == 0:print(f"Epoch {epoch}, Training loss {loss_train.item():.4f},"f"Validation loss {loss_val.item():.4f}")

定义训练循环函数,包括训练和验证集的损失计算和模型更新。

#%%
def loss_fn(t_p, t_c):squared_diffs = (t_p - t_c)**2return squared_diffs.mean()linear_model = nn.Linear(1,1)
optimizer = optim.SGD(linear_model.parameters(), lr=1e-2)train_loop(n_epochs = 3000,optimizer = optimizer,model = linear_model,loss_fn = loss_fn,t_u_train = t_un_train,t_u_val = t_un_val,t_c_train = t_c_train,t_c_val = t_c_val)

定义损失函数并调用训练循环函数。

#%%
seq_model = nn.Sequential(nn.Linear(1,13),nn.Tanh(),nn.Linear(13,1))
seq_model

定义一个顺序模型,包含一个隐藏层和一个输出层。

#%%
from collections import OrderedDictseq_model = nn.Sequential(OrderedDict([('hidden_linear', nn.Linear(1, 8)),('hidden_activation', nn.Tanh()),('output_linear', nn.Linear(8,1))
]))seq_model

使用OrderedDict重新定义顺序模型。

#%%
optimizer = optim.SGD(seq_model.parameters(), lr = 1e-4)
train_loop(n_epochs = 10000,optimizer = optimizer,model = seq_model,loss_fn = nn.MSELoss(),t_u_train = t_un_train,t_u_val = t_un_val,t_c_train = t_c_train,t_c_val = t_c_val
)

使用新的顺序模型 seq_model 和均方误差损失函数(MSELoss),初始化优化器并运行训练循环,训练 10000 个周期。

#%%
print("output", seq_model(t_un_val))
print("answer", t_c_val)
print("hidden", seq_model.hidden_linear.weight.grad)

打印顺序模型在验证集上的预测输出和真实值,查看隐藏层线性变换的权重梯度。

#%%
import matplotlib.pyplot as pltt_range = torch.arange(20.,90.).unsqueeze(1)fig = plt.figure(dpi=600)
plt.xlabel("Fahrenheit")
plt.ylabel("Celsius")
plt.plot(t_u.numpy(), t_c.numpy(), 'o')
plt.plot(t_range.numpy(), seq_model(0.1 * t_range).detach().numpy(), 'c-')
plt.plot(t_u.numpy(), seq_model(0.1 * t_u).detach().numpy(), 'kx')
plt.show()

绘制图形来显示模型预测值与真实值的对比。
在这里插入图片描述
在这里插入图片描述

图中有三个部分:

  1. 圆点表示原始数据点。
  2. 青蓝色的线表示顺序模型在指定范围内的预测。
  3. 叉号表示模型在训练数据上的预测。

这个代码通过训练简单的线性模型和顺序模型(包含隐藏层)来预测摄氏温度。并展示了如何使用PyTorch的自动微分功能和优化器来更新模型参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里发布大模型发布图结构长文本处理智能体,超越GPT-4-128k

随着大语言模型的发展,处理长文本的能力成为了一个重要挑战。虽然有许多方法试图解决这个问题,但都存在不同程度的局限性。最近,阿里巴巴的研究团队提出了一个名为GraphReader的新方法,通过将长文本组织成图结构,并利用…

2,区块链、数字货币及其应用场景(react+区块链实战)

2,区块链、数字货币及其应用场景(react区块链实战) 一、什么是区块链?1 ibloackchain(1)安装ibloackchain(2)Blance查询余额(3)Mine挖矿(4&#x…

JavaScript中的拷贝技术探秘:浅拷贝与深拷贝的奥秘

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 JavaScript中的浅拷贝和深拷贝是非常重要的概念,它们在处理对象和数组时具有不同的作用。在编程中,经常需要复制数据以便进行各种操作,但必须注…

小波与傅里叶变换的对比(Python)

直接上代码,理论可以去知乎看。 #Import necessary libraries %matplotlib inline import numpy as np import matplotlib.pyplot as plt import seaborn as snsimport pywt from scipy.ndimage import gaussian_filter1d from scipy.signal import chirp import m…

基于 sftp 的 NAS (局域网文件存储服务器)

局域网 NAS (文件存储服务器) 的基本功能有: 能够存储文件, 同时能够通过多个设备访问 (上传/下载) 文件. 这些功能通过 sftp 可以实现. sftp 是基于 SSH 的文件传输协议, SSH 全程加密传输, 使用 公钥 认证 (不使用密码/口令), 能够提供很高的安全性. 上文说到, 在 LVM 和 bt…

谷粒商城-个人笔记(集群部署篇三)

前言 ​学习视频:​Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强​学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

古建筑倾斜在线监测系统:科技守护历史的创新实践

​ ​​在文化遗产保护的广阔领域中,古建筑的健康监测占据着举足轻重的地位。然而,传统的监测方法往往受限于布线复杂、安装难度大以及对古建筑本体可能造成的伤害等问题。近年来,一种新型的古建筑倾斜在线监测系统应运而生,它…

Halcon 模糊圆边的找圆案例

Halcon 模糊圆边的找圆案例 基本思路 1.将图像转成灰度图像 2.再观察要找到的区域的灰度值变化,找到前景与背景的具体数值。 3.根据找到的前景与背景的具体数值,增强图像对比度。(使图像变成黑白图片) 4.使用灰度直图工具进行阈值…

用Vue3和Plotly.js绘制交互式3D散点图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Plotly.js 创建 2D 密度图 应用场景介绍 密度图是一种可视化数据分布的图表,它显示了数据点的密度在不同区域的变化情况。在许多科学和工程领域中,密度图被广泛用于探索和分析数据…

5G(NR) NTN 卫星组网架构

5G(NR) NTN 卫星组网架构 参考 3GPP TR 38.821 5G NTN 技术适用于高轨、低轨等多种星座部署场景,是实现星地网络融合发展的可行技术路线。5G NTN 网络分为用户段、空间段和地面段三部分。其中用户段由各种用户终端组成,包括手持、便携站、嵌入式终端、车…

git撤销/返回到某次提交(idea工具 + gitbush)

不多说废话,直接展示使用。 方法一:使用idea工具进行返回 准备某次过度提交 使用idea打开git log 找到要回去的版本 点击右键选到reset 模式选hard,强制回滚 这个时候本地代码已经回归你指定的版本了。 这个时候再进行强制推送&#xff0c…

Drools开源业务规则引擎(三)- 事件模型(Event Model)

文章目录 Drools开源业务规则引擎(三)- 事件模型(Event Model)1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…

09 docker 安装tomcat 详解

目录 一、安装tomcat 1. tomcat镜像的获取 2. docker创建容器实列 3. 访问测试 404错误 4. 解决方案 5. 使用免修改版容器镜像 5.1. 运行实列的创建 5.2. 出现问题及解决: 6. 验证 OK 一、安装tomcat 1. tomcat镜像的获取 docker search tomcat #docker …

SCI二区TOP|蜘蛛黄蜂优化算法(SWO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年,M Abdel-Basset受到蜘蛛黄蜂优化社会行为启发,提出了蜘蛛黄蜂优化算法(Spider Wasp Optimizer, SWO)。 2.算法原理 2.1算法思想 S…

视频监控技术在食品安全监管中的关键应用

视频监控技术在食品安全监管中的关键应用 1、视频监控技术在食品安全监管中的作用 在食品安全监管中,视频监控技术发挥着不可替代的作用。通过安装视频监控系统,可以实现对食品生产、运输、储存等各个环节的实时监控和录像存储。这不仅有助于监管部门及…

Linux的前世今生

Unix的起源和发展 1969年,AT&T贝尔实验室的Ken Thompson和Dennis Ritchie等人开发了Unix操作系统。Unix的设计理念强调小而简洁的工具,文本流和系统模块化,这些理念后来成为Linux开发的重要基础。1973年,Unix用C语言重新编写…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置(transpose)矩阵与向量的转化 线性代数-张量(tensor…

卷技术还是卷应用?李彦宏给出了明确答案

如何理解李彦宏说的“不要卷模型,要卷应用” 引言 7月4日,2024世界人工智能大会在上海世博中心召开。百度创始人兼CEO李彦宏在产业发展主论坛上呼吁:“大家不要卷模型,要卷应用!”这句话引起了广泛讨论。李彦宏认为&a…

Python股票计算小程序(字符串格式化练习)

要求:打印的第一行使用f控制,第二行打印使用占位符,股价输出保留两位小数。 # 股价计算小程序 name"周氏集团" stock_price19.99 stock_code "9283" stock_price_daily_growth_factor1.2 growth_days7print(f"公司…

【Python进阶】继承进阶和私有权限

目录 一、继承进阶 1、方法重写 2、调用父类方法 3、多层继承 二、私有权限 1、私有属性 2、私有方法 面向对象基础:小白也能看懂的Python基础教程(8)-CSDN博客 一、继承进阶 1、方法重写 当父类的同名方法达不到子类的要求&#x…