深度学习每周学习总结R4(LSTM-实现糖尿病探索与预测)

news2025/1/14 15:46:19
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客R6中的内容,为了便于自己整理总结起名为R4
  • 🍖 原作者:K同学啊 | 接辅导、项目定制

目录

      • 0. 总结
      • 1. LSTM介绍
        • LSTM的基本组成部分
        • 如何理解与应用LSTM
      • 2. 数据预处理
      • 3. 数据集构建
      • 4. 定义模型
      • 5. 初始化模型及优化器
      • 6. 训练函数
      • 7. 测试函数
      • 8. 训练过程
      • 9. 模型评估

0. 总结

数据导入及处理部分:在 PyTorch 中,我们通常先将 NumPy 数组转换为 torch.Tensor,再封装到 TensorDataset 或自定义的 Dataset 里,然后用 DataLoader 按批次加载。

模型构建部分:LSTM

设置超参数:在这之前需要定义损失函数,学习率(动态学习率),以及根据学习率定义优化器(例如SGD随机梯度下降),用来在训练中更新参数,最小化损失函数。

定义训练函数:函数的传入的参数有四个,分别是设置好的DataLoader(),定义好的模型,损失函数,优化器。函数内部初始化损失准确率为0,接着开始循环,使用DataLoader()获取一个批次的数据,对这个批次的数据带入模型得到预测值,然后使用损失函数计算得到损失值。接下来就是进行反向传播以及使用优化器优化参数,梯度清零放在反向传播之前或者是使用优化器优化之后都是可以的,一般是默认放在反向传播之前。

定义测试函数:函数传入的参数相比训练函数少了优化器,只需传入设置好的DataLoader(),定义好的模型,损失函数。此外除了处理批次数据时无需再设置梯度清零、返向传播以及优化器优化参数,其余部分均和训练函数保持一致。

训练过程:定义训练次数,有几次就使用整个数据集进行几次训练,初始化四个空list分别存储每次训练及测试的准确率及损失。使用model.train()开启训练模式,调用训练函数得到准确率及损失。使用model.eval()将模型设置为评估模式,调用测试函数得到准确率及损失。接着就是将得到的训练及测试的准确率及损失存储到相应list中并合并打印出来,得到每一次整体训练后的准确率及损失。

结果可视化

模型的保存,调取及使用。在PyTorch中,通常使用 torch.save(model.state_dict(), ‘model.pth’) 保存模型的参数,使用 model.load_state_dict(torch.load(‘model.pth’)) 加载参数。

需要改进优化的地方:确保模型和数据的一致性,都存到GPU或者CPU;注意numclasses不要直接用默认的1000,需要根据实际数据集改进;实例化模型也要注意numclasses这个参数;此外注意测试模型需要用(3,224,224)3表示通道数,这和tensorflow定义的顺序是不用的(224,224,3),做代码转换时需要注意。

1. LSTM介绍

LSTM(Long Short-Term Memory)是一种特殊类型的循环神经网络(RNN),主要用于处理和预测基于时间序列的数据。它解决了传统RNN在处理长时间依赖问题时的局限性,比如“梯度消失”问题。

LSTM的基本组成部分

LSTM通过“记忆单元”来决定哪些信息需要记住,哪些需要遗忘。它的核心是一个“门控”机制,主要有三个“门”:

  1. 遗忘门(Forget Gate):决定上一时刻的状态需要遗忘多少。
  2. 输入门(Input Gate):决定当前输入信息中有多少被存储到“记忆单元”。
  3. 输出门(Output Gate):决定“记忆单元”中的信息有多少会传递到下一时刻的状态。
如何理解与应用LSTM
  1. 理解LSTM的优势:LSTM能捕捉长时间序列中的依赖关系,适合处理那些长序列的数据,如文本、语音、金融数据等。相比于传统的RNN,LSTM能够有效解决“梯度消失”问题,使得模型能够学习长期的依赖关系。

  2. 应用场景:LSTM广泛应用于自然语言处理(如文本生成、机器翻译、情感分析)、语音识别、时间序列预测(如股市预测)等领域。

  3. 如何使用LSTM:在初学者阶段,可以从以下几个步骤入手:

    • 数据预处理:将数据转换成适合时间序列建模的格式,比如文本序列或连续的时间戳数据。
    • 选择框架:使用像TensorFlow或PyTorch这样的深度学习框架来实现LSTM。你可以从简单的LSTM网络开始,逐渐增加网络复杂性。
    • 调试与优化:调整LSTM的超参数(如隐藏单元数、学习率、批量大小等)来提升模型性能。

你可以从一个简单的文本生成模型或者时间序列预测模型开始,逐步理解LSTM的细节和优势。

import torch.nn as nn
import torch.nn.functional as F
import torchvision,torch

import numpy             as np
import pandas            as pd
import seaborn           as sns
from sklearn.model_selection   import train_test_split
import matplotlib.pyplot as plt

plt.rcParams['savefig.dpi'] = 500 #图片像素
plt.rcParams['figure.dpi']  = 500 #分辨率

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

import warnings 
warnings.filterwarnings("ignore")

# 设置硬件设备,如果有GPU则使用,没有则使用cpu
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
device(type='cuda')

2. 数据预处理

DataFrame=pd.read_excel('./data/dia.xlsx')
DataFrame.head()
卡号性别年龄高密度脂蛋白胆固醇低密度脂蛋白胆固醇极低密度脂蛋白胆固醇甘油三酯总胆固醇脉搏舒张压高血压史尿素氮尿酸肌酐体重检查结果是否糖尿病
0180544210381.252.991.070.645.31838304.99243.35010
1180544220311.151.990.840.503.98856304.72391.04710
2180544230271.292.210.690.604.19736105.87325.75110
3180544240330.932.010.660.843.60836002.40203.24020
4180544250361.172.830.830.734.83856704.09236.84300
# 查看数据是否有缺失值
print('数据缺失值---------------------------------')
print(DataFrame.isnull().sum())
数据缺失值---------------------------------
卡号            0
性别            0
年龄            0
高密度脂蛋白胆固醇     0
低密度脂蛋白胆固醇     0
极低密度脂蛋白胆固醇    0
甘油三酯          0
总胆固醇          0
脉搏            0
舒张压           0
高血压史          0
尿素氮           0
尿酸            0
肌酐            0
体重检查结果        0
是否糖尿病         0
dtype: int64
# 数据分布分析
feature_map = {
    '年龄': '年龄',
    '高密度脂蛋白胆固醇': '高密度脂蛋白胆固醇',
    '低密度脂蛋白胆固醇': '低密度脂蛋白胆固醇',
    '极低密度脂蛋白胆固醇': '极低密度脂蛋白胆固醇',
    '甘油三酯': '甘油三酯',
    '总胆固醇': '总胆固醇',
    '脉搏': '脉搏',
    '舒张压':'舒张压',
    '高血压史':'高血压史',
    '尿素氮':'尿素氮',
    '尿酸':'尿酸',
    '肌酐':'肌酐',
    '体重检查结果':'体重检查结果'
}
plt.figure(figsize=(15, 10))

for i, (col, col_name) in enumerate(feature_map.items(), 1):
    plt.subplot(3, 5, i)
    sns.boxplot(x=DataFrame['是否糖尿病'], y=DataFrame[col])
    plt.title(f'{col_name}的箱线图', fontsize=14)
    plt.ylabel('数值', fontsize=12)
    plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.tight_layout()
plt.show()

请添加图片描述

3. 数据集构建

from sklearn.preprocessing import StandardScaler

# '高密度脂蛋白胆固醇'字段与糖尿病负相关,故而在 X 中去掉该字段
X = DataFrame.drop(['卡号','是否糖尿病','高密度脂蛋白胆固醇'],axis=1)
y = DataFrame['是否糖尿病']

# sc_X    = StandardScaler()
# X = sc_X.fit_transform(X)

X = torch.tensor(np.array(X), dtype=torch.float32)
y = torch.tensor(np.array(y), dtype=torch.int64)

train_X, test_X, train_y, test_y = train_test_split(X, y, 
                                                    test_size=0.2,
                                                    random_state=1)
train_X.shape, train_y.shape
(torch.Size([804, 13]), torch.Size([804]))
from torch.utils.data import TensorDataset, DataLoader

train_dl = DataLoader(TensorDataset(train_X, train_y),
                      batch_size=64, 
                      shuffle=False)

test_dl  = DataLoader(TensorDataset(test_X, test_y),
                      batch_size=64, 
                      shuffle=False)

4. 定义模型

class model_lstm(nn.Module):
    def __init__(self):
        super(model_lstm, self).__init__()
        self.lstm0 = nn.LSTM(input_size=13 ,hidden_size=200, 
                             num_layers=1, batch_first=True)
        
        self.lstm1 = nn.LSTM(input_size=200 ,hidden_size=200, 
                             num_layers=1, batch_first=True)
        self.fc0   = nn.Linear(200, 2)
 
    def forward(self, x):
 
        out, hidden1 = self.lstm0(x) 
        out, _ = self.lstm1(out, hidden1) 
        out    = self.fc0(out) 
        return out   

5. 初始化模型及优化器

model = model_lstm().to(device)
print(model)

loss_fn    = nn.CrossEntropyLoss() # 创建损失函数
learn_rate = 1e-3   # 学习率
lambda1 = lambda epoch:(0.92**(epoch//2))

optimizer = torch.optim.Adam(model.parameters(),lr = learn_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda=lambda1) # 选定调整方法
epochs     = 60
model_lstm(
  (lstm0): LSTM(13, 200, batch_first=True)
  (lstm1): LSTM(200, 200, batch_first=True)
  (fc0): Linear(in_features=200, out_features=2, bias=True)
)

6. 训练函数

# 训练循环
def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)  # 训练集的大小
    num_batches = len(dataloader)   # 批次数目, (size/batch_size,向上取整)

    train_loss, train_acc = 0, 0  # 初始化训练损失和正确率
    
    for X, y in dataloader:  # 获取图片及其标签
        X, y = X.to(device), y.to(device)
        
        # 计算预测误差
        pred = model(X)          # 网络输出
        loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失
        
        # 反向传播
        optimizer.zero_grad()  # grad属性归零
        loss.backward()        # 反向传播
        optimizer.step()       # 每一步自动更新
        
        # 记录acc与loss
        train_acc  += (pred.argmax(1) == y).type(torch.float).sum().item()
        train_loss += loss.item()
            
    train_acc  /= size
    train_loss /= num_batches

    return train_acc, train_loss

7. 测试函数

def test (dataloader, model, loss_fn):
    size        = len(dataloader.dataset)  # 测试集的大小
    num_batches = len(dataloader)          # 批次数目, (size/batch_size,向上取整)
    test_loss, test_acc = 0, 0
    
    # 当不进行训练时,停止梯度更新,节省计算内存消耗
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            
            # 计算loss
            target_pred = model(X)
            loss        = loss_fn(target_pred, y)
            
            test_loss += loss.item()
            test_acc  += (target_pred.argmax(1) == y).type(torch.float).sum().item()

    test_acc  /= size
    test_loss /= num_batches

    return test_acc, test_loss

8. 训练过程

import copy

train_loss = []
train_acc  = []
test_loss  = []
test_acc   = []

best_acc = 0.0

for epoch in range(epochs):
    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, optimizer)
    
    # 更新学习率
    scheduler.step() # 更新学习率——调用官方动态学习率时使用
    
    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)
    
    # 保存最佳模型
    if epoch_test_acc > best_acc:
        best_acc = epoch_test_acc
        best_model = copy.deepcopy(model)

    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)
    
    # 获取当前的学习率
    lr = optimizer.state_dict()['param_groups'][0]['lr']
    
    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}')
    print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, 
                          epoch_test_acc*100, epoch_test_loss, lr))
    
print('Done. Best test acc: ', best_acc)
Epoch: 1, Train_acc:56.2%, Train_loss:0.672, Test_acc:52.5%, Test_loss:0.717, Lr:9.20E-04
Epoch: 2, Train_acc:57.6%, Train_loss:0.656, Test_acc:61.4%, Test_loss:0.691, Lr:8.46E-04
Epoch: 3, Train_acc:64.6%, Train_loss:0.620, Test_acc:56.9%, Test_loss:0.664, Lr:8.46E-04
Epoch: 4, Train_acc:68.9%, Train_loss:0.575, Test_acc:60.9%, Test_loss:0.638, Lr:7.79E-04
Epoch: 5, Train_acc:72.4%, Train_loss:0.528, Test_acc:65.3%, Test_loss:0.632, Lr:7.79E-04
Epoch: 6, Train_acc:75.5%, Train_loss:0.494, Test_acc:64.9%, Test_loss:0.618, Lr:7.16E-04
Epoch: 7, Train_acc:77.6%, Train_loss:0.456, Test_acc:67.3%, Test_loss:0.621, Lr:7.16E-04
Epoch: 8, Train_acc:79.1%, Train_loss:0.429, Test_acc:70.3%, Test_loss:0.608, Lr:6.59E-04
Epoch: 9, Train_acc:81.5%, Train_loss:0.399, Test_acc:67.8%, Test_loss:0.642, Lr:6.59E-04
Epoch:10, Train_acc:82.8%, Train_loss:0.377, Test_acc:67.8%, Test_loss:0.636, Lr:6.06E-04
Epoch:11, Train_acc:84.3%, Train_loss:0.351, Test_acc:67.3%, Test_loss:0.679, Lr:6.06E-04
Epoch:12, Train_acc:85.2%, Train_loss:0.330, Test_acc:67.3%, Test_loss:0.683, Lr:5.58E-04
Epoch:13, Train_acc:87.1%, Train_loss:0.311, Test_acc:67.8%, Test_loss:0.761, Lr:5.58E-04
Epoch:14, Train_acc:86.8%, Train_loss:0.313, Test_acc:64.9%, Test_loss:0.814, Lr:5.13E-04
Epoch:15, Train_acc:86.7%, Train_loss:0.301, Test_acc:65.3%, Test_loss:0.761, Lr:5.13E-04
Epoch:16, Train_acc:88.4%, Train_loss:0.271, Test_acc:67.3%, Test_loss:0.776, Lr:4.72E-04
Epoch:17, Train_acc:89.7%, Train_loss:0.240, Test_acc:67.8%, Test_loss:0.856, Lr:4.72E-04
Epoch:18, Train_acc:88.6%, Train_loss:0.263, Test_acc:66.3%, Test_loss:0.853, Lr:4.34E-04
Epoch:19, Train_acc:90.5%, Train_loss:0.233, Test_acc:67.8%, Test_loss:0.737, Lr:4.34E-04
Epoch:20, Train_acc:91.4%, Train_loss:0.206, Test_acc:68.8%, Test_loss:0.903, Lr:4.00E-04
Epoch:21, Train_acc:92.9%, Train_loss:0.202, Test_acc:68.3%, Test_loss:0.751, Lr:4.00E-04
Epoch:22, Train_acc:93.0%, Train_loss:0.188, Test_acc:65.8%, Test_loss:1.015, Lr:3.68E-04
Epoch:23, Train_acc:93.7%, Train_loss:0.173, Test_acc:67.3%, Test_loss:0.873, Lr:3.68E-04
Epoch:24, Train_acc:94.0%, Train_loss:0.170, Test_acc:67.3%, Test_loss:1.004, Lr:3.38E-04
Epoch:25, Train_acc:95.5%, Train_loss:0.143, Test_acc:70.3%, Test_loss:0.977, Lr:3.38E-04
Epoch:26, Train_acc:95.9%, Train_loss:0.135, Test_acc:67.8%, Test_loss:0.976, Lr:3.11E-04
Epoch:27, Train_acc:97.0%, Train_loss:0.121, Test_acc:66.8%, Test_loss:1.051, Lr:3.11E-04
Epoch:28, Train_acc:98.0%, Train_loss:0.104, Test_acc:68.3%, Test_loss:1.115, Lr:2.86E-04
Epoch:29, Train_acc:96.8%, Train_loss:0.105, Test_acc:65.8%, Test_loss:1.073, Lr:2.86E-04
Epoch:30, Train_acc:97.5%, Train_loss:0.102, Test_acc:67.3%, Test_loss:1.150, Lr:2.63E-04
Epoch:31, Train_acc:97.6%, Train_loss:0.096, Test_acc:67.3%, Test_loss:1.154, Lr:2.63E-04
Epoch:32, Train_acc:97.1%, Train_loss:0.101, Test_acc:66.3%, Test_loss:1.241, Lr:2.42E-04
Epoch:33, Train_acc:96.3%, Train_loss:0.107, Test_acc:62.9%, Test_loss:1.361, Lr:2.42E-04
Epoch:34, Train_acc:97.3%, Train_loss:0.112, Test_acc:64.4%, Test_loss:1.403, Lr:2.23E-04
Epoch:35, Train_acc:95.4%, Train_loss:0.120, Test_acc:64.4%, Test_loss:1.363, Lr:2.23E-04
Epoch:36, Train_acc:95.0%, Train_loss:0.135, Test_acc:65.8%, Test_loss:1.149, Lr:2.05E-04
Epoch:37, Train_acc:96.5%, Train_loss:0.105, Test_acc:66.8%, Test_loss:1.106, Lr:2.05E-04
Epoch:38, Train_acc:97.6%, Train_loss:0.084, Test_acc:64.9%, Test_loss:1.321, Lr:1.89E-04
Epoch:39, Train_acc:99.0%, Train_loss:0.061, Test_acc:66.3%, Test_loss:1.296, Lr:1.89E-04
Epoch:40, Train_acc:99.0%, Train_loss:0.055, Test_acc:66.8%, Test_loss:1.271, Lr:1.74E-04
Epoch:41, Train_acc:99.1%, Train_loss:0.045, Test_acc:67.8%, Test_loss:1.352, Lr:1.74E-04
Epoch:42, Train_acc:99.6%, Train_loss:0.041, Test_acc:66.3%, Test_loss:1.326, Lr:1.60E-04
Epoch:43, Train_acc:99.4%, Train_loss:0.039, Test_acc:68.3%, Test_loss:1.358, Lr:1.60E-04
Epoch:44, Train_acc:99.8%, Train_loss:0.036, Test_acc:65.8%, Test_loss:1.369, Lr:1.47E-04
Epoch:45, Train_acc:99.4%, Train_loss:0.035, Test_acc:67.8%, Test_loss:1.381, Lr:1.47E-04
Epoch:46, Train_acc:99.8%, Train_loss:0.032, Test_acc:65.3%, Test_loss:1.406, Lr:1.35E-04
Epoch:47, Train_acc:99.5%, Train_loss:0.030, Test_acc:66.8%, Test_loss:1.408, Lr:1.35E-04
Epoch:48, Train_acc:99.8%, Train_loss:0.028, Test_acc:66.8%, Test_loss:1.435, Lr:1.24E-04
Epoch:49, Train_acc:99.8%, Train_loss:0.027, Test_acc:66.8%, Test_loss:1.434, Lr:1.24E-04
Epoch:50, Train_acc:99.8%, Train_loss:0.026, Test_acc:66.3%, Test_loss:1.453, Lr:1.14E-04
Epoch:51, Train_acc:99.9%, Train_loss:0.025, Test_acc:67.3%, Test_loss:1.458, Lr:1.14E-04
Epoch:52, Train_acc:99.8%, Train_loss:0.025, Test_acc:65.8%, Test_loss:1.467, Lr:1.05E-04
Epoch:53, Train_acc:99.9%, Train_loss:0.024, Test_acc:67.3%, Test_loss:1.481, Lr:1.05E-04
Epoch:54, Train_acc:99.8%, Train_loss:0.024, Test_acc:65.8%, Test_loss:1.481, Lr:9.68E-05
Epoch:55, Train_acc:99.9%, Train_loss:0.023, Test_acc:67.3%, Test_loss:1.498, Lr:9.68E-05
Epoch:56, Train_acc:99.8%, Train_loss:0.021, Test_acc:66.3%, Test_loss:1.503, Lr:8.91E-05
Epoch:57, Train_acc:99.9%, Train_loss:0.020, Test_acc:66.3%, Test_loss:1.514, Lr:8.91E-05
Epoch:58, Train_acc:100.0%, Train_loss:0.019, Test_acc:65.8%, Test_loss:1.523, Lr:8.20E-05
Epoch:59, Train_acc:100.0%, Train_loss:0.018, Test_acc:65.3%, Test_loss:1.530, Lr:8.20E-05
Epoch:60, Train_acc:100.0%, Train_loss:0.017, Test_acc:65.8%, Test_loss:1.538, Lr:7.54E-05
Done. Best test acc:  0.7029702970297029

9. 模型评估

import matplotlib.pyplot as plt
#隐藏警告
import warnings
warnings.filterwarnings("ignore")               #忽略警告信息
plt.rcParams['font.sans-serif']    = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
plt.rcParams['figure.dpi']         = 100        #分辨率

epochs_range = range(epochs)

plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()


请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚假星标:GitHub上的“刷星”乱象与应对之道

在开源软件的世界里,GitHub无疑是最重要的平台之一。它不仅是一个代码托管平台,也是一个社交网络,允许开发者通过“点赞”(即加星)来表达对某个项目的喜爱和支持,“星标”(Star)则成…

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架,也是用来写界面的,但是那是用来写客户端的,而html是用来写web浏览器的,相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀,从发布赛题一直到现在,总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

关闭window10或11自动更新和自带杀毒

关闭window10或11自动更新和自带杀毒 1.关闭系统更新**修改组策略关闭自动更新****修改服务管理器关闭自动更新** 2.关闭系统杀毒 为什么需要关闭更新和杀毒 案例: #装完驱动隔一段时间就掉 #一些设置隔一段时间就重置了 #防止更新系统后有时卡 1.关闭系统更新 我…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展,虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络,Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展,OVN 提供了对虚拟网络抽象的支持,使得大规模部署和管理…

【ArcGIS技巧】如何给CAD里的面注记导入GIS属性表中

前面分享了GIS怎么给田块加密高程点,但是没有分享每块田的高程对应的是哪块田,今天结合土地整理软件GLAND做一期田块的属性怎么放入GIS属性表当中。 1、GLAND数据 杭州阵列软件(GLand)是比较专业的土地整理软件,下载之…

Excel中SUM求和为0?难道是Excel有Bug!

大家好,我是小鱼。 在日常工作中有时会遇到这样的情况,对Excel表格数据进行求和时,结果竟然是0,很多小伙伴甚至都怀疑是不是Excel有Bug!其实,在WPS的Excel表格中数据求和,结果为0无法正确求和的…

Spring MVC简单数据绑定

【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》_springspringmvcmybatis从零开始 代码、课件、教学视频与相关软件包下载-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版&…

蓝桥杯备考:数据结构之栈 和 stack

目录 栈的概念以及栈的实现 STL 的stack 栈和stack的算法题 栈的模板题 栈的算法题之有效的括号 验证栈序列 后缀表达式 括号匹配 栈的概念以及栈的实现 栈是一种只允许在一端进行插入和删除的线性表 空栈:没有任何元素 入栈:插入元素消息 出…

使用Dify创建个问卷调查的工作流

为啥要使用Dify创建工作流呢?一个基于流程的智能体的实现,特别是基于业务的实现,使用Dify去实现时,通常都是一个对话工作流,当设计到相对复杂一些的流程时,如果将所有逻辑都放在对话工作流中去实现&#xf…

QT Quick QML 实例之椭圆投影,旋转

文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟&#xf…

高通,联发科(MTK)等手机平台调优汇总

一、常见手机型号介绍: ISP除了用在安防行业,还有手机市场,以及目前新型的A/VR眼睛,机器3D视觉机器人,医疗内窥镜这些行业。 下面是一些最近几年发布的,,,旗舰SOC型号: 1.联发科:天玑92…

AI的崛起:它将如何改变IT行业的职业景象?

随着人工智能(AI)的快速发展,许多人开始担忧其对IT行业的影响,担心AI的出现可能会导致大量IT从业者失业。然而,事实并非如此简单,AI的崛起将为IT行业带来深刻的变革,既有挑战,也有机…

【25考研】西南交通大学软件工程复试攻略!

一、复试内容 复试对考生的既往学业情况、外语听说交流能力、专业素质和科研创新能力,以及综合素质和一贯表现等进行全面考查,主要考核内容包括思想政治素质和道德品质、外语听说能力、专业素质和能力,综合素质及能力。考核由上机考试和面试两部分组成&a…

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…

Android Dex VMP 动态加载加密指令流

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 上一篇【详解如何自定义 Android Dex VMP 保护壳】实现了 VMP 保护壳。 为了进一步加强对 dex 指令的保护,实现指令流加密和动态加载,…

浅谈云计算08 | 基本云架构

浅谈基本云架构 一、负载分布架构二、资源池架构三、动态可扩展架构四、弹性资源容量架构五、服务负载均衡架构六、云爆发架构七、弹性磁盘供给架构八、冗余存储架构 在当今数字化时代,云计算已成为企业发展的核心驱动力,而其背后的一系列关键架构则是支…

从零开始开发纯血鸿蒙应用之多签名证书管理

从零开始开发纯血鸿蒙应用 一、前言二、鸿蒙应用配置签名证书的方式1、自动获取签名证书2、手动配置签名证书 三、多签名证书配置和使用四、多证书使用 一、前言 由于手机操作系统,比电脑操作系统脆弱很多,同时,由于手机的便携性&#xff0c…

Windows Docker 安装

使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。 Docker 的出现让…