当前位置: 首页 > 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…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...