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://xiahunao.cn/news/3223535.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Argo CD入门、实战指南

1. Argo CD概述 1.1 什么是 Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 1.2 为什么选择 Argo CD 应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。 2. Argo CD基础知识 在有效使用 Ar…

3-6 构建线性模型解决温度计示数转换问题

3-6 构建线性模型解决温度计示数转换问题 直接上源码 %matplotlib inline import numpy as np import torch torch.set_printoptions(edgeitems2, linewidth75)导入必要的库并设置 PyTorch 的打印选项,确保在打印张量时显示边缘项和行宽。 #%% t_c [0.5, 14.0,…

Windows C++ vs2022环境中下载、安装和使用osmesa

第一步:安装 MinGW-w64 请参考这篇文章进行安装: 在Windows中安装MinGW-w64最新版本 第二步:安装DirectX SDK 请参考这篇文章进行安装: 下载安装Microsoft DirectX SDK(June 2010) 第三步:安装Windows SDK 请参考这篇…

书生大模型实战营(暑假场)-入门岛-第一关

书生大模型实战营暑假场重磅开启!,这场学习路线看起来很好玩呀,闯关学习既能学到知识又有免费算力可得,太良心啦。感兴趣的小伙伴赶快一起报名学习吧!!! 关卡任务 好的,我们废话不多…

【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形

二维数组的动态规划——0/1矩阵、最大正方形 最大正方形1277. 统计全为 1 的正方形子矩阵221. 最大正方形 01矩阵542. 01 矩阵 最大正方形 下面两个题目是非常相似的,只是一个统计正方形数目,一个统计最大正方形的面积。 1277. 统计全为 1 的正方形子矩…

2.5章节python中布尔类型

在Python中,布尔类型(Boolean type)用于表示真(True)或假(False)的值。这是编程中非常基础且重要的一个概念,因为它允许程序进行条件判断,从而根据条件执行不同的代码块。…

如何写出一篇高质量的新闻稿,纯干货

对于企业宣传来说,新闻稿的发布是常用的一种宣传推广的营销方式,新闻稿可以让消费者及时了解企业的最新发展动态,增加企业品牌的曝光度。 一篇高质量新闻稿不仅能作为品牌背书,还很可能会被各大媒体转载,短时间内提高企…

GS Quant——一个用于量化金融的 Python 工具包【送源码】

GS Quant是一个用于量化金融的 Python 工具包,GS 其实就是 Goldman Sachs 高盛集团的缩写。 GS Quant 的功能主要涵盖了以下几个方面: 内置很多金融衍生品定价模型,涵盖多个资产类别 提供了公司内部及市场的数据接口,便于监测 …

LeNet原理及代码实现

目录 1.原理及介绍 2.代码实现 2.1model.py 2.2model_train.py 2.3model.test.py 1.原理及介绍 2.代码实现 2.1model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__…

价格疑云?格行WiFi创始人亲解谜团,性价比之王如何炼成?

随身wifi行业乱象频出,作为行业领跑品牌的格行随身wifi,关于价格问题一直备受质疑。关于设备上的“格行自有格行的骄傲”也被外界认定为是自大,甚至发展的线下一万多家门店也被同行不认可。近日,企业财经专访记者有幸采访了格行随…

Xilinx原语

1. 原语介绍 原语是 Xilinx 器件底层硬件中的功能模块,它使用专用的资源来实现一系列的功能。相比于 IP 核,原语的调用方法更简单,但是一般只用于实现一些简单的功能。本章主要用到了 BUFG、 BUFIO、 IDDR、 ODDR、IDELAYE2 和 IDELAYCTRL。…

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video(对视频数据微调)Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

AI发展的新方向:从卷模型到卷应用

在2024年7月4日于上海世博中心举办的世界人工智能大会暨人工智能全球治理高级别会议全体会议上,百度创始人、董事长兼首席执行官李彦宏发表了一段引人深思的演讲。他在产业发展主论坛上提出:“大家不要卷模型,要卷应用!”这句话道…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示BME280传感器数据

LCD ST7735显示BME280传感器数据 文章目录 LCD ST7735显示BME280传感器数据1、硬件准备与接线2、代码实现本文中将介绍如何使用 ESP8266 NodeMCU 板(ESP12-E 模块)和 BME280 气压、温度和湿度传感器构建气象站。 NodeMCU 微控制器 (ESP8266EX) 从 BME280 传感器读取温度、湿度…

注解复习(java)

文章目录 注解内置注解**Deprecated**OverrideSuppressWarnings【不建议使用】Funcationallnterface 自定义注解元注解RetentionTargetDocumentedInherited 和 Repeatable 反射注解 前言:笔记基于动力节点 注解 注解可以标注在 类上,属性上&#xff0c…

pdf容量大小怎么改,pdf容量太大怎么变小

在数字化时代,pdf文件因其稳定性和跨平台兼容性而成为工作、学习和生活中不可或缺的文件格式。然而,随着文件内容的丰富,pdf文件的体积也日益增大,给存储和传输带来了不少困扰。本文将为你详细介绍多种实用的pdf文件压缩方法&…

linux watchdog 子系统

目录 一、watchdog 子系统二、关键数据结构2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 设备注册3.3 watchdog 设备文件操作函数3.4 watchdog 喂狗用户空间 watchdog(busybox)内核空间喂狗疑问 …

浏览器开发者视角及CSS表达式选择元素

点击想要查看的接口,然后点击检查,便可以切换到该接口对应的html代码 如果F12不起作用的话,点击更多工具,然后选择开发者工具即可 ctrlF可以去查阅相关的CSS表达式选择元素 如果没有加#t1,那么表示的是选择所有的p 使用…

Start LoongArch64 Alpine Linux VM on x86_64

一、Build from source(build on x86_64) Obtain the latest libvirt, virt manager, and QEMU source code, compile and install them 1.1 Build libvirt from source sudo apt-get update sudo apt-get install augeas-tools bash-completion debhelper-compat dh-apparmo…

Qt 异步实现事件的定时执行 - QTimer和QThread的联合使用

异步实现事件的定时执行 - QTimer和QThread的联合使用 引言一、核心源码二、其信号和槽函数简述三、定时器及其moveToThread简述 引言 在 Qt 中,如果想要定时执行某些事件或函数,通常会使用 QTimer 类。QTimer 允许设置一个时间间隔,当这个时…