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

实验15 验证LSTM模型的长程依赖

本次实验依托上个实验

一 模型构建

创建LSTM模型,里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。

init函数:虽然每个时间的输入和隐层都是一样的,但是他们会有四组不同的权重,最终产生输入门、输出门、遗忘门和真实的结果。所以要初始化四组权重W、U、b。例如四组W都是input_size*hidden_size大小的随机数。

init_state:初始化隐状态和单元状态为batch*hidden大小的全零向量。

Forward:首先获取输入的形状为batch_size、seq_len、input_size,然后将隐层的初始状态和单元状态进行初始化。定义相应的门状态和单元状态向量列表Is, Fs, Os, Cs,对于每个序列,开始计算LSTM,获取这个时刻的输入,然后计算得到输入门、遗忘门、输出门、真实结果,根据得到的结果更新单元状态,同时得到隐层状态,最后存储门状态向量和单元状态向量到列表中。

代码:

class LSTM(nn.Module):def __init__(self, input_size, hidden_size):super(LSTM, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_size# 初始化模型参数self.W_i = nn.Parameter(torch.randn(input_size, hidden_size))self.W_f = nn.Parameter(torch.randn(input_size, hidden_size))self.W_o = nn.Parameter(torch.randn(input_size, hidden_size))self.W_a = nn.Parameter(torch.randn(input_size, hidden_size))self.U_i = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_f = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_o = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_a = nn.Parameter(torch.randn(hidden_size, hidden_size))self.b_i = nn.Parameter(torch.zeros(1, hidden_size))self.b_f = nn.Parameter(torch.zeros(1, hidden_size))self.b_o = nn.Parameter(torch.zeros(1, hidden_size))self.b_a = nn.Parameter(torch.zeros(1, hidden_size))# 参数初始化self.apply(self._init_weights)def _init_weights(self, m):if isinstance(m, nn.Linear):init.xavier_uniform_(m.weight)def init_state(self, batch_size):# 初始化隐状态和单元状态hidden_state = torch.zeros(batch_size, self.hidden_size)cell_state = torch.zeros(batch_size, self.hidden_size)return hidden_state, cell_statedef forward(self, inputs, states=None):batch_size, seq_len, input_size = inputs.shape  # inputs shape: (batch_size, seq_len, input_size)if states is None:states = self.init_state(batch_size)hidden_state, cell_state = states# 定义相应的门状态和单元状态向量列表Is, Fs, Os, Cs = [], [], [], []# 执行LSTM计算,包括输入门、遗忘门、输出门、候选状态、状态和隐状态for step in range(seq_len):input_step = inputs[:, step, :]I_gate = torch.sigmoid(torch.matmul(input_step, self.W_i) + torch.matmul(hidden_state, self.U_i) + self.b_i)F_gate = torch.sigmoid(torch.matmul(input_step, self.W_f) + torch.matmul(hidden_state, self.U_f) + self.b_f)O_gate = torch.sigmoid(torch.matmul(input_step, self.W_o) + torch.matmul(hidden_state, self.U_o) + self.b_o)C_tilde = torch.tanh(torch.matmul(input_step, self.W_a) + torch.matmul(hidden_state, self.U_a) + self.b_a)cell_state = F_gate * cell_state + I_gate * C_tildehidden_state = O_gate * torch.tanh(cell_state)# 存储门状态向量和单元状态向量Is.append(I_gate.detach().cpu().numpy())Fs.append(F_gate.detach().cpu().numpy())Os.append(O_gate.detach().cpu().numpy())Cs.append(cell_state.detach().cpu().numpy())return hidden_state

二 模型训练

所有的都和上个实验一样,就是在这个实验中需要实例化LSTM模型,然后把实例化之后的base_model作为参数实例化Model_RNN4SeqClass。调用train函数开始训练。

代码:

import os
import random
import numpy as np
import torch
from matplotlib import pyplot as plt
from torch import optim
from torch.utils.data import Dataset, DataLoader#数据集构建
# 固定随机种子
random.seed(0)
np.random.seed(0)
class DigitSumDataset(Dataset):def __init__(self, data_path=None, length=None, k=None, mode='train'):"""初始化数据集如果传入了data_path,则从文件加载数据;如果传入了length和k,则生成数据集。参数:data_path: 存放数据集的目录,用于加载数据length: 数据序列的长度(仅用于生成数据集时)k: 数据增强的数量(仅用于生成数据集时)mode: 'train'/'dev'/'test',决定生成训练集、验证集还是测试集(仅用于生成数据集时)"""self.data_path = data_pathself.length = lengthself.k = kself.mode = modeif data_path:  # 从文件加载数据self.examples = self.load_data(data_path)else:  # 生成数据if length < 3 or k <= 0:raise ValueError("The length of data should be greater than 2 and k should be greater than 0.")self.examples = self.generate_data()def generate_data(self):"""生成数据:生成指定长度的数字序列,并进行数据增强"""base_examples = []for n1 in range(0, 10):for n2 in range(0, 10):seq = [n1, n2] + [0] * (self.length - 2)label = n1 + n2base_examples.append((seq, label))examples = []for base_example in base_examples:for _ in range(self.k):idx = np.random.randint(2, self.length)val = np.random.randint(0, 10)seq = base_example[0].copy()label = base_example[1]seq[idx] = valexamples.append((seq, label))return examplesdef load_data(self, data_path):"""从文件加载数据"""def _load_file(file_path):examples = []with open(file_path, "r", encoding="utf-8") as f:for line in f.readlines():items = line.strip().split("\t")seq = [int(i) for i in items[0].split(" ")]label = int(items[1])examples.append((seq, label))return examples# 加载训练集、验证集、测试集train_examples = _load_file(os.path.join(data_path, "train.txt"))dev_examples = _load_file(os.path.join(data_path, "dev.txt"))test_examples = _load_file(os.path.join(data_path, "test.txt"))return train_examples if self.mode == 'train' else dev_examples if self.mode == 'dev' else test_examplesdef __len__(self):return len(self.examples)def __getitem__(self, idx):seq, label = self.examples[idx]seq_tensor = torch.tensor(seq, dtype=torch.long)label_tensor = torch.tensor(label, dtype=torch.long)return seq_tensor, label_tensor# 设定数据集的路径和生成参数
lengths = [5, 10, 15, 20, 25, 30, 35]
# lengths = [5]
k_train = 3  # 训练集数据增强的数量
k_test_val = 1  # 验证集和测试集数据增强的数量#总的模型
import torch
import torch.nn as nn
import torch.nn.functional as F# 嵌入层
class Embedding(nn.Module):def __init__(self, num_embeddings, embedding_dim):super(Embedding, self).__init__()self.W = nn.init.xavier_uniform_(torch.empty(num_embeddings, embedding_dim), gain=1.0)def forward(self, inputs):inputs = inputs.long()  # 确保是 LongTensor 类型embs = self.W[inputs]  # 根据输入索引返回嵌入向量return embsimport torch
import torch.nn as nn
import torch.nn.functional as Ffrom torch.nn import initclass LSTM(nn.Module):def __init__(self, input_size, hidden_size):super(LSTM, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_size# 初始化模型参数self.W_i = nn.Parameter(torch.randn(input_size, hidden_size))self.W_f = nn.Parameter(torch.randn(input_size, hidden_size))self.W_o = nn.Parameter(torch.randn(input_size, hidden_size))self.W_a = nn.Parameter(torch.randn(input_size, hidden_size))self.U_i = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_f = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_o = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_a = nn.Parameter(torch.randn(hidden_size, hidden_size))self.b_i = nn.Parameter(torch.zeros(1, hidden_size))self.b_f = nn.Parameter(torch.zeros(1, hidden_size))self.b_o = nn.Parameter(torch.zeros(1, hidden_size))self.b_a = nn.Parameter(torch.zeros(1, hidden_size))# 参数初始化self.apply(self._init_weights)def _init_weights(self, m):if isinstance(m, nn.Linear):init.xavier_uniform_(m.weight)def init_state(self, batch_size):# 初始化隐状态和单元状态hidden_state = torch.zeros(batch_size, self.hidden_size)cell_state = torch.zeros(batch_size, self.hidden_size)return hidden_state, cell_statedef forward(self, inputs, states=None):batch_size, seq_len, input_size = inputs.shape  # inputs shape: (batch_size, seq_len, input_size)if states is None:states = self.init_state(batch_size)hidden_state, cell_state = states# 定义相应的门状态和单元状态向量列表Is, Fs, Os, Cs = [], [], [], []# 执行LSTM计算,包括输入门、遗忘门、输出门、候选状态、状态和隐状态for step in range(seq_len):input_step = inputs[:, step, :]I_gate = torch.sigmoid(torch.matmul(input_step, self.W_i) + torch.matmul(hidden_state, self.U_i) + self.b_i)F_gate = torch.sigmoid(torch.matmul(input_step, self.W_f) + torch.matmul(hidden_state, self.U_f) + self.b_f)O_gate = torch.sigmoid(torch.matmul(input_step, self.W_o) + torch.matmul(hidden_state, self.U_o) + self.b_o)C_tilde = torch.tanh(torch.matmul(input_step, self.W_a) + torch.matmul(hidden_state, self.U_a) + self.b_a)cell_state = F_gate * cell_state + I_gate * C_tildehidden_state = O_gate * torch.tanh(cell_state)# 存储门状态向量和单元状态向量Is.append(I_gate.detach().cpu().numpy())Fs.append(F_gate.detach().cpu().numpy())Os.append(O_gate.detach().cpu().numpy())Cs.append(cell_state.detach().cpu().numpy())return hidden_state# 基于RNN实现数字预测的模型
class Model_RNN4SeqClass(nn.Module):def __init__(self, model, num_digits, input_size, hidden_size, num_classes):super(Model_RNN4SeqClass, self).__init__()# 传入实例化的RNN层,例如SRNself.rnn_model = model# 词典大小self.num_digits = num_digits# 嵌入向量的维度self.input_size = input_size# 定义Embedding层self.embedding = Embedding(num_digits, input_size)# 定义线性层self.linear = nn.Linear(hidden_size, num_classes)def forward(self, inputs):inputs_emb = self.embedding(inputs)hidden_state= self.rnn_model(inputs_emb)  # 获取门状态logits = self.linear(hidden_state)return logits#模型训练
class Runner:def __init__(self, model, train_loader, val_loader, test_loader, criterion, optimizer):self.model = modelself.train_loader = train_loaderself.val_loader = val_loaderself.test_loader = test_loaderself.criterion = criterionself.optimizer = optimizerself.best_model = Noneself.best_val_loss = float('inf')self.train_losses = []  # 存储训练损失self.val_losses = []    # 存储验证损失def train(self, epochs):for epoch in range(epochs):self.model.train()running_loss = 0.0for inputs, labels in self.train_loader:self.optimizer.zero_grad()outputs = self.model(inputs)loss = self.criterion(outputs, labels)loss.backward()self.optimizer.step()running_loss += loss.item()# 计算平均训练损失train_loss = running_loss / len(self.train_loader)self.train_losses.append(train_loss)# 计算验证集上的损失val_loss = self.evaluate()self.val_losses.append(val_loss)print(f'Epoch [{epoch + 1}/{epochs}], Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}')# 如果验证集上的损失最小,保存模型if val_loss < self.best_val_loss:self.best_val_loss = val_lossself.best_model = self.model.state_dict()plt.figure(figsize=(10, 6))plt.plot(self.train_losses, label='Train Loss')plt.plot(self.val_losses, label='Validation Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.title('Loss Curve')plt.legend()plt.grid()plt.show()def evaluate(self):self.model.eval()val_loss = 0.0with torch.no_grad():for inputs, labels in self.val_loader:outputs = self.model(inputs)loss = self.criterion(outputs, labels)val_loss += loss.item()return val_loss / len(self.val_loader)def test(self):self.model.load_state_dict(self.best_model)self.model.eval()correct = 0total = 0with torch.no_grad():for inputs, labels in self.test_loader:outputs = self.model(inputs)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()test_accuracy = correct / totalprint(f'Test Accuracy: {test_accuracy:.4f}')def predict(self, image):self.model.eval()with torch.no_grad():output = self.model(image)_, predicted = torch.max(output, 1)return predicted.item()# 循环不同长度的序列
for length in lengths:# 生成训练集train_dataset = DigitSumDataset(length=length, k=k_train, mode='train')train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)# 生成验证集dev_dataset = DigitSumDataset(length=length, k=k_test_val, mode='dev')dev_loader = DataLoader(dev_dataset, batch_size=64, shuffle=False)# 生成测试集test_dataset = DigitSumDataset(length=length, k=k_test_val, mode='test')test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# 输入数字的类别数num_digits = 10# 将数字映射为向量的维度input_size = 32# 隐状态向量的维度shidden_size = 32# 预测数字的类别数num_classes = 19base_model = LSTM(input_size, hidden_size)model = Model_RNN4SeqClass(base_model, num_digits, input_size, hidden_size, num_classes)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 创建Runner实例,并进行训练runner = Runner(model, train_loader, dev_loader, test_loader, criterion, optimizer)print(f"Training model for sequence length {length}...")# 训练并测试模型runner.train(epochs=600)  # 训练模型

三 模型评价

调用test函数计算模型在测试集上的准确率

代码:

runner.test()  # 测试模型

将自定义LSTM与pytorch内置的LSTM进行对比

创建一个PyTorchLSTM模型,其中init函数中定义的lstm直接调用nn.LSTM。

然后调用 compare_models函数,在里面对两个模型进行对比,对比他们的模型在一次前向传播的计算时间、运行60次的平均运行时间、LSTM和PyTorch LSTM模型的参数总数、模型输出

代码:

import torch
import torch.nn as nn
import time
import numpy as np
from torch.nn import initclass LSTM(nn.Module):def __init__(self, input_size, hidden_size):super(LSTM, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_size# 初始化模型参数self.W_i = nn.Parameter(torch.randn(input_size, hidden_size))self.W_f = nn.Parameter(torch.randn(input_size, hidden_size))self.W_o = nn.Parameter(torch.randn(input_size, hidden_size))self.W_a = nn.Parameter(torch.randn(input_size, hidden_size))self.U_i = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_f = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_o = nn.Parameter(torch.randn(hidden_size, hidden_size))self.U_a = nn.Parameter(torch.randn(hidden_size, hidden_size))self.b_i = nn.Parameter(torch.zeros(1, hidden_size))self.b_f = nn.Parameter(torch.zeros(1, hidden_size))self.b_o = nn.Parameter(torch.zeros(1, hidden_size))self.b_a = nn.Parameter(torch.zeros(1, hidden_size))# 参数初始化self.apply(self._init_weights)def _init_weights(self, m):if isinstance(m, nn.Linear):init.xavier_uniform_(m.weight)def init_state(self, batch_size):# 初始化隐状态和单元状态hidden_state = torch.zeros(batch_size, self.hidden_size)cell_state = torch.zeros(batch_size, self.hidden_size)return hidden_state, cell_statedef forward(self, inputs, states=None):batch_size, seq_len, input_size = inputs.shape  # inputs shape: (batch_size, seq_len, input_size)if states is None:states = self.init_state(batch_size)hidden_state, cell_state = states# 执行LSTM计算,包括输入门、遗忘门、输出门、候选状态、状态和隐状态for step in range(seq_len):input_step = inputs[:, step, :]I_gate = torch.sigmoid(torch.matmul(input_step, self.W_i) + torch.matmul(hidden_state, self.U_i) + self.b_i)F_gate = torch.sigmoid(torch.matmul(input_step, self.W_f) + torch.matmul(hidden_state, self.U_f) + self.b_f)O_gate = torch.sigmoid(torch.matmul(input_step, self.W_o) + torch.matmul(hidden_state, self.U_o) + self.b_o)C_tilde = torch.tanh(torch.matmul(input_step, self.W_a) + torch.matmul(hidden_state, self.U_a) + self.b_a)cell_state = F_gate * cell_state + I_gate * C_tildehidden_state = O_gate * torch.tanh(cell_state)return hidden_state# PyTorch内置LSTM模型
class PyTorchLSTM(nn.Module):def __init__(self, input_size, hidden_size):super(PyTorchLSTM, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size)def forward(self, inputs, states=None):output, (hn, cn) = self.lstm(inputs, states)return hn[-1]# 输入参数设置
input_size = 10
hidden_size = 20
batch_size = 32
seq_len = 50# 创建随机输入数据
inputs = torch.randn(batch_size, seq_len, input_size)# 初始化自定义LSTM模型和PyTorch LSTM模型
custom_lstm = LSTM(input_size, hidden_size)
pytorch_lstm = PyTorchLSTM(input_size, hidden_size)# 计算两个模型的输出,记录时间和参数量
def compare_models(inputs, custom_lstm, pytorch_lstm):# 1. 计算输出start_time = time.time()custom_lstm_output = custom_lstm(inputs)  # 自定义LSTM输出custom_lstm_time = (time.time() - start_time) * 1000  # 毫秒start_time = time.time()pytorch_lstm_output = pytorch_lstm(inputs)  # PyTorch LSTM输出pytorch_lstm_time = (time.time() - start_time) * 1000  # 毫秒# 2. 计算参数数量custom_lstm_params = sum(p.numel() for p in custom_lstm.parameters())pytorch_lstm_params = sum(p.numel() for p in pytorch_lstm.parameters())# 3. 比较运行时间(60次运行的平均时间)custom_lstm_times = []pytorch_lstm_times = []for _ in range(60):start_time = time.time()custom_lstm(inputs)custom_lstm_times.append(time.time() - start_time)start_time = time.time()pytorch_lstm(inputs)pytorch_lstm_times.append(time.time() - start_time)custom_lstm_avg_time = np.mean(custom_lstm_times) * 1000  # 毫秒pytorch_lstm_avg_time = np.mean(pytorch_lstm_times) * 1000  # 毫秒return {'custom_lstm_time': custom_lstm_time,'pytorch_lstm_time': pytorch_lstm_time,'custom_lstm_avg_time': custom_lstm_avg_time,'pytorch_lstm_avg_time': pytorch_lstm_avg_time,'custom_lstm_params': custom_lstm_params,'pytorch_lstm_params': pytorch_lstm_params,'custom_lstm_output': custom_lstm_output,'pytorch_lstm_output': pytorch_lstm_output}# 比较两个模型
comparison_results = compare_models(inputs, custom_lstm, pytorch_lstm)# 打印结果
#模型在一次前向传播的计算时间
print(f"Custom LSTM (1 run) Time: {comparison_results['custom_lstm_time']} ms")
print(f"PyTorch LSTM (1 run) Time: {comparison_results['pytorch_lstm_time']} ms")
#运行60次的平均运行时间
print(f"Custom LSTM Average Time (60 runs): {comparison_results['custom_lstm_avg_time']} ms")
print(f"PyTorch LSTM Average Time (60 runs): {comparison_results['pytorch_lstm_avg_time']} ms")
#这两个参数分别表示自定义LSTM和PyTorch LSTM模型的参数总数
print(f"Custom LSTM Parameters: {comparison_results['custom_lstm_params']}")
print(f"PyTorch LSTM Parameters: {comparison_results['pytorch_lstm_params']}")# 打印模型输出
print("\nCustom LSTM Output:")
print(comparison_results['custom_lstm_output'])print("\nPyTorch LSTM Output:")
print(comparison_results['pytorch_lstm_output'])

五 实验结果

1、模型在序列长度为5、10、15、20、25、30、35上的loss变化和准确率

同SRN模型一样,随着序列长度的增加,训练集上的损失逐渐不稳定,验证集上的损失整体趋向于变大,这说明当序列长度增加时,保持长期依赖的能力同样在逐渐变弱.但是同SRN相比,LSTM模型在序列长度增加时,收敛情况比SRN模型更好。LSTM模型在测试集上的准确率整体也趋向于降低但是准确率显著高于SRN模型,表明LSTM模型保持长期依赖的能力要优于SRN模型. 

2.将自定义LSTM与pytorch内置的LSTM进行对比

 两个模型在单次运行时的执行时间非常接近,差异非常小。在多次运行的平均时间上,自定义 LSTM 的平均时间明显较长。这表明,在连续多次运行时,自定义实现的 LSTM 模型效率较低。自定义 LSTM 模型的参数数量稍少(2480)与 PyTorch LSTM(2560)相比。两者之间的差异可能来自于 PyTorch LSTM 内部的优化结构。

liu

相关文章:

实验15 验证LSTM模型的长程依赖

本次实验依托上个实验 一 模型构建 创建LSTM模型&#xff0c;里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。 init函数&#xff1a;虽然每个时间的输入和隐层都是一样的&#xff0c;但是他们会有四组不同的权重&am…...

Charles功能说明

1.扫把(clear the current Session) (前头方向) 作用:清除所有抓取的包(正方形框) 2.中心圈-未启用显示(Star Recording)点击启动 -启动之后显示(Stop Recording)点击停止 作用:启动之后开始抓取包(刷新一次页面或跳转抓取内容) 3.锁-未启动显示(Star SSL Proxying)点击启动 -启…...

自动秒收录程序与自动秒收录网站源码论坛版本下载

自动秒收录程序与自动秒收录网站源码论坛版本下载 随着互联网的快速发展&#xff0c;网站优化已成为众多企业和个人博主提升在线影响力的关键手段。其中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;作为提升网站排名的核心策略&#xff0c;备受关注。而SEO优化的一个…...

HTML颜色-HTML脚本

HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本&#xff0c;比如javascript 可包含脚本语句&#xff0c;也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作&#xff0c;表单验证以及动态的内容更新 HTML<n…...

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…...

使用Kimi开发自己的问答应用

概述 Kimi是大家常用的一个人工智能助手&#xff0c;本文使用Kimi开发文档&#xff0c;以node作为后端&#xff0c;开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手&#xff0c;擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...

Vue前端开发-路由其他配置

在路由文件中&#xff0c;除了跳转配置外&#xff0c;还可以进行路径重定向配置&#xff0c;如果没有找到对应的地址&#xff0c;还可以实现404的配置&#xff0c;同时&#xff0c;如果某个页面需要权限登录&#xff0c;还可以进行路由守卫配置&#xff0c;接下来&#xff0c;分…...

AI与遥感的融合:构建新一代智能监测作业平台

在测绘地理信息与遥感领域&#xff0c;人工智能&#xff08;AI&#xff09;技术的融合正推动着一场监测作业模式的革命。AI不仅提升了数据处理的效率&#xff0c;还极大地扩展了遥感技术的应用范围和深度。 遥感监测的智能化趋势 随着遥感数据量的激增&#xff0c;传统的人工…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

git提交时出现merge branch main of xxx

git提交时出现merge branch main of xxx 原因&#xff1a; 1、同事commit了一个修改A&#xff0c;push到remote 2、我把这个修改直接pull了下来&#xff08;pull是fetchmerge的操作&#xff0c;自动合并到本地workspace&#xff09; 3、同事因为后续的commit有冲突&#xff0c…...

重生之我在异世界学编程之C语言:深入结构体篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文《1》 结构体的两种声明一、结构…...

到达率和服务率在python中实现

到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...

重视猫艾滋:宠物健康的隐秘挑战

猫艾滋&#xff0c;全称为猫获得性免疫缺陷综合征&#xff08;Feline Acquired Immunodeficiency Syndrome&#xff09;&#xff0c;是由猫免疫缺陷病毒&#xff08;FIV&#xff09;感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似&#xff0c;但猫艾滋仅在…...

使用长轮询解决某些场景的实时消息推送需求

需求来源 最近做一个需求实现在移动端通过按钮&#xff0c;远程控制大屏幕上展示的资源进行实时切换&#xff0c;可以展示一个大屏页面&#xff0c;可以展示一段视频&#xff0c;也可以展示一张图片。 解决思路 大屏幕上打开一个游览器&#xff0c;访问指定动态资源展示页面…...

uniapp-内部项目使用文档

uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容&#xff1a;阶段1问题记录&#xff1a; 阶段2自行实现内容&#xff1a; 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...

linux搭建NFS服务和autofs自动挂载NFS

文章目录 1、nfs服务1、nfs原理2、RPC和NFS通讯原理3、RPC和NFS流程4、NFS工作流程5、服务端搭建6、客户端搭建7、autofs自动挂载 1、nfs服务 1、nfs原理 是一个NAS的存储&#xff0c;通过网络来进行文件的共享&#xff0c;表现出来的形式就是一个文件夹 可以支持多个linux挂…...

springboot415社区网格化管理平台的构建-(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本社区网格化管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…...

ubuntu下open-webui + ollama本地大模型部署

文章目录 nvidia gpu驱动安装 安装卸载 ollama 部署 添加docker秘钥docker配置添加国内镜像源ollama安装 从源拉取ollama镜像。启动一个ollama容器 通过ollama下载模型到本地检验本地模型 open-webui 部署 安装容器和镜像下载webui使用查看模型运行时内存、cpu、gpu占用 业余…...

自动化运维-配置Mysql、emqx、redis、nginx等通用性Linux日志分割工具 - logrotate

前言&#xff1a;logrotate 是一个在 Linux 系统中用于管理和轮转日志文件的工具。它的主要目的是帮助系统管理员自动执行日志文件的轮转、压缩、删除和邮件通知等任务&#xff0c;以防止日志文件占用过多的磁盘空间&#xff0c;同时保持日志文件的可管理性。 参考命令&#x…...

71、docker镜像制作上传/下载到阿里云

基本思想:简单学习一下如何制作镜像和上传下载到私有阿里云,然后构建一个gpu的训练/推理环境,以备后续使用 一、配置环境 ubuntu@ubuntu:~$ sudo apt-get install docker.ioubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P…...

力扣--LCR 178.训练计划VI

题目 教学过程中&#xff0c;教练示范一次&#xff0c;学员跟做三次。该过程被混乱剪辑后&#xff0c;记录于数组 actions&#xff0c;其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1&#xff1a; 输入&#xff1a;actions [5, 7, 5, 5] 输出&#…...

独孤思维:又有一个副业项目降价了

不要过早量出底牌&#xff0c;不然会变得低贱且廉价。 昨天在一个群里&#xff0c;看到有个博主&#xff0c;没有成交订单。 她把和用户的聊天对话发出来&#xff0c;我们大致看了下。 发现人家是有意向付费的。 但是这个博主过于心急&#xff0c;说今天加入可以优惠&#…...

【笔记】分布式任务调度平台XXL-JOB

这篇笔记主要记录以下内容&#xff1a; &#xff08;1&#xff09;第一次启动xxl-job的过程 &#xff08;2&#xff09;模块、文件、数据库&#xff08;表和字段&#xff09;的作用 &#xff08;3&#xff09;极少的源码解读&#xff08;XxlJobConfig&#xff09; 有点像实…...

Java基础总结上(Ref:JavaGuide)

基础概念与常识 Java语言有哪些特点&#xff0c;优点&#xff1f; 简单易学&#xff0c;是一门面向对象的语言&#xff0c;有封装继承多态三大特性&#xff0c;而且有多重防护机制保证安全性&#xff0c;例如权限修饰符&#xff0c;限制程序直接访问操作系统资源。通过JIT编译…...

嘉誉府5区共有产权看房记

特地工作日来看下嘉誉府5区的网红共有产权的房子&#xff0c;主要是冲着均价2.1万/平才来看。说实话从塘尾地铁步行到嘉誉府5区还挺需要时间的哈。可能以后需要电驴代步到地铁&#xff1f;确实楼盘现在是现楼&#xff0c;今年买明年住。鸿荣源确实很666哈。 今天来不需要排队&a…...

PostgreSQL函数中使用now()或current_timestamp的异同

在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间&#xff0c;包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间&#xff0c;但不包括时区信息。它…...

跟李笑来学美式俚语(Most Common American Idioms): Part 56

Most Common American Idioms: Part 56 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…...

类和对象一

目录 1.类的引入 2.类的定义 3.访问限定符 4.类的作用域 5.类对象模型 6.类的大小 1.类的引入 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体不仅可以定义变量&#xff0c;也可以定义函数。 C兼容C语言&#xff0c;结构用法可以继续使用 同时sruct也升…...

两个数的和最小

两个数的和最小 C 代码C 代码Java 代码Python 代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给你n个整数&#xff0c;你可以从中任意取两个数a和b&#xff0c;问a加上b的和的绝对值最小可能是多少&#xff1f; 输入 有多组测试数据…...

Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)

安装chat大模型&#xff08;不推荐&#xff0c;本地运行的大模型只能聊废话&#xff0c;不如网页版使用openAI等高效&#xff09; 首先下载ollama的安装包 https://ollama.com/ 点击启动访问&#xff1a;http://localhost:11434 Ollama is running 代表已经运行起来了&#x…...

IoTDB AINode 报错,call inference 301: Error ocurred while executing inference

问题及现象 使用时序数据库 IoTDB 的 AINode 的 call inference 语句后报错&#xff1a; Msg: org.apache.iotdb.jdbc.IoTDBSOLException&#xff1a;301: Error ocurred while executing inference:[tuple object has no attribute inference]解决方法 可以替换 venv 里面的…...

Linux网络 UDP socket

背景知识 我们知道&#xff0c; IP 地址用来标识互联网中唯一的一台主机&#xff0c; port 用来标识该主机上唯一的一个网络进程&#xff0c;IPPort 就能表示互联网中唯一的一个进程。所以通信的时候&#xff0c;本质是两个互联网进程代表人来进行通信&#xff0c;{srcIp&…...

Day2——需求分析与设计

教师端签到应用软件的需求分析&#xff1b; 产品经理如何写好产品需求文档&#xff08;附模板&#xff09; 需求分析是软件开发过程中的关键步骤&#xff0c;它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤&#xff1a; 1. 确定分析目标 明确教师端签到…...

aosp15上winscope离线html如何使用?

背景&#xff1a; aosp15上的如何使用Winscope前面已经有分享过相关的blog&#xff0c;这块其实和aosp14没啥大的差别&#xff0c;具体可以看如下2个文章&#xff1a; 手把手教你aosp14编译Winscope 安卓aosp15手机上如何离线获取winscope文件 文章中也说明在aosp15如果直接使…...

AttributeError: module numpy has no attribute int .报错解决

AttributeError: module numpy has no attribute int .报错解决方案_attributeerror: module numpy has no attribute i-CSDN博客 以上为参考教程&#xff0c;试了卸载再安装&#xff0c;不行&#xff0c;报错&#xff1a; Found existing installation: numpy 1.24.3 error: …...

python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)

文章目录 1、常用数据保存模板2.1 保存为Excel格式2.2 保存为CSV格式2.3 保存至mysql数据库2、scrapy中常用数据提取方法2.1 XPath选择器2.2 CSS选择器2.3 正则表达式1、常用数据保存模板 2.1 保存为Excel格式 # 1、导入模块 from openpyxl import workbook# 2、创建一个exce…...

【面试题】简述rabbitmq的组织架构

[面试题]简述rabbitmq的组织架构 RabbitMQ 是一种流行的消息中间件&#xff0c;其架构设计围绕消息生产者, 消息消费者和消息中转&#xff08;Broker&#xff09;展开。以下是 RabbitMQ 的主要组织架构组件和它们之间的关系&#xff1a; 1. 核心组件 1.1 Producer&#xff0…...

C#-WPF 常见类型转换方法(持续更新)

目录 一、普通类型转换 1、Convert类 2、Parse(转String) 3、TryParse(转String) 4、ToString(转String) 5、int转double 6、String转DateTime 7、自定义类型的显示/隐式转换 二、byte[]转ImageSource 方法一 方法二 一、普通类型转换 1、Convert类 提供了一种安全…...

c基础加堆练习题

1】思维导图&#xff1a; 2】在堆区空间连续申请5个int类型大小空间&#xff0c;用来存放从终端输入的5个学生成绩&#xff0c;然后显示5个学生成绩&#xff0c;再将学生成绩升序排序&#xff0c;排序后&#xff0c;再次显示学生成绩。显示和排序分别用函数完成 要求&#xff…...

做了一份前端面试复习计划,保熟~

前言 以前我看到面试贴就直接刷掉的&#xff0c;从不会多看一眼&#xff0c;直到去年 9 月份我开始准备面试时&#xff0c;才发现很多面试经验贴特别有用&#xff0c;看这些帖子&#xff08;我不敢称之为文章&#xff0c;怕被杠&#xff09;的过程中对我的复习思维形成影响很大…...

虚幻引擎开发命名规则

UE的命名规则如下&#xff1a; 模版类以T作为前缀&#xff0c;例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头&#xff0c;如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀&#xff0c;如bPe…...

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…...

Lambda表达式随记

学习链接 目录 作用定义[capture list] 捕获列表(paramter) 参数列表mutable 可变规格throw() 异常说明-> return-type 返回类型{function statement} lambda函数体 Lambda表达式的优缺点Lambda表达式工作原理适用场景STL算法库短小不需要复用函数场景 作用 Lambda表达式&…...

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...

ubuntu系统生成SSL证书配置https

自签名【Lets Encrypt】的测试证书&#xff0c;有效期三个月。 第一步&#xff1a;安装acme&#xff0c;如果没有安装git&#xff0c;需要提前安装 下载came资源 git clone https://github.com/Neilpang/acme.sh.git 无法访问&#xff0c;可以试用gitee的资源&#xff0c;安…...

记录 idea 启动 tomcat 控制台输出乱码问题解决

文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中&#xff0c;修改Custom VM Options完成后保存&#xff0c;并重启 idea 问题现象 运行 tomcat 后&#xff0c;控制台输出乱码 解决排查过程 1. 检查 id…...

C++ unordered_map和unordered_set的使用

1.unordered_set系列的使用 1.1unordered_set和unordered_multiset参考文档 unordered_set和unordered_multiset参考文档 1.2unordered_set类的介绍 • unordered_set的声明如下&#xff0c;Key就是unordered_set底层关键字的类型 • unordered_set默认要求Key⽀持转换为整…...

【探商宝】OpenAI 发布 Sora:视频生成领域的重大突破

2024 年 12 月 10 日&#xff0c;OpenAI 正式推出了备受瞩目的人工智能视频生成模型 Sora&#xff0c;这一举措在科技界引起了轩然大波&#xff0c;为视频创作领域带来了全新的可能性和变革. 一、Sora 的功能与特性 1. 强大的视频生成能力 Sora 能够根据用户输入的文本描述生…...

[代码随想录Day32打卡] 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

理论基础 题型 动归基础&#xff08;这一节就是基础题&#xff09;背包问题打家劫舍股票问题子序列问题 动态规划五部曲 确定dp数组及其下标的含义确定递推公式dp数组如何初始化遍历顺序打印dp数组 509. 斐波那契数 简单~ dp数组及下标含义&#xff1a; dp[i]表示第i各斐…...

【实操GPT-SoVits】声音克隆模型图文版教程

项目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目&#xff0c;不阐述技术原理&#xff08;后期如果有时间研究&#…...