当前位置: 首页 > news >正文

使用LSTM完成时间序列预测

c

在本教程中,我们将介绍一个简单的示例,旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例,你可以学习如何使用 LSTMCell 单元来处理时间序列数据。

我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在学习了这些正弦波之后,将尝试预测未来的信号值。

使用方法

  1. 生成正弦波信号:

    python generate_sine_wave.py
    
  2. 训练模型:

    python train.py
    

生成正弦波训练数据

在这一步中,我们将生成用于训练的正弦波信号数据。以下是代码及其详细解释:

import numpy as np
import torch# 设置随机种子,以确保结果的可重复性
np.random.seed(2)# 定义常数 T、L 和 N
T = 20
L = 1000
N = 100# 创建一个空的 numpy 数组 x,用于存储生成的序列
x = np.empty((N, L), 'int64')# 为数组 x 赋值,每行都是一个按顺序排列的整数序列,
# 并加入了一个随机偏移量
x[:] = np.array(range(L)) + np.random.randint(-4 * T, 4 * T, N).reshape(N, 1)# 对 x 进行正弦变换,以此生成正弦波数据
data = np.sin(x / 1.0 / T).astype('float64')# 将生成的正弦波数据保存为一种 PyTorch 可读的格式
torch.save(data, open('traindata.pt', 'wb'))
代码解析
  1. 导入库
  • numpy:用于数值计算
  • torch:用于深度学习中的数据处理和模型训练
  1. 设置随机种子
  • 通过 np.random.seed(2) 设置随机种子,以保证每次运行代码时生成相同的随机数,从而使结果可重复。
  1. 定义常量
  • T:周期长度
  • L:每行的序列长度
  • N:生成的样本数量
  1. 生成随机序列
  • 创建一个空的 numpy 数组 x,用于存储生成的整数序列。
  • 对数组 x 进行赋值,每一行是一个按顺序排列的整数序列,加上一个随机的偏移量。偏移量的范围由 np.random.randint(-4 * T, 4 * T, N).reshape(N, 1) 确定。
  1. 生成正弦波数据
  • x 进行正弦变换,生成标准的正弦波数据。np.sin(x / 1.0 / T).astype('float64') 将整数序列转换为浮点数序列,并进行正弦变换。
  1. 保存数据
  • 使用 torch.save 将生成的正弦波数据保存为 traindata.pt,方便后续训练时加载使用。

搭建与训练时间序列预测模型

在本教程中,我们将详细讲解如何使用 PyTorch 搭建一个LSTM模型,进行时间序列预测。以下是代码及其逐行解释,我们将整个过程分为三个部分:模型定义、数据加载与预处理,以及模型训练与预测。

模型定义

首先,我们定义一个 LSTM 模型,该模型包含两个 LSTMCell 层和一个全连接层用于输出。

from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 定义一个序列模型
class Sequence(nn.Module):def __init__(self):super(Sequence, self).__init__()# 定义两个LSTMCell层和一个全连接层self.lstm1 = nn.LSTMCell(1, 51)self.lstm2 = nn.LSTMCell(51, 51)self.linear = nn.Linear(51, 1)# 定义前向传播def forward(self, input, future = 0):outputs = []# 初始化LSTMCell的隐藏状态和细胞状态h_t = torch.zeros(input.size(0), 51, dtype=torch.double)c_t = torch.zeros(input.size(0), 51, dtype=torch.double)h_t2 = torch.zeros(input.size(0), 51, dtype=torch.double)c_t2 = torch.zeros(input.size(0), 51, dtype=torch.double)# 遍历输入序列for input_t in input.split(1, dim=1):# 更新LSTMCell的隐藏状态和细胞状态h_t, c_t = self.lstm1(input_t, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))# 通过全连接层得到输出output = self.linear(h_t2)outputs += [output]# 如果需要预测未来值for i in range(future):h_t, c_t = self.lstm1(output, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))output = self.linear(h_t2)outputs += [output]# 将输出序列拼接起来outputs = torch.cat(outputs, dim=1)return outputs

这段代码是一个简单的序列模型,包括两个LSTMCell层和一个全连接层。它接受一个输入序列,通过LSTMCell层和全连接层对输入进行处理,最终输出一个序列。如果需要预测未来值,则可以在forward函数中传入future参数来进行预测。

具体解释如下:

  1. 首先导入必要的库,包括torch、torch.nn等。
  2. 定义了一个名为Sequence的序列模型,继承自nn.Module。
  3. 在初始化函数中,定义了两个LSTMCell层和一个全连接层,分别是lstm1、lstm2和linear。
  4. forward函数用来定义模型的前向传播过程,接受输入input和可选的future参数,返回处理后的输出序列。
  5. 在forward函数中,首先初始化了LSTMCell的隐藏状态和细胞状态h_t、c_t、h_t2、c_t2。
  6. 遍历输入序列input,对每个输入进行处理,更新LSTMCell的隐藏状态和细胞状态,通过全连接层得到输出,并将输出保存在outputs列表中。
  7. 如果future参数大于0,表示需要预测未来值,进入一个for循环,通过当前输出不断更新LSTMCell的状态,并将预测得到的输出保存在outputs中。
  8. 最后将所有输出序列拼接起来,返回最终的输出。

这段代码主要实现了对输入序列的处理和未来值的预测,是一个简单的序列预测模型。


数据加载与预处理

接下来,我们加载生成的训练数据,并构建训练集和测试集。

if __name__ == '__main__':# 定义命令行参数parser = argparse.ArgumentParser()parser.add_argument('--steps', type=int, default=15, help='steps to run')opt = parser.parse_args()# 设置随机种子np.random.seed(0)torch.manual_seed(0)# 加载数据并构建训练集data = torch.load('traindata.pt')input = torch.from_numpy(data[3:, :-1])target = torch.from_numpy(data[3:, 1:])test_input = torch.from_numpy(data[:3, :-1])test_target = torch.from_numpy(data[:3, 1:])

这段代码是一个Python脚本的入口点,通常用于定义和设置命令行参数,加载数据,并准备训练数据。让我逐行解释:

  1. if __name__ == '__main__': 这是Python中用来判断是否当前脚本被当做程序入口执行的一种常见方式。如果当前脚本被当做主程序执行,而不是被其他模块导入,这个条件会成立。

  2. parser = argparse.ArgumentParser() 创建了一个命令行参数解析器。

  3. parser.add_argument('--steps', type=int, default=15, help='steps to run') 定义了一个名为steps的命令行参数,指定了参数的类型为整数,默认值为15,以及参数的帮助信息。

  4. opt = parser.parse_args() 解析命令行参数,并将结果存储在opt变量中。

  5. np.random.seed(0)torch.manual_seed(0) 设置了随机数生成器的种子,用于确保实验结果的可复现性。

  6. data = torch.load('traindata.pt') 从名为traindata.pt的文件中加载数据。

  7. input = torch.from_numpy(data[3:, :-1]) 创建了一个PyTorch张量input,用于存储数据中第4列到倒数第2列之间的数据。

  8. target = torch.from_numpy(data[3:, 1:]) 创建了一个PyTorch张量target,用于存储数据中第4列到最后一列之间的数据。

  9. test_input = torch.from_numpy(data[:3, :-1]) 创建了一个PyTorch张量test_input,用于存储数据中第1列到倒数第2列之间的数据,这是用于测试的输入数据。

  10. test_target = torch.from_numpy(data[:3, 1:]) 创建了一个PyTorch张量test_target,用于存储数据中第2列到最后一列之间的数据,这是用于测试的目标数据。

这段代码的主要作用是准备数据,设置随机种子和命令行参数,为后续的数据处理和模型训练做准备。


模型训练与预测

最后,我们进行模型训练并进行预测。

    # 构建模型seq = Sequence()seq.double()criterion = nn.MSELoss()# 使用LBFGS作为优化器,因为我们可以将所有数据加载到训练中optimizer = optim.LBFGS(seq.parameters(), lr=0.8)# 开始训练for i in range(opt.steps):print('STEP: ', i)def closure():optimizer.zero_grad()out = seq(input)loss = criterion(out, target)print('loss:', loss.item())loss.backward()return lossoptimizer.step(closure)# 开始预测,不需要跟踪梯度with torch.no_grad():future = 1000pred = seq(test_input, future=future)loss = criterion(pred[:, :-future], test_target)print('test loss:', loss.item())y = pred.detach().numpy()# 绘制结果plt.figure(figsize=(30,10))plt.title('Predict future values for time sequences\n(Dashlines are predicted values)', fontsize=30)plt.xlabel('x', fontsize=20)plt.ylabel('y', fontsize=20)plt.xticks(fontsize=20)plt.yticks(fontsize=20)def draw(yi, color):plt.plot(np.arange(input.size(1)), yi[:input.size(1)], color, linewidth = 2.0)plt.plot(np.arange(input.size(1), input.size(1) + future), yi[input.size(1):], color + ':', linewidth = 2.0)draw(y[0], 'r')draw(y[1], 'g')draw(y[2], 'b')plt.savefig('predict%d.pdf'%i)plt.close()

这段代码是一个简单的 PyTorch 深度学习模型训练和预测的示例。让我为您解释一下代码的主要部分:

  1. 首先,代码创建了一个名为 “seq” 的序列模型。然后转换这个模型为双精度数据类型。接着定义了均方误差损失函数 “criterion”。LBFGS 作为优化器,学习速率为 0.8。

  2. 在训练过程中,通过一个循环来进行多次优化迭代。在每次迭代中,通过闭包函数 “closure()” 来计算损失并执行反向传播,然后优化器根据损失进行参数更新。

  3. 接着,使用 torch.no_grad() 上下文管理器来禁止跟踪梯度,开始进行预测。在这里,预测未来的 1000 个时间步。然后计算预测结果和测试目标之间的损失,并打印损失值。

  4. 接下来是绘制结果的部分。代码会使用 matplotlib 库绘制预测的结果图。其中,将实线用于已知的数据部分,虚线用于预测的数据部分。最后,结果图被保存为名为 ‘predict%d.pdf’ 的文件,其中 %d 是迭代的次数。


在GPU上运行

这段代码的默认配置是使用CPU进行训练和预测。如果你想利用GPU加速训练过程,可以通过以下步骤修改代码将模型和数据放到GPU上进行计算。

以下是针对GPU的修改:

  1. 检查是否有可用的GPU:一般使用 torch.cuda.is_available() 来检查是否有可用的GPU。
  2. 将模型和数据移动到GPU:将数据和模型移动到GPU设备上进行计算。

所有涉及到数据和模型的地方都需要做相应的改动,使其可以在GPU上执行。

以下是修改后的代码:

from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 定义一个序列模型
class Sequence(nn.Module):def __init__(self):super(Sequence, self).__init__()# 定义两个LSTMCell层和一个全连接层self.lstm1 = nn.LSTMCell(1, 51)self.lstm2 = nn.LSTMCell(51, 51)self.linear = nn.Linear(51, 1)# 定义前向传播def forward(self, input, future = 0):outputs = []# 初始化LSTMCell的隐藏状态和细胞状态h_t = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)c_t = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)h_t2 = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)c_t2 = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)# 遍历输入序列for input_t in input.split(1, dim=1):# 更新LSTMCell的隐藏状态和细胞状态h_t, c_t = self.lstm1(input_t, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))# 通过全连接层得到输出output = self.linear(h_t2)outputs += [output]# 如果需要预测未来值for i in range(future):h_t, c_t = self.lstm1(output, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))output = self.linear(h_t2)outputs += [output]# 将输出序列拼接起来outputs = torch.cat(outputs, dim=1)return outputsif __name__ == '__main__':# 定义命令行参数parser = argparse.ArgumentParser()parser.add_argument('--steps', type=int, default=15, help='steps to run')opt = parser.parse_args()# 设置随机种子np.random.seed(0)torch.manual_seed(0)# 检查是否有可用的GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载数据并构建训练集data = torch.load('traindata.pt')input = torch.from_numpy(data[3:, :-1]).double().to(device)target = torch.from_numpy(data[3:, 1:]).double().to(device)test_input = torch.from_numpy(data[:3, :-1]).double().to(device)test_target = torch.from_numpy(data[:3, 1:]).double().to(device)# 构建模型seq = Sequence().double().to(device)criterion = nn.MSELoss()# 使用LBFGS作为优化器,因为我们可以将所有数据加载到训练中optimizer = optim.LBFGS(seq.parameters(), lr=0.8)# 开始训练for i in range(opt.steps):print('STEP: ', i)def closure():optimizer.zero_grad()out = seq(input)loss = criterion(out, target)print('loss:', loss.item())loss.backward()return lossoptimizer.step(closure)# 开始预测,不需要跟踪梯度with torch.no_grad():future = 1000pred = seq(test_input, future=future)loss = criterion(pred[:, :-future], test_target)print('test loss:', loss.item())y = pred.detach().cpu().numpy()  # 将结果移回CPU以便绘图# 绘制结果plt.figure(figsize=(30,10))plt.title('Predict future values for time sequences\n(Dashlines are predicted values)', fontsize=30)plt.xlabel('x', fontsize=20)plt.ylabel('y', fontsize=20)plt.xticks(fontsize=20)plt.yticks(fontsize=20)def draw(yi, color):plt.plot(np.arange(input.size(1)), yi[:input.size(1)], color, linewidth = 2.0)plt.plot(np.arange(input.size(1), input.size(1) + future), yi[input.size(1):], color + ':', linewidth = 2.0)draw(y[0], 'r')draw(y[1], 'g')draw(y[2], 'b')plt.savefig('predict%d.pdf'%i)plt.close()

修改解释

  1. 检查GPU:

    • 使用 torch.cuda.is_available() 检查是否有可用的GPU。如果有,将 device 设置为 cuda,否则为 cpu
  2. 数据和模型移到GPU:

    • 使用 .to(device) 方法将数据和模型移到指定设备(CPU或GPU)。
    • 初始化隐藏状态和细胞状态时,指定相应的设备 device 和数据类型 dtype
  3. 绘图前将数据移回CPU:

    • 由于 matplotlib 需要在 CPU 上的 numpy 数组,因此在绘图前将预测数据移回 CPU,并调用 .detach().cpu().numpy()

通过这些修改,你可以利用GPU来加速模型训练过程。当然,前提是你的计算机上配备了兼容的GPU。如果没有,代码将自动退回到使用CPU进行训练。

可以看到GPU明显上升

在这里插入图片描述

结果

STEP:  0
loss: 0.5023738122475573
loss: 0.4985663937943564
loss: 0.479011960611529
loss: 0.44633490214842303
loss: 0.35406310257493023
loss: 0.2050701661768143
loss: 1.3960531561166554
loss: 0.03249441148471743
...
test loss: 6.382565835674331e-06
STEP:  13
loss: 3.76246839739177e-06
test loss: 6.382565835674331e-06
STEP:  14
loss: 3.76246839739177e-06
test loss: 6.382565835674331e-06

得到图像:

第1次训练后:

在这里插入图片描述

第5次训练后:

在这里插入图片描述

第10次:

在这里插入图片描述

第15次:
在这里插入图片描述

相关文章:

使用LSTM完成时间序列预测

c 在本教程中,我们将介绍一个简单的示例,旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例,你可以学习如何使用 LSTMCell 单元来处理时间序列数据。 我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在…...

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构,它是由n&#xff…...

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …...

【防火墙】防火墙NAT、智能选路综合实验

实验拓扑 实验要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进行选路…...

VUE之---slot插槽

什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…...

linux、windows、macos,命令终端清屏

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS的命令终端中,清屏的命令或方法各不相同。以下是针对这三种系统的清屏方法: Linux clear命令:这是最常用的清空终端屏幕的命令之一。在终端中输入clear命令后,屏幕上的所有内容…...

【RaspberryPi】树莓派Matlab/Simulink支持包安装与使用

官网支持与兼容性 Raspberry Pi Support from MATLAB - Hardware Support - MATLAB & Simulink Raspberry Pi Support from Simulink - Hardware Support - MATLAB & Simulink Matlab与树莓派兼容性 Simulink与树莓派兼容性 树莓派Matlab&Simulink RaspberryPi支…...

嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)

1、实时时钟(Real Time Clock) RTC,全称为实时时钟(Real Time Clock),是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作&#xff…...

C++ | Leetcode C++题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int n citations.size();int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right m…...

编写DockerFile

将自己的项目或者环境通过Docker部署到服务器需要一下几个步骤&#xff1a; 打包项目或者环境 编写Dockerfile文件 运行Dockerfile文件&#xff0c;构建DockerImages镜像&#xff0c;将DockerImages存入DockerHub或者存入阿里云镜像仓库 服务器pull下DockerImages镜像&#…...

TCP并发服务器多线程

1.创建线程‐‐pthread_create int pthread_create( pthread_t *thread, // 线程 ID 无符号长整型 const pthread_attr_t *attr, // 线程属性&#xff0c; NULL void *(*start_routine)(void *), // 线程处理函数 void *arg); // 线程处理函数 参数&#xff1a; pthrea…...

技术速递|C# 13:探索最新的预览功能

作者&#xff1a;Kathleen Dollard 排版&#xff1a;Alan Wang C# 13 已初具雏形&#xff0c;其新特性侧重于灵活性、性能以及使您最喜欢的功能在日常中变得更容易使用。我们以公开的方式构建 C#&#xff0c;在今年的 Microsoft Build 大会上&#xff0c;我们会让您一睹 C# 13 …...

Python设计模式:巧用元类创建单例模式!

✨ 内容&#xff1a; 今天我们来探讨一个高级且实用的Python概念——元类&#xff08;Metaclasses&#xff09;。元类是创建类的类&#xff0c;它们可以用来控制类的行为。通过本次练习&#xff0c;我们将学习如何使用元类来实现单例模式&#xff0c;确保某个类在整个程序中只…...

构建自主可控的工业操作系统,筑牢我国工业安全堡垒

构建自主可控的工业操作系统&#xff0c;筑牢我国工业安全堡垒&#xff0c;鸿道(Intewell)操作系统为国家工业发展保驾护航。 7月19日&#xff0c;全球多地安装微软操作系统的电脑设备出现大规模宕机&#xff0c;导致“蓝屏”现象&#xff0c;严重影响了航空、铁路、医疗、金…...

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…...

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展&#xff0c;汽车自动化、智能化程度的逐步提高&#xff0c;人们对汽车的安全性、舒适性、娱乐性等要求也不断提高&#xff0c;加上汽车节能减排法规的不断严峻&#xff0c;整车电气设备不断增加&#xff0c;作为连接汽车各种电器设备“神经网络”的整车…...

实现Nginx的反向代理和负载均衡

一、反向代理和负载均衡简介 1.1、反向代理 反向代理(reverse proxy)指:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。此时代理服务器对外就表现为一个反向代理服务器。 反向代…...

【算法】子集

难度&#xff1a;中等 题目&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,…...

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…...

ActiViz中的选择点vtkWorldPointPicker

文章目录 1. vtkWorldPointPicker简介2. 类的位置和继承关系3. 选择机制4. 返回的信息5. 选择的条件和参数6. 与屏幕空间选择器的比较7. 性能特征8. 应用场景9. 与其他vtk选择器的集成10. 完整示例总结1. vtkWorldPointPicker简介 vtkWorldPointPicker是Visualization Toolkit…...

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…...

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda.com/ 另外&#…...

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持&#xff0c;‌上电即可使用的语音识别系统。‌它的应用场合相对单一&#xff0c;‌主要适用于智能家电、‌语音遥控器、‌智能玩具等&#xff0c;‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…...

使用Diffusion Models进行街景视频生成

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;街景图生成相当有挑战性&#xff0c;目前的文本到视频的方法仅限于生成有限范围的场景的短视频&#xff0c;文本到3D的方法可以生成单独的对象但不是整个城市。除此之外街景图对一致性的要求相当高&#x…...

UFO:革新Windows操作系统交互的UI聚焦代理

人工智能咨询培训老师叶梓 转载标明出处 人机交互的便捷性和效率直接影响着我们的工作和生活质量。尽管现代操作系统如Windows提供了丰富的图形用户界面&#xff08;GUI&#xff09;&#xff0c;使得用户能够通过视觉和简单的点击操作来控制计算机&#xff0c;但随着应用程序功…...

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件&#xff1a;id_rsa 和 id_rsa.pub 1.2 拷…...

Maven 的模块化开发示例

Maven 的模块化开发是一种非常有效的软件开发方式&#xff0c;它允许你将一个大型的项目分割成多个更小、更易于管理的模块&#xff08;modules&#xff09;。每个模块都可以独立地构建、测试和运行&#xff0c;这不仅提高了开发效率&#xff0c;也便于团队协作和项目的维护。以…...

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…...

【STM32 HAL库】DMA+串口

DMA 直接存储器访问 DMA传输&#xff0c;将数据从一个地址空间复制到另一个地址空间。-----“数据搬运工”。 DMA传输无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场&#xff0c;它是通过硬件为RAM和IO设备开辟一条直接传输数据的通道&#xff0c…...

C#类型基础Part2-对象判等

C#类型基础Part2-对象判等 参考资料引用类型判等简单值类型判等复杂值类型判等 参考资料 《.NET之美-.NET关键技术深入解析》 引用类型判等 先定义两个类型&#xff0c;它们代表直线上的一个点&#xff0c;一个是引用类型class&#xff0c;一个是值类型struct public class…...

13.CSS 打印样式表 悬停下划线动画

CSS 打印样式表 虽然我们不经常从网上实际打印内容,但打印样式表不应被忽视。它们可以用来确保你的网站内容以一种易读和适合打印的方式呈现。这里有一个简单的、独特的打印样式表,你可以用它作为自己的基础: media print {page {size: A4;}body {margin: 0;padding: 0;}body, …...

C#基础:数据库分表的好处和实现方式

一、分表的好处&#xff1a; 1.提升查询速度&#xff1a;分表筛选后再拼接&#xff0c;而不是查大表&#xff0c;速度会显著提升 2.管理容易&#xff1a;根据业务需求&#xff0c;通常会按照时间或者空间来分表 3.提高并发性&#xff1a;降低锁竞争和查询阻塞的风险&#xf…...

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…...

学习React(描述 UI)

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件。在本章…...

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;...

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …...

Linux基于CentOS7【yum】【vim】的基础学习,【普通用户提权】

目录 yum生态 什么是yum yum是如何得知目标服务器的地址和下载链接 vim vim模式 命名模式 光标移动 插入模式 i键插 a键插 o键插 底行模式 批量化注释 批量化去注释 创建vim配置文件 例子 高亮功能&#xff1a; 缩进功能&#xff1a; 符号位自动补齐功能…...

盛元广通实验室自动化生物样本库质量控制管理系统

随着我国生物医学研究的不断深入和精准医疗的快速发展&#xff0c;对高质量生物样本的需求日益增长。近年来&#xff0c;我国生物样本库建设取得了显著进展。各级政府、高校和医院纷纷投入资源建设生物样本库&#xff0c;推动了生物样本资源的有效整合和利用。生物样本库的质量…...

Java | 自制AWT单词猜一猜小游戏(测试版)

目录 游戏标题 开发过程 开发想法 技术栈 代码呈现 导包 核心代码 游戏标题 探索知识的迷宫&#xff0c;体验自制AWT单词猜一猜小游戏 在数字时代&#xff0c;学习可以是多彩的&#xff0c;游戏可以是智慧的。我们自豪地推出“单词猜猜猜”是一款结合了教育与娱乐的自制…...

docker搭建ES 8.14 集群

参考&#xff1a;【docker搭建es8集群kibana】_docker 安装生产级 es 8.14 集群-CSDN博客 1、之前已搭建一台单机版的dockerES集群 参见 Elasticsearch docker 安装_docker 安装es8.14.3-CSDN博客 2、现在需要重新搭建为docker ES集群 准备新搭建3个点 一、准备工作 提前开…...

自定义特征的智能演进:Mojo模型中的动态特征选择控制

自定义特征的智能演进&#xff1a;Mojo模型中的动态特征选择控制 在机器学习领域&#xff0c;特征选择是提升模型性能和泛化能力的关键步骤。Mojo模型&#xff0c;作为一种高效的模型部署方式&#xff0c;其对特征的动态选择和控制能力是实现高级机器学习应用的重要特性。本文…...

Git->Git生成patch和使用patch

生成patch git format-patch -1 HEAD -o "输出目录"format-patch&#xff1a;用于生成补丁文件-1&#xff1a;-1 表示最近一次提交&#xff0c;-2 表示生成最近两次提交的补丁。HEAD&#xff1a;HEAD 指向当前分支的最新提交-o&#xff1a;指定生成的补丁文件的输出…...

开发面试算法题求教

在《无尽的拉格朗日》中&#xff0c;有许多不同的星系建筑物。每个星系建筑物的等级不同&#xff0c;带来的影响力也不同。 已知宇宙可以抽象为一个无穷大的平面直角坐标系&#xff0c;现在给定了每个星系建筑物的所在坐标(xi,yi)和它的影响力ri&#xff0c;距离其切比雪夫距离…...

OpenStack中nova的架构

1.1 nova-api 负责接收和相应客户的API调用。 1.2 compute core nova-schedule 负责决定在哪个计算节点运行虚拟机。 nova-compute 通过调用Hypervisor实现虚拟机生命周期的管理。一般运行在计算节点。 hypervisor 对虚拟机进行硬件虚拟化的管理软件&#xff…...

力扣高频SQL 50题(基础版)第五题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第五题1683. 无效的推文题目说明&#xff1a;思路分析&#xff1a;实现过程&#xff1a;结果截图&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第五题 1683. 无效的推文 题目说明&#xff1a; 表&a…...

Air780EP- AT开发-阿里云应用指南

简介 使用AT方式连接阿里云分为一机一密和一型一密两种方式&#xff0c;其中一机一密又包括HTTP认证二次连接和MQTT直连两种方式 关联文档和使用工具&#xff1a; AT固件获取在线加/解密工具阿里云平台 准备工作 Air780EP_全IO开发板一套&#xff0c;包括天线SIM卡&#xff0…...

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.4数据架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

excel批量新建多个同类型的表格

背景引入 比如&#xff0c;一个企业有多个部门&#xff0c;现在需要按照某一个excel表模板收集各个部门的信息&#xff0c;需要创建数十个同类型表格&#xff0c;且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格&#xff0c;将标题…...

React Native 与 Flutter:你的应用该如何选择?

Flutter 和 React Native 都被认为是混合应用程序开发中的热门技术。然而&#xff0c;当谈到为你的项目使用框架时&#xff0c;你必须考虑哪一个是最好的&#xff1a;Flutter 还是 React Native&#xff1f; 本篇文章包含 Flutter 和 React Native 在各个方面的差异。因此&…...

DP学习——状态模式

学而时习之&#xff0c;温故而知新。 状态模式 角色 2个角色&#xff0c;引用类&#xff0c;状态行为类。 和策略模式很相似 状态行为封装成很多独立的状态行为类——就是把不同的状态及其要执行的方法单独封装起来。 而策略模式类似&#xff0c;是不同的算法封装成一个个…...