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

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python · PyTorch】循环神经网络 RNN(简单应用)

  • 1. 简介
  • 2. 模拟客流预测(数据集转化Tensor)
    • 3.1 数据集介绍
    • 3.2 训练过程
  • 3. 模拟股票预测(DataLoader加载数据集)
    • 3.1 IBM 数据集
      • 3.1.2 数据集介绍
      • 3.1.3 训练过程
        • ① 利用Matplotlib绘图
        • ② 利用Seaborn绘图
    • 3.2 Amazon 数据集
      • 3.2.2 数据集介绍
      • 3.2.3 训练结果

1. 简介

此前介绍了RNN及其变体LSTM、GRU的结构,本章节介绍相关神经网络的代码,并通过 模拟数据 展示简单的应用场景。

RNN核心代码:

nn.RNN(input_size, hidden_size, num_layers, nonlinearity, bias, batch_first, dropout, bidirectional)

参数介绍:

  • input_size:输入层神经元数量,对应输入特征的维度
  • hidden_size:隐藏层神经元数量
  • num_layers:RNN单元堆叠层数,默认1
  • bias:是否启用偏置,默认True
  • batch_first:是否将batch放在第一位,默认False
    • True:input 为 (batch, seq_len, input_size)
    • False:input 为 (seq_len, batch, input)
  • dropout:丢弃率,值范围为0~1
  • bidirectional:是否使用双向RNN,默认False

调用时参数:

  • input:前侧输入
  • h[n-1]:前侧传递状态

调用时返回:

  • output:本层输出

  • h[n]:本层向后侧传递状态

GRU与RNN参数相同,但LSTM有所不同:

  • input/output:本层输入/输出
  • (h[n-1], c[n-1])/(h[n-1], c[n-1]):传递状态

输入时 seq_len表示序列长度/传递长度:即 输入向量维度为 (seq_len, batch, input)

  • 以自然语言训练为例,假设句子长度为30个单词,单词为50维向量,一次训练10个句子。
  • seq_len=30input_size=50batch_size=10,LSTM结构会根据传入数据 向前传递30次 输出最终结果。

2. 模拟客流预测(数据集转化Tensor)

3.1 数据集介绍

模拟航班数据,经常用于学习机器学习算法。

航班客流数据集

3.2 训练过程

① 导入三方库

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

定义使用设备

device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")

② 读取数据集

从CSV/Excel文件中读取数据

# 模拟航空数据
pf = pd.read_csv('./data/flight.csv')
month, passengers = pf['Month'], pf['Passengers']
scaler = MinMaxScaler(feature_range=(-1, 1))
passengers = scaler.fit_transform(passengers.values.reshape(-1,1))

定义数据集划分方法

def split_data(passengers, looback):# 1. 分段passengers = np.array(passengers)segments = []# 创建所有可能的时间序列for index in range(len(passengers) - lookback):segments.append(passengers[index: index + lookback])segments = np.array(segments)# 2. 确定train和test的数量test_set_size = int(np.round(0.2 *  segments.shape[0]))train_set_size = segments.shape[0] - (test_set_size)# 3. 分割:训练集和测试集:x和yx_train = segments[:train_set_size,:-1]y_train = segments[:train_set_size,-1]   # 序列最后一个是yx_test = segments[train_set_size:,:-1]y_test = segments[train_set_size:,-1]return x_train, y_train, x_test, y_test

读取数据集

lookback = 20 # 设置序列长度
x_train, y_train, x_test, y_test = split_data(passengers, lookback)
print('x_train.shape = ',x_train.shape)
print('y_train.shape = ',y_train.shape)
print('x_test.shape = ',x_test.shape)
print('y_test.shape = ',y_test.shape)

数据转化为Tensor

x_train = torch.from_numpy(x_train).type(torch.Tensor).to(device)
x_test = torch.from_numpy(x_test).type(torch.Tensor).to(device)
y_train = torch.from_numpy(y_train).type(torch.Tensor).to(device)
y_test = torch.from_numpy(y_test).type(torch.Tensor).to(device)

③ 创建神经网络

定义 输入 / 隐藏 / 输出 维度

input_dim = 1
hidden_dim = 32
num_layers = 2
output_dim = 1

定义三种神经网络

class RNN(nn.Module):def __init__(self, input_dim, hidden_dim, num_layers, output_dim):super(RNN, self).__init__()self.rnn = nn.RNN(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):# output维度:[num_steps,  batch_size, hidden_size]# hn维度    :[num_layers, batch_size, hidden_size]output, hn = self.rnn(x)# num_steps和hidden_size保留,取最后一次batchoutput = output[:,-1,:]# 最后几步送入全连接output = self.fc(output)return output
class LSTM(nn.Module):def __init__(self, input_dim, hidden_dim, num_layers, output_dim):super(LSTM, self).__init__()self.input_dim = input_dimself.hidden_dim = hidden_dimself.num_layers = num_layersself.output_dim = output_dimself.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):# 初始化隐藏状态和单元状态h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(device)c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(device)output, (hn, cn) = self.lstm(x, (h0, c0))output = output[:,-1,:]output = self.fc(output)return output
class GRU(nn.Module):def __init__(self, input_dim, hidden_dim, num_layers, output_dim):super(GRU, self).__init__()self.input_dim = input_dimself.hidden_dim = hidden_dimself.num_layers = num_layersself.output_dim = output_dimself.gru = nn.GRU(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):# 初始化隐藏状态和单元状态h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(device)c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(device)output, hn = self.gru(x, h0)output = output[:,-1,:]output = self.fc(output)return output

④ 训练神经网络

预先定义

# 随机种子
torch.manual_seed(20)
# 创建神经网络对象
rnn = RNN(input_dim, hidden_dim, num_layers, output_dim)
lstm = LSTM(input_dim, hidden_dim, num_layers, output_dim)
gru = GRU(input_dim, hidden_dim, num_layers, output_dim)# 确定神经网络运行设备
rnn.to(device)
lstm.to(device)
gru.to(device)# 损失函数
rnn_loss_function = nn.MSELoss()
lstm_loss_function = nn.MSELoss()
gru_loss_function = nn.MSELoss()# 优化器
rnn_optimizer = torch.optim.Adam(rnn.parameters(), lr=0.001)
lstm_optimizer = torch.optim.Adam(lstm.parameters(), lr=0.001)
gru_optimizer = torch.optim.Adam(gru.parameters(), lr=0.001)# 训练轮次
epochs = 200
# 训练损失记录
rnn_final_losses = []
lstm_final_losses = []
gru_final_losses = []

定义神经网络训练方法

def train_rnn():rnn.train()for epoch in range(epochs):# 1. 正向传播y_train_pred_rnn = rnn(x_train)# 2. 计算误差rnn_loss = rnn_loss_function(y_train_pred_rnn, y_train)rnn_final_losses.append(rnn_loss.item())# 3. 反向传播rnn_optimizer.zero_grad()rnn_loss.backward()# 4. 优化参数rnn_optimizer.step()if epoch % 10 == 0:print("RNN:: Epoch: {}, Loss: {} ".format(epoch, rnn_loss.data))return y_train_pred_rnn
def train_lstm():lstm.train()for epoch in range(epochs):# 1. 正向传播y_train_pred_lstm = lstm(x_train)# 2. 计算误差lstm_loss = lstm_loss_function(y_train_pred_lstm, y_train)lstm_final_losses.append(lstm_loss.item())# 3. 反向传播lstm_optimizer.zero_grad()lstm_loss.backward()# 4. 优化参数lstm_optimizer.step()if epoch % 10 == 0:print("LSTM:: Epoch: {}, Loss: {} ".format(epoch, lstm_loss.data))return y_train_pred_lstm
def train_gru():gru.train()for epoch in range(epochs):# 1. 正向传播y_train_pred_gru = gru(x_train)# 2. 计算误差gru_loss = gru_loss_function(y_train_pred_gru, y_train)gru_final_losses.append(gru_loss.item())# 3. 反向传播gru_optimizer.zero_grad()gru_loss.backward()# 4. 优化参数gru_optimizer.step()if epoch % 10 == 0:print("GRU:: Epoch: {}, Loss: {} ".format(epoch, gru_loss.data))return y_train_pred_gru

执行训练方法

y_train_pred_rnn = train_rnn()
torch.save(rnn.state_dict(), "rnn_test.pth")
print("Saved PyTorch Model State to rnn_test.pth")y_train_pred_lstm = train_lstm()
torch.save(lstm.state_dict(), "lstm_test.pth")
print("Saved PyTorch Model State to lstm_test.pth")y_train_pred_gru = train_gru()
torch.save(gru.state_dict(), "gru_test.pth")
print("Saved PyTorch Model State to gru_test.pth")

训练过程

绘制训练结果(最后一次)

数据逆归一化 并转换为DataFrame

original = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_train).detach().numpy()))rnn_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_train_pred_rnn).detach().numpy()))
lstm_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_train_pred_lstm).detach().numpy()))
gru_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_train_pred_gru).detach().numpy()))

执行绘制程序

import seaborn as sns
sns.set_style("darkgrid") fig = plt.figure(figsize=(16, 6))# 画左边的趋势图
plt.subplot(1, 2, 1)
ax = sns.lineplot(x = original.index, y = original[0], label="Data", color='blue')
ax = sns.lineplot(x = rnn_predict.index, y = rnn_predict[0], label="RNN Prediction", color='red')
ax = sns.lineplot(x = lstm_predict.index, y = lstm_predict[0], label="LSTM Prediction", color='darkred')
ax = sns.lineplot(x = gru_predict.index, y = gru_predict[0], label="GRU Prediction", color='black')ax.set_title('Passengers', size = 14, fontweight='bold')
ax.set_xlabel("Days", size = 14)
ax.set_ylabel("Members", size = 14)
ax.set_xticklabels('', size=10)# 画右边的Loss下降图
plt.subplot(1, 2, 2)
ax = sns.lineplot(data=rnn_final_losses, label="RNN Loss", color='red')
ax = sns.lineplot(data=lstm_final_losses, label="LSTM Loss", color='darkblue')
ax = sns.lineplot(data=gru_final_losses, label="GRU Loss", color='black')
ax.set_xlabel("Epoch", size = 14)
ax.set_ylabel("Loss", size = 14)
ax.set_title("Training Loss", size = 14, fontweight='bold')
plt.show()

绘图

⑤ 测试神经网络

定义测试函数

# 测试 RNN
def test_rnn():rnn.eval()total = len(x_test)currect = 0with torch.no_grad():y_test_pred_rnn = rnn(x_test)return y_test_pred_rnn# 测试 LSTM
def test_lstm():lstm.eval()total = len(x_test)currect = 0with torch.no_grad():y_test_pred_lstm = lstm(x_test)return y_test_pred_lstm# 测试 RNN
def test_gru():gru.eval()total = len(x_test)currect = 0with torch.no_grad():y_test_pred_gru = gru(x_test)return y_test_pred_gru

执行测试程序

y_test_pred_rnn  = test_rnn()
y_test_pred_lstm = test_lstm()
y_test_pred_gru  = test_gru()

数据逆归一化 并转换为DataFrame

test_original = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_test).detach().numpy()))test_rnn_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_test_pred_rnn).detach().numpy()))
test_lstm_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_test_pred_lstm).detach().numpy()))
test_gru_predict = pd.DataFrame(scaler.inverse_transform(torch.Tensor.cpu(y_test_pred_gru).detach().numpy()))

执行绘制程序

import seaborn as sns
sns.set_style("darkgrid") ax = sns.lineplot(x = test_original.index, y = test_original[0], label="Data", color='blue')ax = sns.lineplot(x = test_rnn_predict.index, y = test_rnn_predict[0], label="RNN Prediction", color='red')
ax = sns.lineplot(x = test_lstm_predict.index, y = test_lstm_predict[0], label="LSTM Prediction", color='darkred')
ax = sns.lineplot(x = test_gru_predict.index, y = test_gru_predict[0], label="GRU Prediction", color='black')ax.set_title('Passengers', size = 14, fontweight='bold')
ax.set_xlabel("Days", size = 14)
ax.set_ylabel("Members", size = 14)
ax.set_xticklabels('', size=10)plt.show()

测试

3. 模拟股票预测(DataLoader加载数据集)

3.1 IBM 数据集

3.1.2 数据集介绍

IBM股价数据,经常用于学习机器学习算法。

IBM

3.1.3 训练过程

① 导入三方库

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

定义使用设备

device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")

② 读取数据集

PyTorch提供了一种标准的数据集读取方法:

  • 自定义继承自torch.utils.data.Dataset类的XXDataset类,并重写__getitem__()__len__()方法
  • 利用torch.utils.data.DataLoader加载自定义DataSet实例中读取的数据

例如,官方提供的CIFAR10数据集 就是 使用这种方法读取:

import torchvision.datasets
from torch.utils.data import DataLoadertrain_data=torchvision.datasets.CIFAR10(root="datasets",train=False,transform=torchvision.transforms.ToTensor(),download=True)
train_loader=DataLoader(dataset=train_data,batch_size=4,shuffle=True)

DataLoader类初始化参数:

DataLoader

其中常用的参数包括:

  • dataset:Dataset类
  • batch_size:批量大小
  • shuffle:是否每轮打乱数据
  • num_workers:读取数据时工作线程数(默认0:代表只使用主进程)
  • drop_last:是否丢弃所余非完整batch数据(数据长度不能整除batch_size,是否丢弃最后不完整的batch)
  • sampler:从数据集中抽取样本的策略
  • batch_sampler:类似于sampler,但每次返回一个batch的索引。与batch_size、shuffle、sampler和drop_last互斥

DataLoader参数
DataLoader参数

部分参数简介:

num_worker 工作方式

DataLoader一次创建num_worker数量个名为worker工作进程。并用batch_samplerbatch分配给worker,由workerbatch加载进RAM/内存DataLoader迭代时会从RAM/内存中检索并获取batch;若检索失败,则用num_workerworker继续加载batchRAM/内存DataLoader再尝试从中获取batch

sampler / batch_sampler 采样方式

  • Random Sampler(随机采样)
    • 随机从数据集中选择样本,可设置随机数种子,保证采样结果相同
  • Subset Random Sampler(子集随机采样)
    • 从数据集指定子集随机采集样本,可用于数据集划分(训练集、验证集等)
  • Weighted Random Sampler(加权随机采样)
    • 根据指定的样本权重随机采样,可用于处理类别不平衡问题
  • BatchSample(批采样)
    • 将样本索引分为多个batch,每个batch包含指定数量样本索引

有时设置 num_worker 会不同步致使程序卡顿,这里博主将其设置为 num_worker=0 避免卡顿。


自定义股价Dataset类

# 定义StockDataset类  继承Dataset类  重写__getitem()__和__len__()方法
class StockDataset(torch.utils.data.Dataset):# 初始化函数 得到数据def __init__(self, data, seq_length):self.data = dataself.seq_length = seq_length# Index是根据 batch_size 划分数据后得到的索引,最后将data和对应的labels一并返回def __getitem__(self, idx):x = self.data[idx:idx + self.seq_length]  # 输入序列y = self.data[idx + self.seq_length]      # 输出值return torch.tensor(x, dtype=torch.float32), torch.tensor(y, dtype=torch.float32)# 该函数返回数据长度大小,DataLoader会调用此方法def __len__(self):return len(self.data) - self.seq_length

利用DataLoader读取Dataset数据

train_length = 2000   # 训练长度
seq_length   = 20     # 序列长度
batch_size   = 32     # 批量大小# 利用DataLoader读取Dataset数据
train_dataset = StockDataset(origin_data[:train_length], seq_length)
test_dataset = StockDataset(origin_data[train_length:], seq_length)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size = batch_size, shuffle=True, num_workers = 0)
test_dataloader  = torch.utils.data.DataLoader(test_dataset, batch_size = batch_size, shuffle=True, num_workers = 0)

③ 创建神经网络

class RNN(nn.Module):def __init__(self, input_dim, hidden_dim, num_layers, output_dim):super(RNN, self).__init__()self.rnn = nn.RNN(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):output, hn = self.rnn(x)output = output[:,-1,:]output = self.fc(output)return output

④ 训练神经网络

预先定义

# 随机种子
torch.manual_seed(20)
# 创建神经网络对象
rnn = RNN(input_dim, hidden_dim, num_layers, output_dim)
# 确定神经网络运行设备
rnn.to(device)
# 损失函数
rnn_loss_function = nn.MSELoss()
# 优化器
rnn_optimizer = torch.optim.Adam(rnn.parameters(), lr=0.001)
# 训练轮次
epochs = 50
# 训练损失记录
rnn_final_losses = []

定义训练函数

def train_rnn():min_loss = 1.0for epoch in range(epochs):rnn.train()rnn_loss = 0.0for x_train, y_train in train_dataloader:x_train = x_train.to(device=device)y_train = y_train.to(device=device)# 1. 正向传播y_train_pred_rnn = rnn(x_train)# 2. 计算误差loss_func_result = rnn_loss_function(y_train_pred_rnn, y_train)rnn_loss += loss_func_result.item()# 3. 反向传播rnn_optimizer.zero_grad()loss_func_result.backward()# 4. 优化参数rnn_optimizer.step()rnn_loss = rnn_loss / len(train_dataloader)rnn_final_losses.append(rnn_loss)# 对比if(rnn_loss < min_loss):min_loss = rnn_losstorch.save(rnn.state_dict(), "rnn_test.pth")print("Saved PyTorch Model State to rnn_test.pth")if epoch % 10 == 0:print("RNN:: Epoch: {}, Loss: {} ".format(epoch + 1, rnn_loss))

执行训练函数

y_train_pred_rnn_r = train_rnn()

训练

⑤ 测试神经网络

# 使用训练好的模型进行预测
rnn.load_state_dict(torch.load("rnn_test.pth"))
rnn.eval()
with torch.no_grad():# 准备所有输入序列X_train = torch.stack([x for x, y in train_dataset])train_predictions = rnn(X_train.to(device)).squeeze().cpu().detach().numpy()with torch.no_grad():# 准备所有输入序列X_test = torch.stack([x for x, y in test_dataset])test_predictions = rnn(X_test.to(device)).squeeze().cpu().detach().numpy()# 将预测结果逆归一化
origin_data = scaler.inverse_transform(origin_data.reshape(-1, 1))
train_predictions = scaler.inverse_transform(train_predictions.reshape(-1, 1))
test_predictions = scaler.inverse_transform(test_predictions.reshape(-1, 1))
① 利用Matplotlib绘图

执行绘图程序

# 绘制结果
plt.figure(figsize=(12, 6))
plt.plot(origin_data, label='Original Data')
plt.plot(range(seq_length,seq_length+len(train_predictions)),train_predictions, label='RNN Train Predictions', linestyle='--')
plt.plot(range(seq_length+train_length,len(test_predictions)+seq_length+train_length), test_predictions, label='RNN Test Predictions', linestyle='--')plt.legend()
plt.title("Training Set Predictions")
plt.xlabel("Time Step")
plt.ylabel("Value")
plt.show()

绘图Matplotlib

② 利用Seaborn绘图

将数据转换为DataFrame

original = pd.DataFrame(origin_data)
df_train_predictions = pd.DataFrame(train_predictions)
df_test_predictions = pd.DataFrame(test_predictions)

执行绘图程序

import seaborn as sns
sns.set_style("darkgrid") fig = plt.figure(figsize=(16, 6))
fig.subplots_adjust(hspace=0.2, wspace=0.2)# 画左边的趋势图
plt.subplot(1, 2, 1)
ax = sns.lineplot(x = original.index, y = original[0], label="Original Data", color='blue')
ax = sns.lineplot(x = df_train_predictions.index + seq_length, y = df_train_predictions[0], label="RNN Train Prediction", color='red')
ax = sns.lineplot(x = df_test_predictions.index + seq_length + train_length, y = df_test_predictions[0], label="RNN Test Prediction", color='darkred')ax.set_title('Stock', size = 14, fontweight='bold')
ax.set_xlabel("Days", size = 14)
ax.set_ylabel("Value", size = 14)
ax.set_xticklabels('', size=10)# 画右边的Loss下降图
plt.subplot(1, 2, 2)
ax = sns.lineplot(data=rnn_final_losses, label="RNN Loss", color='red')
ax = sns.lineplot(data=lstm_final_losses, label="LSTM Loss", color='darkblue')
ax = sns.lineplot(data=gru_final_losses, label="GRU Loss", color='black')
ax.set_xlabel("Epoch", size = 14)
ax.set_ylabel("Loss", size = 14)
ax.set_title("Training Loss", size = 14, fontweight='bold')
plt.show()

Seaborn绘图

3.2 Amazon 数据集

3.2.2 数据集介绍

Amazon股价数据,经常用于学习机器学习算法。

Amazon

3.2.3 训练结果

代码与IBM数据集类似,这里直接展示运行结果。


训练过程

训练

Matplotlib绘图

绘图Matplotlib

Seaborn绘图

绘图Seaborn

相关文章:

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python PyTorch】循环神经网络 RNN&#xff08;简单应用&#xff09; 1. 简介2. 模拟客流预测&#xff08;数据集转化Tensor&#xff09;3.1 数据集介绍3.2 训练过程 3. 模拟股票预测&#xff08;DataLoader加载数据集&#xff09;3.1 IBM 数据集3.1.2 数据集介绍3.1.3 训练…...

Spring Boot 项目开发流程全解析

目录 引言 一、开发环境准备 二、创建项目 三、项目结构 四、开发业务逻辑 1.创建实体类&#xff1a; 2.创建数据访问层&#xff08;DAO&#xff09;&#xff1a; 3.创建服务层&#xff08;Service&#xff09;&#xff1a; 4.创建控制器层&#xff08;Controller&…...

基于互联网协议的诊断通信(DoIP)

1、ISO 13400标准和其他汽车网络协议标准有何不同&#xff1f; ISO 13400 标准即 DoIP 协议标准&#xff0c;与其他常见汽车网络协议标准&#xff08;如 CAN、LIN、FlexRay 等&#xff09;有以下不同&#xff1a; 通信基础与适用场景 ISO 13400&#xff1a;基于互联网协议&a…...

MacDroid for Mac v2.3 安卓手机文件传输助手 支持M、Intel芯片 4.7K

MacDroid 是Mac毒搜集到的一款安卓手机文件传输助手&#xff0c;在Mac和Android设备之间传输文件。您只需要将安卓手机使用 USB 连接到 Mac 电脑上即可将安卓设备挂载为本地磁盘&#xff0c;就像编辑mac磁盘上的文件一样编辑安卓设备上的文件&#xff0c;MacDroid支持所有 Andr…...

Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking

一.Skywalking介绍 Apache SkyWalking是一个开源的分布式追踪与性能监视平台&#xff0c;特别适用于微服务架构、云原生环境以及基于容器&#xff08;如Docker、Kubernetes&#xff09;的应用部署。该项目由吴晟发起&#xff0c;并已加入Apache软件基金会的孵化器&#xff0c;…...

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…...

std::allocator_traits 能做但 std::allocator 不能的事情

&#x1f31f; std::allocator_traits 能做但 std::allocator 不能的事情 1️⃣ 适配自定义分配器 假设你要实现一个内存池 MyAllocator&#xff0c;而 STL 容器默认使用的是 std::allocator。 如果你希望 STL 容器可以使用你的 MyAllocator&#xff0c;你 不能直接用 std::a…...

深度解析Ant Design Pro 6开发实践

深度解析Ant Design Pro 6全栈开发实践&#xff1a;从架构设计到企业级应用落地 一、Ant Design Pro 6核心特性与生态定位&#xff08;技术架构分析&#xff09; 作为Ant Design生态体系的旗舰级企业应用中台框架&#xff0c;Ant Design Pro 6基于以下技术栈实现突破性升级&am…...

flutter 局部刷新控件Selector源码实现原理

Flutter 中的 Selector 组件是 provider 包提供的一个优化工具&#xff0c;用于在状态管理中仅选择所需数据片段&#xff0c;避免不必要的 Widget 重建。其实现原理基于以下几个关键点&#xff1a; 1. 核心设计目标 选择性重建&#xff1a;仅当特定数据变化时触发 Widget 重建&…...

Hadoop之01:HDFS分布式文件系统

HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…...

vite+react+ts如何集成redux状态管理工具,实现持久化缓存

1.安装插件 这里的redux-persist--进行数据的持久化缓存&#xff0c;确保页面刷新数据不会丢失 yarn add react-redux^9.2.0 redux-persist^6.0.0 reduxjs/toolkit^2.5.1 2.创建仓库文件夹 在项目的src文件夹下创建名为store的文件夹&#xff0c;里面的具体文件如下 featur…...

文字的力量

不知道以前的时代的年轻人有没有这样的感受。现在我觉得自己是不是出现了认知偏差&#xff0c;发现在很多描写现在的二十几岁年轻人的成长经历的文字下面都会出现很多共鸣&#xff0c;包括我自己也有&#xff0c;就让我有一个错觉:是不是中国所有的和我同龄的年轻人都是这样过来…...

网络空间安全(4)web应用程序安全要点

前言 Web应用程序安全是确保Web应用程序、服务和服务器免受网络攻击和威胁的关键环节。 一、编写安全的代码 输入验证与过滤&#xff1a;确保所有的用户输入都被正确验证和过滤&#xff0c;以防止注入攻击等安全漏洞。开发者应对URL、查询关键字、HTTP头、POST数据等进行严格的…...

openwebUI访问vllm加载deepseek微调过的本地大模型

文章目录 前言一、openwebui安装二、配置openwebui环境三、安装vllm四、启动vllm五、启动openwebui 前言 首先安装vllm&#xff0c;然后加载本地模型&#xff0c;会起一个端口好。 在安装openwebui,去访问这个端口号。下面具体步骤的演示。 一、openwebui安装 rootautodl-co…...

安全测试之五:SQL Server注入漏洞几个实例

示例 1&#xff1a;在 GET 请求中测试 SQL 注入 最简单且有时最有效的情况是针对登录页面进行测试。当登录页面请求用户输入用户名和密码时&#xff0c;攻击者可以尝试输入以下字符串 “ or 11”&#xff08;不包含双引号&#xff09;&#xff1a; https://vulnerable.web.ap…...

计算机毕业设计SpringBoot+Vue.js线上辅导班系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

C#委托(delegate)的常用方式

C# 中委托的常用方式&#xff0c;包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);&#xff1a;定义了一个公共委托类型 …...

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险&#xff1a; 5.2漏洞利用&#xff1a; 5.3JavaScript 与 Native 代码通信 六、Chr…...

【Tourism】Yongzhou

永州市&#xff08;英文&#xff1a;Yongzhou city、Yungchow city&#xff09;是湖南省辖地级市&#xff0c;简称“永”&#xff0c;别称“零陵”或“潇湘”。位于湖南南部&#xff0c;潇、湘二水汇合处&#xff0c;地势三面环山、地貌复杂多样。截至2022年10月&#xff0c;永…...

C语言--预处理详解

预处理详解 1. 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循A…...

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied

近期如果有开发者的 iOS 真机升级到 18.4 beta&#xff0c;大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示&#xff0c;其实从 log 可以很直观看出来&#xff0c;就是 Dart VM 在初始化时&#xff0c;对内核文件「解释运行&#xff08;JIT&#xff09;」时…...

Kubespray部署企业级高可用K8S指南

目录 前言1 K8S集群节点准备1.1 主机列表1.2 kubespray节点python3及pip3准备1.2.1. 更新系统1.2.2. 安装依赖1.2.3. 下载Python 3.12源码1.2.4. 解压源码包1.2.5. 编译和安装Python1.2.6. 验证安装1.2.7. 设置Python 3.12为默认版本&#xff08;可选&#xff09;1.2.8. 安装pi…...

基于zookeeper搭建kafka集群

1、什么是kafka Kafka 是一款开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后由 Apache 基金会维护。它被设计用于高吞吐、可扩展的实时数据管道和流处理场景。Kafka 的核心功能包括发布和订阅消息流、持久化存储数据以及实时处理数据流。其架构基于生…...

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的捕捉流程&#xff0c;信号集&#xff0c;sigaction&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 可重入…...

PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下

PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…...

JeeWMS graphReportController.do SQL注入漏洞复现(CVE-2025-0392)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

部署Joplin私有云服务器postgres版-docker compose

我曾经使用过一段时间 Joplin&#xff0c;官方版本是收费的&#xff0c;而我更倾向于将数据掌握在自己手中。因此&#xff0c;在多次权衡后&#xff0c;我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连&#xff0c;下面是使用 Docker Compose 配置数据库…...

高频 SQL 50 题(基础版)_550. 游戏玩法分析 IV

高频 SQL 50 题&#xff08;基础版&#xff09;_550. 游戏玩法分析 IV select IFNULL(round(count(distinct(restult.player_id))/count(distinct(Activity.player_id)),2),0) as fraction from(select Activity.player_id,Activity.event_datefrom Activity join(select play…...

Redis Redis介绍、安装 - Redis客户端

目录 redis是什么&#xff0c;他的应用场景是什么&#xff1f; Redis的一些主要特点和应用场景&#xff1a; redis的官方网站&#xff1a;Redis redis是键值型数据库&#xff1a;&#xff08;也就是key-value模式&#xff09;&#xff08;跟python的字典很像&#xff09; …...

计算机毕业设计SpringBoot+Vue.js智能无人仓库管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

课程《MIT Introduction to Deep Learning》

在Youtubu上&#xff0c;MIT Introduction to Deep Learning (2024) | 6.S191 共8节课&#xff1a; (1) MIT Introduction to Deep Learning (2024) | 6.S191 (2) MIT 6.S191: Recurrent Neural Networks, Transformers, and Attention (3) MIT 6.S191: Convolutional Neural N…...

Linux ls 命令

Linux ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容&#xff08;列出目前工作目录所含的文件及子目录)。 语法 ls [-alrtAFR] [name...] 参数 : -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)-d 只列出目…...

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能&#xff0c;但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能&#xff0c;不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性&#xff0c;查…...

SpringBoot项目中读取resource目录下的文件(六种方法)

文章目录 一、先获取绝对路径再读取文件(jar包里会获取不到) 方法一&#xff1a;类加载器的getResource().getPath()获取目录路径方法二&#xff1a;类加载器的getResource().getPath()获取文件路径 二、直接获取文件流&#xff08;jar包可用&#xff09; 方法三&#xff1a;Cl…...

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…...

Vscode通过Roo Cline接入Deepseek

文章目录 背景第一步、安装插件第二步、申请API key第三步、Vscode中配置第四步、Deepseek对话 背景 如何在vscode编译器中使用deepseek&#xff0c;记录下来&#xff0c;方便备查。 第一步、安装插件 在vscode中安装Roo Cline&#xff08;prev.Roo Client&#xff09;插件&…...

一周一个Unity小游戏2D反弹球游戏 - 球反弹的方向

前言 本文将实现当球在球板上反弹时,会根据球板移动的方向来给球施加反弹的力,例如当球板往左移动时反弹球,则球应向左上方反弹,若球板往右移动时反弹球,则球应向右上方反弹。 实现球板的反弹方向逻辑 首先给SpringBoard游戏物体添加上2D的刚体,并设置好对应的参数, 锁定…...

大数据学习(52)-MySQL数据库基本操作

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

Pico 4 Enterprise(企业版)与Unity的交互-有线串流调试篇

入手了Pico 4 E做VR开发&#xff0c;谁知入了天坑...根据官方文档&#xff0c;尝试了串流助手、企业串流、PICO Developer Center&#xff0c;陷入了各种版本问题、环境问题的陷阱。而且Pico4E的OS自24年12开始就不再更新&#xff0c;头盔中预装的企业串流版本也较低&#xff0…...

40岁开始学Java:Java中单例模式(Singleton Pattern),适用场景有哪些?

在Java中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。以下是详细的实现方式、适用场景及注意事项&#xff1a; 一、单例模式的实现方式 1. 饿汉式&#xff08;Eager Initialization&#xff09; …...

【基于Raft的KV共识算法】-序:Raft概述

本文目录 1.为什么会有Raft&#xff1f;CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体&#xff1f; 3.实现思路任期领导选举日志同步 1.为什么会有Raft&#xff1f; 简单来说就是数据会随着业务和时间的增长&#xff0c;单机不能存的下&#xff0c;这个时候需要以某种…...

windows下玩转vllm:在wsl下安装vllm后续,设置modelscope作为下载源

文章目录 前言所涉及的之前的关键步骤解决模型权重下载网络不通畅的问题vllm和modelscope整合后的bug附录 ImportError: cannot import name _try_login from modelscope.utils.hf_util 全部报错信息前言 之前,咱们说了,由于windows不支持直接部署vllm,所以要么采用wsl,要…...

redis --- 相关基础知识整理

目录 一、基本1、数据结构2、有序集合的编码1. 压缩列表&#xff08;Ziplist&#xff09;2. 跳跃列表&#xff08;SkipList&#xff09;3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化&#xff08;RDB AOF&#xff09;4、 RDB和AOF的对比…...

基于Rook的Ceph云原生存储部署与实践指南(下)

#作者&#xff1a;任少近 文章目录 6Ceph资源对像管理6.1查看services6.2查看Jobs6.3 查看deployments.apps6.4查看daemonsets.apps6.5查看configmaps6.6查看clusterroles.rbac.authorization.k8s.io6.7查看clusterrolebindings.rbac.authorization.k8s.io6.8通过cephclusters…...

计算机网络---TCP三握四挥

文章目录 TCPTCP 的核心特点TCP 与 UDP 特性对比TCP 标志位 TCP 的三次握手&#xff08;建立连接&#xff09;TCP 三次握手概述图解 TCP 三次握手为什么需要三次握手&#xff0c;而不是两次为什么要三次握手&#xff0c;而不是四次三次握手连接阶段&#xff0c;最后一次 ACK 包…...

linux基础知识

Linux版本 内核版和开发版 奇数为开发板 偶数为稳定版 Debian 属于自由开源稳定的linux发行版本&#xff0c;可以由用户进行维护&#xff0c;目前被教育机构、商业公司、非盈利组织和政府机构使用 Red Hat Enterprise Linux(RHEL) 由red hat公司开发的开源linux版本 RHEL服…...

快检查达梦库怎么了

扁鹊的弟弟来了 要求5分钟定位达梦数据库问题 #!/bin/bash## content 实例个数 告警日志 实例状态 用户连接 活动会话 锁 集群状态 服务状态 磁盘空间 cpu mem 侦听及日志 ## scope 单机、DW、DSC Linux 多实例 ## example 将脚本保存为d.sh&#xff0c;用root用执行&#…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展&#xff0c;数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言&#xff0c;提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架&#xff0c;分析其特点、应用场景以及未来发展趋…...

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…...

jeecgboot项目idea启动项目(二)

文章目录 一、IntelliJ IDEA1.安装2.配置maven3.配置jdk 二、IDEA启动项目三、IDEA2024.1.4破解 一、IntelliJ IDEA ‌IntelliJ IDEA是一款由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java和Kotlin编程&#xff0c;但也支持多种其他编程语…...