深度学习之图像回归(一)

前言  

图像回归任务主要是理解一个最简单的深度学习相关项目的结构,整体的思路,数据集的处理,模型的训练过程和优化处理。

  因为深度学习的项目思路是差不多的,主要的区别是对于数据集的处理阶段,之后模型训练有一些小的差异。

  现在以回归项目进行切入点来理解模型训练的流程。

一 关于整体流程

模型训练的目的是通过训练集进行模型训练 最终得到一个优化后的最佳的模型 帮我们完成对数据的预测 比如根据一个数据的多个描述维度 最终得到标签对应的预测值 

整体步骤如下:

  1. 准备数据(输入 x 和目标 y)。

  2. 初始化模型参数。

  3. 用模型预测输出 y^​。

  4. 计算损失值(比如MSE)。

  5. 用梯度下降更新参数。

  6. 重复步骤3-5,直到损失值不再下降。

  7. 用测试数据评估模型性能。

简而言之 就是通过对数据集训练 输入x 然后经过模型训练 得到对应的y 计算loss 梯度回传更新模型 直到算出最好的一项

二 关于数据集处理  

代码

class Covid_dataset(Dataset):def __init__(self, file_path, mode):  # mode说明数据集是什么类型 训练集还是测试集with open(file_path, "r") as f:csv_data = list(csv.reader(f))data = np.array(csv_data[1:])if mode == "train":indices = [i for i in range(len(data)) if i % 5 != 0]elif mode == "val":indices = [i for i in range(len(data)) if i % 5 == 0]if mode == "test":x = data[:, 1:].astype(float)x = torch.tensor(x)else:x = data[indices, 1:-1].astype(float)x = torch.tensor(x)y = data[indices, -1].astype(float)self.y = torch.tensor(y)self.x = x - x.mean(dim=0, keepdim=True) / x.std(dim=0, keepdim=True)self.mode = modedef __getitem__(self, item):if self.mode == "test":return self.x[item].float()  # 测试集没标签。   注意data要转为模型需要的float32型else:  # 否则要返回带标签数据return self.x[item].float(), self.y[item].float()def __len__(self):return len(self.x)

实现思路

这个类有三个功能函数 分别对应初始化 取出特定的一个元素 计算数据集长度 

需要注意的是,数据的处理需要根据训练集 测试集 测试集三个不同的部分进行对应处理

IndexFeature1Feature2...FeatureNLabel
10.10.2...0.310
20.40.5...0.620
..................
  • 特征部分:从第二列到倒数第二列(Feature1FeatureN)。

  • 标签部分:最后一列(Label)。

如图是一个csv格式的数据

注意事项

1 测试集 训练集 验证集如何划分

对于训练集和验证集 按照4:1的比例进行划分

训练集需要的数据体量比较大 主要是为了保证训练的准确性 验证集比较小

2 测试集 训练集 验证集的特征值和标签

对于测试集

由于测试集主要是在模型训练完成之后评估模型性能的 因此特征值需要提取第二列到最后一列,此时最后一列也作为特征被提取 

不需要带标签 因为测试集用来测试模型对未知数据的预测能力 标签是未知的

对于验证集和训练集

需要提取第二列到倒数第二列作为特征值

同时需要提取对应的标签 

是否需要标签可以类比成做练习题 训练集是平时训练的题目 验证集是自己做的小测试 都是有答案的 这样可以方便调整 而测试集不带标签可以理解成最后的大考是没有答案的 

3 数据的处理

为什么特征值和标签需要处理成张量的形式还需要转换成浮点数

  • 转换为张量:是为了与 PyTorch 模型兼容,支持 GPU 加速和自动求导。

  • 转换为浮点数:是为了确保数据在数学运算中的精度,支持梯度下降和数据标准化。

4 归一化的原因和方式

归一化(Normalization)是数据预处理中非常重要的一步,尤其是在机器学习和深度学习中。它的目的是将特征值调整到一个统一的范围内,例如 [0, 1] 或 [-1, 1],或者使其符合某种分布(如均值为 0、标准差为 1 的正态分布)。归一化的处理可以显著提高模型的训练效率和性能。

以下是归一化处理的几个主要原因:

1. 加速模型收敛

  • 原因:不同的特征可能有不同的量纲和数值范围。例如,一个特征的范围可能是 [0, 1],而另一个特征的范围可能是 [0, 1000]。如果不对这些特征进行归一化,模型在训练时可能会因为特征的数值差异而难以收敛。

  • 解释:在梯度下降过程中,数值范围大的特征可能会主导梯度的方向,导致模型的更新方向不准确。通过归一化,所有特征的数值范围被统一,梯度下降的方向更加均衡,从而加速模型的收敛。


2. 提高模型性能

  • 原因:归一化可以减少特征之间的数值差异,使模型更容易学习到数据中的模式。

  • 解释:对于许多机器学习算法(如线性回归、支持向量机、神经网络等),特征的数值范围会影响模型的权重更新。如果特征的数值范围差异过大,模型可能会对某些特征过于敏感,而忽略其他特征。归一化可以避免这种情况,从而提高模型的性能。


3. 防止数值计算问题

  • 原因:在深度学习中,模型的训练过程涉及大量的矩阵运算和梯度计算。如果特征的数值范围过大,可能会导致数值计算问题,如梯度爆炸(Gradient Explosion)或梯度消失(Gradient Vanishing)。

  • 解释

    • 梯度爆炸:当数值范围过大时,梯度可能会变得非常大,导致模型的权重更新过大,从而使模型的训练不稳定。

    • 梯度消失:当数值范围过小时,梯度可能会变得非常小,导致模型的权重更新过慢,从而使模型难以收敛。

通过归一化,可以将特征值调整到一个合理的范围内,避免这些数值计算问题。


4. 提高模型的泛化能力

  • 原因:归一化可以减少模型对数据的依赖,使模型更加鲁棒。

  • 解释:如果特征的数值范围差异过大,模型可能会过度拟合训练数据中的数值差异,而无法泛化到新的数据。通过归一化,模型可以更好地学习数据中的模式,而不是数值差异,从而提高模型的泛化能力。


5. 常见的归一化方法

  • (1) Min-Max 归一化

    • 将特征值调整到 [0, 1] 范围内:

      x_normalized = (x - x_min) / (x_max - x_min)
    • 优点:简单直观,适用于特征值范围已知的情况。

    • 缺点:对异常值敏感,如果数据中存在极端值,可能会导致归一化后的数据范围不均匀。

  • (2) Z-Score 标准化

    • 将特征值调整到均值为 0、标准差为 1 的分布:

      x_normalized = (x - x_mean) / x_std
    • 优点:对异常值不敏感,适用于特征值呈正态分布的情况。

    • 缺点:如果数据不符合正态分布,归一化后的数据可能仍然存在数值范围差异。

  • (3) MaxAbs 归一化

    • 将特征值调整到 [-1, 1] 范围内:

      x_normalized = x / max(abs(x))
    • 优点:适用于稀疏数据,能够保留数据的稀疏性。

    • 缺点:对异常值敏感。


6. 总结

归一化处理是机器学习和深度学习中非常重要的一步,它可以帮助:

  • 加速模型的收敛。

  • 提高模型的性能。

  • 防止数值计算问题。

  • 提高模型的泛化能力。

归一化的方法选择取决于数据的特性和任务的需求。常见的归一化方法包括 Min-Max 归一化、Z-Score 标准化和 MaxAbs 归一化。

三 关于自定义的神经网络模型

class myModel(nn.Module):def __init__(self, dim):super(myModel, self).__init__()self.fc1 = nn.Linear(dim, 100)self.relu = nn.ReLU()self.fc2 = nn.Linear(100, 1)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)if len(x.size()) > 1:return x.squeeze(1)else:return x

关注的问题:

1 模型结构

输入层、隐藏层(带 ReLU 激活函数)、输出层。

参数的计算 以便于帮我们更好地理解模型

维度变化
层级维度变化参数计算式参数量
fc1dim → 100(dim × 100) + 10010100
fc2100 → 1(100 × 1) + 1101
总计10201

本质上是y=wx+b的线性计算

dim对应的是对应的特征值 需要先进行线性运算 映射到一个隐藏层 隐藏层经过ReLU的激活 改变数值的分布 最后ReLU到fc2 继续线性变换后输出 由于是回归任务 因此是预测一个连续值 需要注意的是输出的维度需要统一成一维的

2 激活函数 

引入激活函数的原因

  1. 引入非线性

    • 使神经网络能够拟合任意复杂函数
    • 无激活函数时多层网络等价于单层线性变换 
  2. 特征空间映射

    • 将输入分布映射到特定输出范围(如(0,1)、(-1,1)等)在这个范围内 模型表现比较好
  3. 梯度调控

    • 通过导数控制反向传播的梯度流动

选择ReLU的核心原因
优势维度具体表现对比其他激活函数
梯度传导正区间梯度恒为1,避免梯度消失Sigmoid最大梯度仅0.25
计算效率无需指数运算,速度提升约6倍Tanh需计算双曲函数
稀疏激活约50%神经元被抑制,提升特征选择性Leaky ReLU保持全激活
生物学合理近似神经元"全或无"的放电特性更符合生物神经元工作机制

3 为什么要这样设计输出层?

  1. 统一输出形状

    • 在回归任务中,我们希望模型的输出是一个一维张量 [batch_size],而不是二维张量 [batch_size, 1]。这样可以方便后续的计算,例如计算损失函数时,损失函数通常期望输入是一维张量。

  2. 兼容不同批量大小

    • 当批量大小为 1 时,模型的输出可能是 [1] 而不是 [1, 1]。通过这段代码,可以确保无论批量大小是多少,输出的形状始终是一致的。

四 关于模型训练

# 训练函数
def train_val(model, train_loader, val_loader, device, epochs, optimizer, loss, save_path):model = model.to(device)# 记录每一轮的损失函数plt_train_loss = []plt_val_loss = []min_val_loss = 9999999999999# 训练for epoch in range(epochs):train_loss = 0.0val_loss = 0.0start_time = time.time()model.train()  # 模型调整为训练模式for batch_x, batch_y in train_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)  # 得到预测值train_bat_loss = loss(pred, target)train_bat_loss.backward()  # 梯度回传 更新模型optimizer.step()optimizer.zero_grad()  # 清零 训练完一轮了train_loss += train_bat_loss.cpu().item()plt_train_loss.append(train_loss / train_loader.dataset.__len__())# 验证 model.eval()with torch.no_grad():for batch_x, batch_y in val_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)  # 得到预测值val_bat_loss = loss(pred, target)val_loss += val_bat_loss.cpu().item()plt_val_loss.append(val_loss/val_loader.__len__())# 保存结果if val_loss < min_val_loss:torch.save(model, save_path)min_val_loss = val_lossprint('[%03d/%03d] %2.2f sec(s) TrainLoss : %.6f | valLoss: %.6f' % \(epoch, epochs, time.time() - start_time, plt_train_loss[-1], plt_val_loss[-1]))  # 打印训练结果。 注意python语法, %2.2f 表示小数位为2的浮点数, 后面可以对应。# 画图plt.plot(plt_train_loss)plt.plot(plt_val_loss)plt.title("loss图")plt.legend(["train", "val"])plt.show()

关于反向传播

        因为模型不可能一次训练就得到最优秀的结果 因此需要根据训练结果动态更新 最后得到的一个观测值 计算与标签的loss之后 可以通过反向求导计算梯度 之后利用梯度下降算法进行更新 直到表现最优秀

关于验证集

验证集不需要进行梯度更新 只有训练的时候需要

(1) 验证集的作用是评估模型
  • 验证集用于评估模型在未见过的数据上的表现,而不是用于训练模型。如果在验证集上更新梯度,模型会逐渐适应验证集的数据,这违背了验证集的初衷。

  • 验证集的核心目标:评估模型的泛化能力,确保模型在新的、未见过的数据上仍然表现良好。

(2) 防止过拟合
  • 如果在验证集上更新梯度,模型可能会逐渐过拟合验证集的数据,导致模型在训练集和验证集上表现良好,但在真实数据上表现不佳。

  • 过拟合:模型对训练数据(包括验证集)拟合得过于完美,但在新数据上表现差。

(3) 保持模型的独立性
  • 验证集应该保持独立性,即模型在验证集上的表现应该反映其在真实数据上的表现。

  • 如果在验证集上更新梯度,模型会逐渐依赖验证集的数据,失去独立性。

五 关于模型测试

这段代码实现了一个完整的测试流程,包括:

  1. 加载模型:从指定路径加载训练好的模型。

  2. 测试阶段:对测试数据进行预测,并将预测结果存储到列表中。

  3. 保存结果:将预测结果保存到一个 CSV 文件中,格式为 [id, 预测值]

def evaluate(save_path, device, test_loader, rel_path):model = torch.load(save_path).to(device)rel = []with torch.no_grad():for x in test_loader:pred = model(x.to(device))rel.append(pred.cpu().item())print(rel)with open(rel_path, "w", newline='') as f:csvWtiter = csv.writer(f)csvWtiter.writerow(["id", "test_positive"])for i, value in enumerate(rel):csvWtiter.writerow([str(i), str(rel[i])])print("文件已经保存到{}".format(rel_path))

六 关于超参数的设置

device = "cuda" if torch.cuda.is_available() else "cpu"train_file = "covid.train.csv"
test_file = "covid.test.csv"train_data = Covid_dataset(train_file, "train")
val_data = Covid_dataset(train_file, "val")
test_data = Covid_dataset(train_file, "test")train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
val_loader = DataLoader(val_data, batch_size=16, shuffle=True)
test_loader = DataLoader(test_data, batch_size=1, shuffle=False)  # 测试集的batchsize一般为1 且不可以打乱dim = 93config = {"lr": 0.001,"momentum": 0.9,"epochs": 20,"save_path": "model_save/model.pth","rel_path": "pred.csv"
}model = myModel(dim)loss = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=config["lr"], momentum=config["momentum"])  # 优化器train_val(model, train_loader, val_loader, device, config["epochs"], optimizer, loss, config["save_path"])evaluate(config["save_path"], device, test_loader, config["rel_path"])

在这段代码中,超参数(Hyperparameters)是用于控制模型训练过程和行为的关键参数。它们在训练开始之前需要手动设置,并对模型的性能和训练效率有重要影响。以下是对代码中涉及的超参数的详细解释:


1. 设备选择(Device)

device = "cuda" if torch.cuda.is_available() else "cpu"
  • 超参数device

  • 作用:指定模型和数据运行的设备。

  • 解释

    • 如果 GPU(CUDA)可用,则使用 "cuda",否则使用 "cpu"

    • 使用 GPU 可以显著加速模型的训练和推理过程。


2. 数据加载器(DataLoader)

train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
val_loader = DataLoader(val_data, batch_size=16, shuffle=True)
test_loader = DataLoader(test_data, batch_size=1, shuffle=False)
  • 超参数

    • batch_size:每个批次的样本数量。

    • shuffle:是否在每个 epoch 开始时随机打乱数据。

  • 作用

    • batch_size

      • 控制每次传递给模型的数据量。

      • 较大的 batch_size 可以提高训练效率,但会增加内存消耗。

      • 较小的 batch_size 可以减少内存消耗,但可能需要更多的迭代次数。

    • shuffle

      • 在训练和验证阶段,通常将数据打乱以防止模型学习到数据的顺序。

      • 在测试阶段,通常不打乱数据,以保持预测结果的顺序。


3. 模型参数

dim = 93
model = myModel(dim)
  • 超参数dim

  • 作用:输入特征的维度。

  • 解释

    • dim 是输入数据的特征数量,用于初始化模型的输入层。

    • 在这个例子中,输入特征的维度是 93。


4. 训练配置(Config)

Python复制

config = {"lr": 0.001,"momentum": 0.9,"epochs": 20,"save_path": "model_save/model.pth","rel_path": "pred.csv"
}
  • 超参数

    • lr(Learning Rate):学习率,控制参数更新的步长。

      • 较大的学习率可能导致模型训练不稳定,较小的学习率可能导致训练速度过慢。

    • momentum:动量因子,用于加速梯度下降过程,防止震荡。

      • 动量可以帮助优化器跳出局部最小值,加速收敛。

    • epochs:训练的总轮数。

      • 较多的轮数可以提高模型性能,但可能导致过拟合。

    • save_path:保存最佳模型的路径。

    • rel_path:保存预测结果的路径。


5. 损失函数和优化器

loss = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=config["lr"], momentum=config["momentum"])
  • 超参数

    • 损失函数(Loss Function)

      • nn.MSELoss():均方误差损失函数,适用于回归任务。

    • 优化器(Optimizer)

      • optim.SGD:随机梯度下降优化器。

      • lr:学习率。

      • momentum:动量因子。


6. 测试阶段

evaluate(config["save_path"], device, test_loader, config["rel_path"])
  • 超参数

    • test_loaderbatch_size 设为 1,因为测试集通常逐个样本进行预测。

    • shuffle=False,以保持预测结果的顺序。


总结

在这段代码中,涉及的超参数包括:

  1. 设备选择device

  2. 数据加载器

    • batch_size:控制每个批次的样本数量。

    • shuffle:是否随机打乱数据。

  3. 模型参数

    • dim:输入特征的维度。

  4. 训练配置

    • lr:学习率。

    • momentum:动量因子。

    • epochs:训练的总轮数。

    • save_path:保存模型的路径。

    • rel_path:保存预测结果的路径。

  5. 损失函数和优化器

    • 损失函数:nn.MSELoss()

    • 优化器:optim.SGD

七 最后的结果展示

 训练效果良好 损失快速下降并趋于平稳 没有明显的过拟合现象 模型在训练集和验证集上的表现都较为理想 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本1. 类型2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…

京东cfe滑块 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 headers {"accept&qu…

什么是事务?并发事务引发的问题?什么是MVCC?

文章目录 什么是事务&#xff1f;并发事务引发的问题&#xff1f;什么是MVCC&#xff1f;1.事务的四大特性2.并发事务下产生的问题&#xff1a;脏读、不可重复读、幻读3.如何应对并发事务引发的问题&#xff1f;4.什么是MVCC&#xff1f;5.可见性规则&#xff1f;参考资料 什么…

火语言RPA--Excel插入空行

【组件功能】&#xff1a;在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…

基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

零食店收银pos源码

各位零食店老板&#xff0c;你是否还在为以下问题头疼&#xff1f; 连锁门店越来越多&#xff0c;管理起来力不从心&#xff1f;散装称重商品收银效率低&#xff0c;顾客排队抱怨&#xff1f;线上订单激增&#xff0c;库存混乱&#xff0c;配送跟不上&#xff1f;营销活动花样少…

DeepSeek 冲击(含本地化部署实践)

DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…

鸿蒙-验证码输入框的几种实现方式-上

文章目录 效果图、优缺点多TextInput多 TextCanvas 绘制 多个 TextInput 拼接放置四个输入框焦点移动输入时向后移动输入完成回调删除时向前移动 防止点击总结 最近在做应用鸿蒙化&#xff0c;说白了就是把原来Android、iOS的代码重新用ArkTS写一遍&#xff0c;我负责基础建设和…

谈谈对线程的认识

面对这样的一个多核CPU时代, 实现并发编程是刚需. 多进程实现并发编程, 效果是特别理想的. 但是, 多线程编程模型有一个明显的缺点, 就是进程太重了, 效率不高. 创建一个进程, 消耗时间比较多. 销毁一个进程, 消耗时间也比较多. 调度一个进程, 消耗时间也比较多. 这里的时…

MySQL的数据类型

4. 数据类型 4.1 数据类型分类4.2 数值类型4.2.1 tinyint类型4.2.2 bit类型4.2.3 小数类型4.2.3.1 float4.2.3.2 decimal 4.3 字符串类型4.3.1 char4.3.2 varchar4.3.3 char和varchar比较 4.4 日期和时间类型enum和set 4.1 数据类型分类 4.2 数值类型 4.2.1 tinyint类型 数值越…

回不去的乌托邦

回不去的乌托邦 坐在电脑面前愣神间已至深夜&#xff0c;依然睡意不起。 相比于带着疲惫入睡&#xff0c;伏案发呆更令人惬意。想起最近在自媒体上看到的一句话“最顶级的享受变成了回不去的乌托邦”。 “这是兄弟们最后一次逛校园了&#xff0c;我拍个照”。我的记忆力总是用在…

分布式与集群,二者区别是什么?

??分布式 分布式系统是由多个独立的计算机节点组成的系统&#xff0c;这些节点通过网络协作完成任务。每个节点都有自己的独立计算能力和存储能力&#xff0c;可以独立运行。分布式系统的目标是提高系统的可靠性、可扩展性和性能。 分布式服务包含的技术和理论 负载均衡&am…

<02.21>八股文

JAVA基础 次数少了用解释性 次数多了用编译性(JIT) 操作系统

logging-operator 部署fluentd-bit日志报kubernetes链接错误

一、背景&#xff1a; 某项目使用logging-operator部署fluentd-bit进行日志采集&#xff0c;发现启动的fluentd-bit有大量的的链接kubernetes报错。 二、排查过程 1、排查fluentd容器到kubernetes api server的联通性&#xff0c;进入容器中curl kubernetes.default.svc.local:…

Redis数据结构-String字符串

1.String字符串 字符串类型是Redis中最基础的数据结构&#xff0c;关于数据结构与要特别注意的是&#xff1a;首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他集中数据结构也都是在字符串类似基础上进行构建&#xff0c;例如列表和集合的元素类型是字符串类型&a…

基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法&#xff0c;但这种管理方法存…

Unity结合Vuforia虚拟按键实现AR机械仿真动画效果

零、最终效果 待上传 一、资源准备 1、Vuforia Vuforia版本不能高于10.17.4&#xff08;往上的版本虚拟按键功能被删除&#xff09; 2、Unity Unity版本必须要高于2022.3.x&#xff0c;不然使用Vuforia插件时会出现bug 二、主要内容 1、添加虚拟按钮 2、为虚拟按钮设置…