第R4周:LSTM-火灾温度预测
文章目录
- 一、前期准备工作
- 1.导入数据
- 2. 数据集可视化
- 二、构建数据集
- 1. 数据集预处理
- 2. 设置X, y
- 3. 划分数据集
- 三、模型训练
- 1. 构建模型
- 2. 定义训练函数
- 3. 定义测试函数
- 4. 正式训练模型
- 四、模型评估
- 1. Loss图片
- 2. 调用模型进行预测
- 3. R2值评估
- 总结:
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
一、前期准备工作
import torch.nn.functional as F
import numpy as np
import pandas as pd
import torch
from torch import nn
1.导入数据
data = pd.read_csv("woodpine2.csv")data
Time | Tem1 | CO 1 | Soot 1 | |
---|---|---|---|---|
0 | 0.000 | 25.0 | 0.000000 | 0.000000 |
1 | 0.228 | 25.0 | 0.000000 | 0.000000 |
2 | 0.456 | 25.0 | 0.000000 | 0.000000 |
3 | 0.685 | 25.0 | 0.000000 | 0.000000 |
4 | 0.913 | 25.0 | 0.000000 | 0.000000 |
... | ... | ... | ... | ... |
5943 | 366.000 | 295.0 | 0.000077 | 0.000496 |
5944 | 366.000 | 294.0 | 0.000077 | 0.000494 |
5945 | 367.000 | 292.0 | 0.000077 | 0.000491 |
5946 | 367.000 | 291.0 | 0.000076 | 0.000489 |
5947 | 367.000 | 290.0 | 0.000076 | 0.000487 |
5948 rows × 4 columns
2. 数据集可视化
import matplotlib.pyplot as plt
import seaborn as snsplt.rcParams['savefig.dpi'] = 500 #图片像素
plt.rcParams['figure.dpi'] = 500 #分辨率fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(14, 3))sns.lineplot(data=data["Tem1"], ax=ax[0])
sns.lineplot(data=data["CO 1"], ax=ax[1])
sns.lineplot(data=data["Soot 1"], ax=ax[2])
plt.show()
dataFrame = data.iloc[:,1:]dataFrame
Tem1 | CO 1 | Soot 1 | |
---|---|---|---|
0 | 25.0 | 0.000000 | 0.000000 |
1 | 25.0 | 0.000000 | 0.000000 |
2 | 25.0 | 0.000000 | 0.000000 |
3 | 25.0 | 0.000000 | 0.000000 |
4 | 25.0 | 0.000000 | 0.000000 |
... | ... | ... | ... |
5943 | 295.0 | 0.000077 | 0.000496 |
5944 | 294.0 | 0.000077 | 0.000494 |
5945 | 292.0 | 0.000077 | 0.000491 |
5946 | 291.0 | 0.000076 | 0.000489 |
5947 | 290.0 | 0.000076 | 0.000487 |
5948 rows × 3 columns
二、构建数据集
1. 数据集预处理
from sklearn.preprocessing import MinMaxScalerdataFrame = data.iloc[:,1:].copy()
sc = MinMaxScaler(feature_range=(0, 1)) #将数据归一化,范围是0到1for i in ['CO 1', 'Soot 1', 'Tem1']:dataFrame[i] = sc.fit_transform(dataFrame[i].values.reshape(-1, 1))dataFrame.shape
(5948, 3)
2. 设置X, y
width_X = 8
width_y = 1##取前8个时间段的Tem1、CO 1、Soot 1为X,第9个时间段的Tem1为y。
X = []
y = []in_start = 0for _, _ in data.iterrows():in_end = in_start + width_Xout_end = in_end + width_yif out_end < len(dataFrame):X_ = np.array(dataFrame.iloc[in_start:in_end , ])y_ = np.array(dataFrame.iloc[in_end :out_end, 0])X.append(X_)y.append(y_)in_start += 1X = np.array(X)
y = np.array(y).reshape(-1,1,1)X.shape, y.shape
((5939, 8, 3), (5939, 1, 1))
检查数据集中是否有空值
print(np.any(np.isnan(X)))
print(np.any(np.isnan(y)))
False
False
3. 划分数据集
X_train = torch.tensor(np.array(X[:5000]), dtype=torch.float32)
y_train = torch.tensor(np.array(y[:5000]), dtype=torch.float32)X_test = torch.tensor(np.array(X[5000:]), dtype=torch.float32)
y_test = torch.tensor(np.array(y[5000:]), dtype=torch.float32)
X_train.shape, y_train.shape
(torch.Size([5000, 8, 3]), torch.Size([5000, 1, 1]))
from torch.utils.data import TensorDataset, DataLoadertrain_dl = DataLoader(TensorDataset(X_train, y_train),batch_size=64, shuffle=False)test_dl = DataLoader(TensorDataset(X_test, y_test),batch_size=64, shuffle=False)
三、模型训练
1. 构建模型
class model_lstm(nn.Module):def __init__(self):super(model_lstm, self).__init__()self.lstm0 = nn.LSTM(input_size=3 ,hidden_size=320, num_layers=1, batch_first=True)self.lstm1 = nn.LSTM(input_size=320 ,hidden_size=320, num_layers=1, batch_first=True)self.fc0 = nn.Linear(320, 1)def forward(self, x):out, hidden1 = self.lstm0(x) out, _ = self.lstm1(out, hidden1) out = self.fc0(out) return out[:, -1:, :] #取1个预测值,否则经过lstm会得到8*1个预测model = model_lstm()
model
model_lstm((lstm0): LSTM(3, 320, batch_first=True)(lstm1): LSTM(320, 320, batch_first=True)(fc0): Linear(in_features=320, out_features=1, bias=True)
)
model(torch.rand(30,8,3)).shape
torch.Size([30, 1, 1])
2. 定义训练函数
# 训练循环
import copy
def train(train_dl, model, loss_fn, opt, lr_scheduler=None):size = len(train_dl.dataset) num_batches = len(train_dl) train_loss = 0 # 初始化训练损失和正确率for x, y in train_dl: x, y = x.to(device), y.to(device)# 计算预测误差pred = model(x) # 网络输出loss = loss_fn(pred, y) # 计算网络输出和真实值之间的差距# 反向传播opt.zero_grad() # grad属性归零loss.backward() # 反向传播opt.step() # 每一步自动更新# 记录losstrain_loss += loss.item()if lr_scheduler is not None:lr_scheduler.step()print("learning rate = {:.5f}".format(opt.param_groups[0]['lr']), end=" ")train_loss /= num_batchesreturn train_loss
3. 定义测试函数
def test (dataloader, model, loss_fn):size = len(dataloader.dataset) # 测试集的大小num_batches = len(dataloader) # 批次数目test_loss = 0# 当不进行训练时,停止梯度更新,节省计算内存消耗with torch.no_grad():for x, y in dataloader:x, y = x.to(device), y.to(device)# 计算lossy_pred = model(x)loss = loss_fn(y_pred, y)test_loss += loss.item()test_loss /= num_batchesreturn test_loss
4. 正式训练模型
#设置GPU训练
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
device(type=‘cpu’)
#训练模型
model = model_lstm()
model = model.to(device)
loss_fn = nn.MSELoss() # 创建损失函数
learn_rate = 1e-1 # 学习率
opt = torch.optim.SGD(model.parameters(),lr=learn_rate,weight_decay=1e-4)
epochs = 50
train_loss = []
test_loss = []
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt,epochs, last_epoch=-1) for epoch in range(epochs):model.train()epoch_train_loss = train(train_dl, model, loss_fn, opt, lr_scheduler)model.eval()epoch_test_loss = test(test_dl, model, loss_fn)train_loss.append(epoch_train_loss)test_loss.append(epoch_test_loss)template = ('Epoch:{:2d}, Train_loss:{:.5f}, Test_loss:{:.5f}')print(template.format(epoch+1, epoch_train_loss, epoch_test_loss))print("="*20, 'Done', "="*20)
learning rate = 0.09990 Epoch: 1, Train_loss:0.00123, Test_loss:0.01228
learning rate = 0.09961 Epoch: 2, Train_loss:0.01404, Test_loss:0.01183
learning rate = 0.09911 Epoch: 3, Train_loss:0.01365, Test_loss:0.01135
learning rate = 0.09843 Epoch: 4, Train_loss:0.01321, Test_loss:0.01085
learning rate = 0.09755 Epoch: 5, Train_loss:0.01270, Test_loss:0.01029
learning rate = 0.09649 Epoch: 6, Train_loss:0.01212, Test_loss:0.00968
learning rate = 0.09524 Epoch: 7, Train_loss:0.01144, Test_loss:0.00901
learning rate = 0.09382 Epoch: 8, Train_loss:0.01065, Test_loss:0.00827
learning rate = 0.09222 Epoch: 9, Train_loss:0.00975, Test_loss:0.00748
learning rate = 0.09045 Epoch:10, Train_loss:0.00876, Test_loss:0.00665
learning rate = 0.08853 Epoch:11, Train_loss:0.00769, Test_loss:0.00580
learning rate = 0.08645 Epoch:12, Train_loss:0.00658, Test_loss:0.00497
learning rate = 0.08423 Epoch:13, Train_loss:0.00548, Test_loss:0.00418
learning rate = 0.08187 Epoch:14, Train_loss:0.00444, Test_loss:0.00346
learning rate = 0.07939 Epoch:15, Train_loss:0.00349, Test_loss:0.00283
learning rate = 0.07679 Epoch:16, Train_loss:0.00268, Test_loss:0.00230
learning rate = 0.07409 Epoch:17, Train_loss:0.00200, Test_loss:0.00188
learning rate = 0.07129 Epoch:18, Train_loss:0.00147, Test_loss:0.00154
learning rate = 0.06841 Epoch:19, Train_loss:0.00107, Test_loss:0.00129
learning rate = 0.06545 Epoch:20, Train_loss:0.00078, Test_loss:0.00110
learning rate = 0.06243 Epoch:21, Train_loss:0.00057, Test_loss:0.00096
learning rate = 0.05937 Epoch:22, Train_loss:0.00042, Test_loss:0.00085
learning rate = 0.05627 Epoch:23, Train_loss:0.00032, Test_loss:0.00078
learning rate = 0.05314 Epoch:24, Train_loss:0.00025, Test_loss:0.00072
learning rate = 0.05000 Epoch:25, Train_loss:0.00021, Test_loss:0.00068
learning rate = 0.04686 Epoch:26, Train_loss:0.00017, Test_loss:0.00065
learning rate = 0.04373 Epoch:27, Train_loss:0.00015, Test_loss:0.00062
learning rate = 0.04063 Epoch:28, Train_loss:0.00014, Test_loss:0.00060
learning rate = 0.03757 Epoch:29, Train_loss:0.00013, Test_loss:0.00059
learning rate = 0.03455 Epoch:30, Train_loss:0.00012, Test_loss:0.00058
learning rate = 0.03159 Epoch:31, Train_loss:0.00012, Test_loss:0.00057
learning rate = 0.02871 Epoch:32, Train_loss:0.00011, Test_loss:0.00056
learning rate = 0.02591 Epoch:33, Train_loss:0.00011, Test_loss:0.00055
learning rate = 0.02321 Epoch:34, Train_loss:0.00011, Test_loss:0.00055
learning rate = 0.02061 Epoch:35, Train_loss:0.00011, Test_loss:0.00055
learning rate = 0.01813 Epoch:36, Train_loss:0.00012, Test_loss:0.00055
learning rate = 0.01577 Epoch:37, Train_loss:0.00012, Test_loss:0.00055
learning rate = 0.01355 Epoch:38, Train_loss:0.00012, Test_loss:0.00056
learning rate = 0.01147 Epoch:39, Train_loss:0.00012, Test_loss:0.00056
learning rate = 0.00955 Epoch:40, Train_loss:0.00013, Test_loss:0.00057
learning rate = 0.00778 Epoch:41, Train_loss:0.00013, Test_loss:0.00058
learning rate = 0.00618 Epoch:42, Train_loss:0.00014, Test_loss:0.00058
learning rate = 0.00476 Epoch:43, Train_loss:0.00014, Test_loss:0.00059
learning rate = 0.00351 Epoch:44, Train_loss:0.00014, Test_loss:0.00059
learning rate = 0.00245 Epoch:45, Train_loss:0.00014, Test_loss:0.00059
learning rate = 0.00157 Epoch:46, Train_loss:0.00014, Test_loss:0.00060
learning rate = 0.00089 Epoch:47, Train_loss:0.00014, Test_loss:0.00060
learning rate = 0.00039 Epoch:48, Train_loss:0.00014, Test_loss:0.00060
learning rate = 0.00010 Epoch:49, Train_loss:0.00014, Test_loss:0.00060
learning rate = 0.00000 Epoch:50, Train_loss:0.00014, Test_loss:0.00060
==================== Done ====================
四、模型评估
1. Loss图片
import matplotlib.pyplot as plt
from datetime import datetime
current_time = datetime.now() # 获取当前时间plt.figure(figsize=(5, 3),dpi=120)plt.plot(train_loss , label='LSTM Training Loss')
plt.plot(test_loss, label='LSTM Validation Loss')plt.title('Training and Validation Loss')
plt.xlabel(current_time) # 打卡请带上时间戳,否则代码截图无效
plt.legend()
plt.show()
2. 调用模型进行预测
predicted_y_lstm = sc.inverse_transform(model(X_test).detach().numpy().reshape(-1,1)) # 测试集输入模型进行预测
y_test_1 = sc.inverse_transform(y_test.reshape(-1,1))
y_test_one = [i[0] for i in y_test_1]
predicted_y_lstm_one = [i[0] for i in predicted_y_lstm]plt.figure(figsize=(5, 3),dpi=120)
# 画出真实数据和预测数据的对比曲线
plt.plot(y_test_one[:2000], color='red', label='real_temp')
plt.plot(predicted_y_lstm_one[:2000], color='blue', label='prediction')plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
3. R2值评估
from sklearn import metrics
"""
RMSE :均方根误差 -----> 对均方误差开方
R2 :决定系数,可以简单理解为反映模型拟合优度的重要的统计量
"""
RMSE_lstm = metrics.mean_squared_error(predicted_y_lstm_one, y_test_1)**0.5
R2_lstm = metrics.r2_score(predicted_y_lstm_one, y_test_1)print('均方根误差: %.5f' % RMSE_lstm)
print('R2: %.5f' % R2_lstm)
均方根误差: 6.92733
R2: 0.83259
总结:
本周主要学习了LSTM模型,并且通过实践更加深入地了解到了LSTM模型。
相关文章:
第R4周:LSTM-火灾温度预测
文章目录 一、前期准备工作1.导入数据2. 数据集可视化 二、构建数据集1. 数据集预处理2. 设置X, y3. 划分数据集 三、模型训练1. 构建模型2. 定义训练函数3. 定义测试函数4. 正式训练模型 四、模型评估1. Loss图片2. 调用模型进行预测3. R2值评估 总结: ἶ…...
Linux文件管理完全指南:从命名规则到压缩解压
一、文件命名规则:避免踩坑的关键 1. 允许的字符与命名建议 允许字符:除 / 外所有字符均可使用,但需避免 <, >, ?, * 等特殊符号。 命名建议: 统一使用小写字母(Linux严格区分大小写)。 用下划线…...
react和vue的区别之一
前言 小编在学react的时候,发现react在使用ant-design组件的from表单,有点惊奇,跟vue差别确实有点大。 1-React 与 Vue 表单处理对比指南 核心差异概述 特性VueReact (Ant Design Form)数据定义必须显式定义 reactive/ref通过 name 隐式定…...
电力系统最小惯性常数解析
1. 什么是惯性常数? 电力系统的惯性常数(Inertia Constant)可以理解为系统抵抗频率突变的能力,类似于“惯性”。传统电力系统中,同步发电机(如火电厂)的旋转部件(如涡轮、转子&…...
Linux软硬链接和动静态库(20)
文章目录 前言一、软硬链接基本认知实现原理应用场景取消链接ACM时间 二、动静态库认识库库的作用 三、制作静态库静态库的打包静态库的使用 四、制作动态库动态区的打包动态库的链接与使用动态库的链接原理 总结 前言 我有款非常喜欢玩的游戏,叫做《饥荒》…...
FX10(CYUSB4014)USB3.2(10Gbps)开发笔记分享(1):硬件设计与开发环境搭建
作者:Hello,Panda 大家早上好,中午好,下午好,晚上好,熊猫君又来了。这次计划做一个连载,大概6期左右,主要介绍英飞凌最新的FX5/10/20的器件应用。目前,熊猫君手上调试的…...
【工具变量】上市公司-“链主“企业相关数据(2001-2024年)
上市公司的"链主企业"(Anchor Enterprise)指在其供应链中具有较较高中心度的公司。这些公司通过其规模、技术优势、资源整合能力等,影响和带动整个产业链的发展与运作。这些企业往往是供应链中最重要的节点,其决策和行为…...
Qt知识点1『16进制数值与文本互相转换』
工作中可能会遇到QByteArray保存着16进制的数据,例如网络传输中的数据在抓包软件下就会显示为16进制的文本格式。本次是在串口通讯首发消息时遇到的这类转换问题,做一下记录。 一、16进制的文本字符串如何转换数值 解决:形如QString("0…...
MongoDB Shard Cluster
# MongoDB Shard Cluster 集群规划 132上面单独安装mongos 在 1,2,3上面安装shard1和config 在 4,5,6上面安装shard2 节点host如下 172.20.192.20 member1.blockin.ai 172.20.192.21 member2.blockin.ai 172.20.192.31 member3.blockin.ai …...
Pycharm(六):可变与不可变类型
一、引用 在java中既有值传递,也有引用传递,我们思考一下在python中值的传递方式是哪种类型呢? 答案是引用传递。 概述: Python中存储变量是需要占用内存空间的,为了更好地管理这些空间,每块空间都是有自己的地址值的。 格式: id(变量名/值) 可以查看变量/…...
每日算法-250425
每日算法打卡 - 2025年4月25日 记录今天完成的几道 LeetCode 算法题,分享解题思路和代码。 2178. 拆分成最多数目的正偶数之和 题目 解题思路 贪心算法 解题过程 题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。 为了使拆分出的数字数量…...
github把自己的jar包发送到maven中央仓库
maven中央仓库注册账号 《Maven中央仓库官网》 注册账号 直接使用github账号 他会自动帮我们创建一个github的命名空间 获取自己的User Token 切记立马复制、保存username和password,后面maven的settings.xml会用到,因为这个页面会在一分钟以后自动关闭…...
链表系列一>两两交换链表中的结点
目录 题目:解析:代码: 题目: 链接: link 解析: 代码: /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int va…...
【深度强化学习 DRL 快速实践】异步优势演员评论员算法 (A3C)
Asynchronous Advantage Actor-Critic A3C (2016, DeepMind) 异步优势演员评论员算法 (A3C): 继承 actor-critic 的优势,同时通过异步多线程 (团队作战) 加速了训练过程 model-free, actor-critic 核心改进点说明异步并行训练 – Asynchronous (无经验回放)通过多个…...
240425 leetcode exercises
240425 leetcode exercises jarringslee 文章目录 240425 leetcode exercises[147. 对链表进行插入排序](https://leetcode.cn/problems/insertion-sort-list/)🔁插入排序 [1721. 交换链表中的节点](https://leetcode.cn/problems/swapping-nodes-in-a-linked-list…...
找三维gis开发的工作,Mapbox要学到什么程度?
Mapbox 是⼀个可以创建各种⾃定义地图的⽹站,如 Pinterest、Evernote、Github、500px 等⼤牌都使⽤ Mapbox 创建⾃⼰的地图,Mapbox 宣称要构建世界上最漂亮的地图。已为 Foursquare、Pinterest、Evernote、⾦融时报、天⽓频道、优步科技 等公司的⽹站提供…...
ThinkPHP6模型中多组条件逻辑或Or查询的使用
直接进入正题,如我们的查询条件是这样的: (age > 20 and job_id 3) or (sex 1 and age < 20) 上面两组数据之间是 Or 的关系。 可使用两个闭包进行查询,代码如下: $map1 [age > 30,sex > $id,];$map2 …...
《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...
netcore8.0项目发布到centos,利用nginx反向代理(宝塔面板篇)
1、发布netcore项目 在program.cs中配置nginx代理 // 添加Nginx反向代理支持 builder.Services.Configure<ForwardedHeadersOptions>(options > {options.ForwardedHeaders ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;options.KnownNetwo…...
项目笔记1:通用 Service的常见方法
通用 Service 通常封装了常见的业务逻辑操作,以提高代码的复用性和可维护性。不同的框架和业务场景下,通用 Service 的方法会有所差异,但一般都会包含一些基本的增删改查(CRUD)操作,以下为你详细介绍&#…...
VUE3父子组件defineModel动态值获取及处理
需求:子组件获取父组件value值时需处理,子组件加载时用onMounted,value变化时用watch 父组件: <template><div><p>父组件的值: {{ parentValue }}</p><button click"changeValue">改变…...
CUDA编程之Grid、Block、Thread线程模型
一、线程模型:Grid、Block、Thread概念 1. 层级定义 Thread(线程) CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间。 Block(线程块) 由多个线程组成(通常为32的倍数),是逻辑上的并…...
BT151-ASEMI无人机专用功率器件BT151
编辑:ll BT151-ASEMI无人机专用功率器件BT151 型号:BT151 品牌:ASEMI 封装:TO-220F 批号:最新 引脚数量:3 特性:单向可控硅 工作温度:-40℃~150℃ BT151单向可控硅产品解…...
无人机环境适应性与稳定性技术要点!
1. 环境感知与传感器融合 多传感器集成:结合IMU(惯性测量单元)、GPS、气压计、激光雷达(LiDAR)、视觉传感器(RGB/深度相机)、超声波等,实现冗余数据采集。 实时环境建模࿱…...
BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化
引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...
HTMLcss实现网站抽奖
代码由 HTML、CSS 和 JavaScript 三部分组成,HTML 负责页面的结构搭建,CSS 负责页面的样式设计,JavaScript 负责实现抽奖的交互逻辑。 HTML 部分 <!DOCTYPE html> <html lang"en"><head><meta charset"…...
字节:视频一致性生成论文速读
一、引言 Phantom: Subject-Consistent Video Generation via Cross-Modal Alignment 是北京字节跳动智能创作团队提出的一种新型视频生成方法,旨在解决主体一致性视频生成的难题。该方法通过平衡文本和图像的双重模态提示,实现文本和视觉内容的深度对齐…...
JAVA常用分布式锁Redisson
1. 加锁过程 底层命令与数据结构 Redis 数据结构:使用 Hash 结构存储锁信息,Key 为锁名称,Field 为客户端唯一标识(如 UUID 线程ID),Value 为锁的重入次数。 Lua 脚本原子性:通过 Lua 脚本在…...
9.ArkUI List的介绍和使用
ArkUI List 组件详解与使用指南 List 是 ArkUI(HarmonyOS 开发框架)中用于展示长列表数据的高性能滚动容器组件。以下是 List 的详细介绍和使用方法。 基本介绍 List 组件特点: 支持垂直/水平滚动高性能渲染(仅渲染可视区域内…...
深度解析:从12306看混合云架构下的高并发系统设计
作为曾参与12306余票查询系统高并发升级的技术从业者,笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思,特此分享十年前的架构解密文献(该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode,代码库详见…...
解决 EasyExcel 填充图片占满单元格问题
本篇主要记录解决使用EasyExcel 填充图片的两个问题: 1. 如何根据标识填充 2.如果完全占满要显示的单元格 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.data.ImageData; import com.alibaba.e…...
汽车售后 D - PDU 和 J2543 详细介绍
D - PDU(Diagnostic Protocol Data Unit) 定义与标准1:D - PDU 是指诊断协议数据单元,ISO 22900 - 2 - 2017 D - PDU - API 是针对道路车辆的模块化车辆通信接口(MVCI)中诊断协议数据单元的编程接口标准。…...
【linux】Chrony服务器
简介 1.1 时间的重要性 由于 IT 系统中,准确的计时非常重要,有很多种原因需要准确计时: 在网络传输中,数据包括和日志需要准确的时间戳 各种应用程序中,如订单信息,交易信息等 都需要准确的时间戳 1.2 时区…...
深度剖析!GPT-image-1 API 开放对 AI 绘画技术生态的冲击!
4月24日凌晨,OpenAI正式发布了全新的图像生成模型“gpt-image-1”,并通过API向全球开发者开放使用,这意味着其GPT-4o的图像生成能力正式向开发者开放! 在这之前,GPT-4o的图像生成功能于今年3月25日由 OpenAI 创始人兼 …...
天能资管(SkyAi):精准投资匹配,定制资产配置新体验
在资产配置领域,随着市场环境的日益复杂和投资者需求的日益多样化,个性化和精准化已成为投资者最为关注的核心诉求。天能资管(SkyAi)作为新加坡BEAVER TOKEN基金会旗下的科技先锋,凭借其强大的AI技术和丰富的市场经验,创新性地推出了精准投资匹配服务,为投资者带来了前所未有的…...
volatile缓存可见性实现原理
1.缓存一致性问题 在多核处理器架构中,每个核心都有自己的缓存(Cache),而主内存是所有核心共享的。当一个线程在某个核心上修改了一个共享变量时,这个修改可能只会更新到该核心的缓存中,并不会立刻写回到主…...
【计算机视觉】CV实战- 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection
深入解析基于HOGSVM的行人检测系统:从理论到实践 技术核心:HOGSVM检测框架HOG特征原理SVM分类器 项目架构与数据准备INRIA Person数据集目录结构 实战指南:从零构建检测系统环境配置完整训练流程检测应用 关键技术问题与解决方案1. 难例挖掘不…...
HDRnet——双边滤波和仿射变换的摇身一变
主页:Deep Bilateral Learning paper:https://groups.csail.mit.edu/graphics/hdrnet/data/hdrnet.pdf coeffs 这部分的处理对象是低分辨率图,利用CNN进行特征提取(局部和全局),最后fuse得到gridÿ…...
Spring的xxxAware接口工作原理-笔记
1.Aware 接口的工作原理 Spring 提供了多个 XXXAware 接口(如 ApplicationEventPublisherAware、ApplicationContextAware、BeanFactoryAware 等),这些接口的核心作用是让 Bean 在初始化过程中自动获取特定的依赖。 实现 Aware 接口的 Bean…...
flume整合Kafka和spark-streaming核心编程
flume整合Kafka 需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 1.查看topic 2.编辑flume-Kafka.conf,并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…...
第十四届蓝桥杯刷题——day20
第十四届蓝桥杯刷题——day20 引言题目一:工作时长题目二:与或异或题目三:翻转题目四:阶乘的和题目五:公因数匹配附录:源码gitee仓库 引言 蓝桥杯C研究生组(河北赛区)快要开赛了&…...
Python MCP客户端SDK实现
以下是一个用于与大模型MCP协议交互的Python客户端SDK实现: ```python import json import requests import uuid from typing import Dict, List, Any, Optional, Union from enum import Enum from datetime import datetime class MCPTaskType(Enum): TEXT_GENERATION…...
使用el-table表格动态渲染表头数据之后,导致设置fixed的列渲染出现问题
问题如下: 解决方法: 使用$nextTick和v-if,让el-table在页面渲染完成之后再显示 <el-table v-if"visile"></el-table> 获取数据的方法 getdata(){ //这里处理数据 this.visilefalse //不显示table组件 this.$nex…...
Vue 3 父子组件通信案例详解:Props 与 Emits 实战
前言 在 Vue 3 开发中,组件通信是最基础也是最重要的技能之一。本文将用实际案例演示 Vue 3 中最常用的两种父子通信方式:Props(父传子)和 Emits(子传父),帮助大家快速掌握 Composition API 下…...
kotlin与MVVM结合使用总结(三)
1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM(Model - View - ViewModel)架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层,实现了视图和数据的分离,提高了代码的可维护性和可测试性…...
前端基础之《Vue(11)—自定义指令》
一、自定义指令 1、自己封装指令 什么是指令?指令本质上就是DOM功能的一种抽象封装。 如果有一些DOM功能经常用,但是Vue没有提供相关指令,建议自己封装。 2、自定义全局指令 使用Vue.directive(指令名, function() {})定义全局指令。 3、…...
第3.2节 Android应用调用链路分析
3.2.1 Android调用链路简介 在Android应用程序中,调用链路涉及应用程序中不同组件(如Activity、Service、BroadcastReceiver、ContentProvider)之间的调用关系,以及应用程序与系统服务之间的交互。了解和分析这些调用链路对于调试…...
Codeforces Round 1019 (Div. 2) ABC
A 模拟 思路 数组y是不同的,且所以xi * yi 相同,只有x数组全不同才可以满足要求 代码 LL n,m,k;void solve() {map<LL,LL> mp;cin >> n;for (int i 1;i < n;i ){LL x;cin >> x;mp[x] ;}cout << mp.size() << endl;…...
Babylon.js 材质统一转换指南:将 AssetContainer 中的所有材质转换为 PBRMetallicRoughnessMaterial
在现代 3D 开发中,基于物理的渲染(PBR)已成为行业标准。本文将详细介绍如何在 Babylon.js 中将 AssetContainer 加载的各种材质统一转换为 PBRMetallicRoughnessMaterial,实现项目材质的标准化。 为什么需要材质转换? PBRMetallicRoughness…...
Linux Platform驱动模型全解析:从入门到精通
Linux Platform驱动模型全解析:从入门到精通 1. Platform驱动模型概述 1.1 什么是Platform驱动模型 Platform驱动模型是Linux内核为处理非热插拔设备(通常是SoC集成外设)而设计的一套驱动框架。它通过虚拟的"platform总线"将硬件…...