游戏AI的创造思路-技术基础-深度学习(5)

继续深度学习技术的探讨,填坑不断,头秃不断~~~~~

 

目录

3.5. 自编码器(AE)

3.5.1. 定义

3.5.2. 形成过程

3.5.3. 运行原理

3.5.3.1.运行原理及基本框架

3.5.3.2. 示例代码

3.5.4. 优缺点

3.5.5. 存在的问题和解决方法

3.5.6. 应用于游戏AI

3.5.6.1. 实际应用场景

3.5.6.2. Python代码示例(特征降维)

3.5.6.3. 用于反作弊检测

3.5.6.3.1. 反作弊检测基本方法

3.5.6.3.2. 阈值的设定


3.5. 自编码器(AE)

3.5.1. 定义

自编码器(Autoencoder, AE)是一种数据的压缩算法,其中压缩和解压缩函数是数据相关的、有损的、从样本中自动学习的。

它通常用于学习数据的高效编码,在神经网络的形式下,自编码器可以用于降维和特征学习。

在游戏AI中,自编码器可以被用于数据的压缩、特征提取或异常检测等任务。

3.5.2. 形成过程

自编码器起源于神经网络和深度学习的发展。

它是一种特殊的神经网络结构,由两部分组成:

  • 编码器:编码器负责将输入数据压缩成一个较低维度的表示
  • 解码器:解码器则负责从这个低维表示中恢复原始数据。

在训练过程中,自编码器的目标是让输出尽可能接近输入,从而学习到输入数据的有效表示。

3.5.3. 运行原理

3.5.3.1.运行原理及基本框架
  • 编码器:接收原始输入数据,并通过一系列神经网络层将其压缩成一个较低维度的隐藏表示(也称为编码)。这个过程通常涉及线性变换和非线性激活函数的应用。
  • 解码器:接收编码器的输出(即隐藏表示),并通过另一系列神经网络层尝试重构原始输入数据。解码器的目标是尽可能准确地还原原始输入。
  • 训练:通过反向传播算法和优化方法(如梯度下降)来训练自编码器。训练过程中,模型会尝试最小化输入数据和重构数据之间的差异,通常使用均方误差(MSE)等损失函数来衡量这种差异。

在游戏AI中,自编码器(AE)算法并没有特定的数学公式,因为它是一个神经网络结构,由编码器和解码器两部分组成,通过训练来优化模型的参数。然而,我们可以描述其关键组成部分和前向传播的过程。

编码器

编码器部分通常是一个或多个神经网络层,它将输入数据 (x) 映射到一个隐藏表示 (h)。这个过程可以用以下方式表示(尽管这不是一个具体的数学公式):

[ h = f(x; \theta_e) ]

其中,(f) 是编码器的神经网络函数,(\theta_e) 是编码器的参数(如权重和偏置),(x)是输入数据,(h)是得到的隐藏表示。

解码器

解码器部分也是一个或多个神经网络层,它将隐藏表示 (h) 映射回与原始输入数据维度相同的重构数据 (r)。这个过程可以表示为:

[ r = g(h; \theta_d) ]

其中,(g)是解码器的神经网络函数,(\theta_d) 是解码器的参数,(h)是编码器的输出(即隐藏表示),(r) 是重构的数据。

自编码器的训练

自编码器的训练目标是最小化输入数据(x) 和重构数据 (r) 之间的差异。这通常通过优化一个损失函数(如均方误差MSE)来实现:

[ \text{MSE}(x, r) = \frac{1}{n} \sum_{i=1}{n} (x_i - r_i)2 ]

其中,(n)是输入数据的维度,(x_i)(r_i) 分别是输入数据和重构数据在第(i) 维上的值。

需要注意的是,自编码器的具体实现和公式可能会因应用场景、网络结构和优化目标的不同而有所变化。上述描述和公式提供了一个基本的框架和概念。

3.5.3.2. 示例代码

在游戏AI或任何其他领域中,自编码器(Autoencoder, AE)的实现主要涉及深度学习框架,如TensorFlow或PyTorch。

由于C++不是深度学习领域的主流语言,直接使用C++来实现自编码器可能比较复杂,并且通常需要依赖额外的库,如Dlib或Tiny-DNN。(C++也有不擅长的部分哦)

下面,我将给出使用Python和PyTorch实现自编码器的示例代码,并提供C++使用Tiny-DNN库实现自编码器的基本框架。

Python代码

import torch  
import torch.nn as nn  
import torch.optim as optim  # 定义自编码器模型  
class Autoencoder(nn.Module):  def __init__(self, input_dim):  super(Autoencoder, self).__init__()  self.encoder = nn.Sequential(  nn.Linear(input_dim, 64),  nn.ReLU(),  nn.Linear(64, 32)  )  self.decoder = nn.Sequential(  nn.Linear(32, 64),  nn.ReLU(),  nn.Linear(64, input_dim)  )  def forward(self, x):  x = self.encoder(x)  x = self.decoder(x)  return x  # 设定输入维度  
input_dim = 784  # 例如,使用28x28的MNIST图像  
model = Autoencoder(input_dim)  # 定义损失函数和优化器  
criterion = nn.MSELoss()  
optimizer = optim.Adam(model.parameters())  # 假设我们有一些训练数据X_train  
# X_train = ... (需要加载或生成数据)  # 训练自编码器  
for epoch in range(num_epochs):  for data in dataloader:  # 假设dataloader是加载训练数据的DataLoader  inputs, _ = data  optimizer.zero_grad()  outputs = model(inputs)  loss = criterion(outputs, inputs)  loss.backward()  optimizer.step()  print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item()}')

C++代码

在C++中,你可以使用Tiny-DNN这样的库来构建和训练神经网络。以下是一个简化的自编码器实现框架:

#include <tiny_dnn/tiny_dnn.h>  using namespace tiny_dnn;  
using namespace tiny_dnn::layers;  int main() {  // 创建网络模型  network<sequential> net;  net << fc(784, 64)  // 编码器第一层  << relu()      // 激活函数  << fc(64, 32)  // 编码器第二层  << relu()      // 激活函数  << fc(32, 64)  // 解码器第一层  << relu()      // 激活函数  << fc(64, 784); // 解码器第二层  // 设置优化器和损失函数  adam optimizer;  mse_loss loss;  // 假设你已经有了一些训练数据  // std::vector<vec_t> train_data; // 输入数据  // std::vector<vec_t> train_labels; // 这里的“标签”实际上就是输入数据,因为我们要重构它  // 训练网络  for (int epoch = 0; epoch < num_epochs; epoch++) {  for (size_t i = 0; i < train_data.size(); i++) {  const auto& in = train_data[i];  const auto& target = train_labels[i]; // 在自编码器中,标签就是输入  net.train_once(in, target, optimizer, loss);  }  // 可以添加一些代码来打印损失或验证误差等  }  return 0;  
}

C++代码是一个简化的框架,你需要自己添加数据加载、预处理和后处理逻辑。此外,Tiny-DNN库需要单独安装,并且可能需要根据你的系统环境进行配置。

在实际应用中,你可能还需要调整网络结构、学习率、批次大小等参数以获得最佳性能。此外,对于大规模数据集或复杂模型,通常建议使用Python和成熟的深度学习框架(如PyTorch或TensorFlow),因为这些框架提供了更丰富的功能和更高效的计算性能。

3.5.4. 优缺点

  • 优点

    • 无监督学习:自编码器是一种无监督学习方法,不需要标注数据,因此适用于大量未标注数据的场景。
    • 数据降维和特征提取:自编码器能够学习到输入数据的高效表示,从而实现数据的降维和特征提取。
    • 泛化能力强:由于自编码器是从数据中学习压缩和解压缩函数的,因此它具有一定的泛化能力,可以处理与训练数据类似的新数据。
  • 缺点

    • 对异常数据敏感:在异常检测等任务中,自编码器可能难以处理与训练数据分布差异较大的异常数据。
    • 训练数据需求:为了训练出有效的自编码器模型,通常需要大量的训练数据。此外,在异常识别等特定任务中,训练数据需要为正常数据,以确保模型能够学习到正常的数据分布。

3.5.5. 存在的问题和解决方法

以下讨论2种常见的问题,欢迎评论区探讨更多的问题和解决方法

问题1:自编码器可能无法很好地处理复杂的非线性关系或高度变化的数据分布。

解决方法:可以采用更复杂的神经网络结构(如深度自编码器、卷积自编码器等)或引入其他技术(如正则化、dropout等)来提高模型的复杂度和泛化能力。

问题2:在异常检测任务中,自编码器可能难以准确识别出与训练数据分布差异较大的异常数据。

解决方法:可以结合其他异常检测技术(如基于密度的方法、基于距离的方法等)来提高异常检测的准确性。此外,还可以尝试使用变分自编码器(VAE)等生成模型来生成可能的异常样本,从而增强模型对异常的识别能力。

3.5.6. 应用于游戏AI

自编码器(Autoencoder, AE)在游戏AI中有多种应用场景,以下是一些实际应用场景及其相应的Python代码示例。

3.5.6.1. 实际应用场景
  1. 特征降维与数据压缩
    游戏中的数据往往维度很高,例如玩家的行为数据、游戏场景的状态等。自编码器可以用于将这些高维数据压缩到较低的维度,同时保留重要特征,便于后续的分析和处理。

  2. 异常检测
    通过训练自编码器来重构正常行为的数据,当输入异常数据时,自编码器的重构误差会显著增大,从而可以用于检测游戏中的异常行为,如作弊、外挂等。

  3. 生成模型
    自编码器可以用作生成模型的一部分,生成新的游戏内容,如地图、角色或物品等。这在游戏设计和测试中非常有用。

  4. 预测与决策支持
    利用自编码器提取的特征可以输入到其他机器学习模型中,用于玩家行为预测、游戏结果预测等,从而辅助游戏AI做出更智能的决策。

3.5.6.2. Python代码示例(特征降维)

以下是一个简单的自编码器实现,用于特征降维和数据压缩。

import torch  
import torch.nn as nn  
import torch.optim as optim  
from torch.utils.data import DataLoader, TensorDataset  # 假设我们有一些高维游戏数据  
# X_train 为训练数据,形状为 (n_samples, input_dim)  
# 这里只是一个示例,你需要用实际的游戏数据替换它  
input_dim = 100  # 假设输入维度为100  
n_samples = 1000  # 假设有1000个样本  
X_train = torch.randn(n_samples, input_dim)  # 生成随机数据作为示例  # 定义自编码器模型  
class Autoencoder(nn.Module):  def __init__(self, input_dim, encoding_dim):  super(Autoencoder, self).__init__()  self.encoder = nn.Sequential(  nn.Linear(input_dim, encoding_dim),  nn.ReLU(True)  )  self.decoder = nn.Sequential(  nn.Linear(encoding_dim, input_dim),  nn.Sigmoid()  # 如果输入数据被归一化到[0,1],则使用Sigmoid作为激活函数  )  def forward(self, x):  x = self.encoder(x)  x = self.decoder(x)  return x  # 设置编码维度  
encoding_dim = 32  # 压缩后的维度  
model = Autoencoder(input_dim, encoding_dim)  
criterion = nn.MSELoss()  
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 创建数据加载器  
dataset = TensorDataset(X_train)  
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)  # 训练自编码器  
num_epochs = 100  
for epoch in range(num_epochs):  for data in dataloader:  inputs, = data  optimizer.zero_grad()  outputs = model(inputs)  loss = criterion(outputs, inputs)  loss.backward()  optimizer.step()  print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item()}')  # 使用训练好的自编码器对游戏数据进行压缩和解压  
compressed = model.encoder(X_train)  
reconstructed = model.decoder(compressed)

上面示例中,我们创建了一个简单的自编码器,它由一个编码器和一个解码器组成。编码器将输入数据从100维压缩到32维,然后解码器尝试从这32维重构原始100维数据。

通过训练自编码器来最小化重构误差,我们可以得到一个能够有效压缩和解压游戏数据的模型。(C++的暂时没搞出来,先不放了)

3.5.6.3. 用于反作弊检测
3.5.6.3.1. 反作弊检测基本方法

在游戏AI中使用自编码器(AE)进行反作弊检测时,基本思路是训练自编码器来重构正常玩家的行为数据。

作弊行为的数据通常与正常行为模式差异较大,因此当输入作弊数据时,自编码器的重构误差会相对较高。通过设定一个阈值,可以检测出可能的作弊行为。

以下是一个简化的Python代码示例,展示了如何使用自编码器进行反作弊检测:

import torch  
import torch.nn as nn  
import torch.optim as optim  
from sklearn.model_selection import train_test_split  
from sklearn.metrics import mean_squared_error  # 假设我们已经有了一组玩家的正常行为数据  
# X 为正常行为数据,形状为 (n_samples, input_dim)  
# 这里使用随机数据作为示例  
input_dim = 50  # 假设输入数据的维度是50  
n_samples = 1000  # 假设有1000个正常行为样本  
X = torch.randn(n_samples, input_dim)  # 生成随机数据作为正常行为数据示例  # 定义自编码器模型  
class Autoencoder(nn.Module):  def __init__(self, input_dim):  super(Autoencoder, self).__init__()  self.encoder = nn.Sequential(  nn.Linear(input_dim, 256),  nn.ReLU(),  nn.Linear(256, 128),  nn.ReLU(),  nn.Linear(128, 64)  )  self.decoder = nn.Sequential(  nn.Linear(64, 128),  nn.ReLU(),  nn.Linear(128, 256),  nn.ReLU(),  nn.Linear(256, input_dim),  nn.Sigmoid()  # 假设输入数据已被归一化到[0, 1]  )  def forward(self, x):  x = self.encoder(x)  x = self.decoder(x)  return x  # 初始化模型、损失函数和优化器  
model = Autoencoder(input_dim)  
criterion = nn.MSELoss()  
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 分割数据集为训练集和测试集  
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)  # 训练自编码器  
num_epochs = 100  
for epoch in range(num_epochs):  optimizer.zero_grad()  outputs = model(X_train)  loss = criterion(outputs, X_train)  loss.backward()  optimizer.step()  if (epoch + 1) % 10 == 0:  print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item()}')  # 在测试集上评估自编码器  
X_test_reconstructed = model(X_test)  
test_mse = mean_squared_error(X_test.detach().numpy(), X_test_reconstructed.detach().numpy())  
print(f'Test MSE: {test_mse}')  # 设定作弊检测的阈值  
threshold = test_mse * 2  # 这里的阈值是示例值,实际应用中需要根据情况调整  # 假设我们有一些待检测的数据(可能是作弊数据)  
# X_check 形状为 (n_check_samples, input_dim)  
X_check = torch.randn(10, input_dim)  # 使用随机数据作为待检测数据的示例  
X_check_reconstructed = model(X_check)  
check_mse = nn.MSELoss()(X_check, X_check_reconstructed).item()  # 判断是否存在作弊行为  
if check_mse > threshold: print("可能的作弊行为被检测到!")  
else:  print("未检测到作弊行为。")

在这个示例中,我们首先定义了一个自编码器模型,并使用正常行为数据进行训练。

训练完成后,我们在测试集上评估模型的性能,并根据测试集上的重构误差设定一个阈值。

最后,我们使用这个阈值来检测待检查数据中是否存在作弊行为。

如果重构误差超过了设定的阈值,则可能表示存在作弊行为。

3.5.6.3.2. 阈值的设定

自编码器(AE)算法在游戏AI中用于反作弊检测时,测试集上的重构误差设定阈值的方法至关重要。

  • 阈值设定方法
  • 基于统计分布:分析测试集上的重构误差分布,可以选择一个合适的阈值,如平均值加上若干倍的标准差,来区分正常行为与异常行为。
  • 基于业务需求:根据实际业务需求和安全容忍度,设定一个可接受的最高重构误差作为阈值。
  • 交叉验证:通过交叉验证的方式,在不同的测试集上评估自编码器的性能,并根据多次实验的结果来确定一个稳定的阈值。
  • 专家判断:结合领域专家的知识和经验,对重构误差的阈值进行设定和调整。(通常,游戏公司或游戏开发者会招募专业玩家或者头部玩家进行内测和公测,同时也会长期招募反作弊专业玩家对训练数据进行标注,标注后的数据用于训练和调整阈值。当然,游戏公司或游戏开发者也会故意创造作弊器和作弊方法,用来帮助算法进行反作弊训练。~~~~~~~~小声说,有些不太OK的具有编程能力的玩家也会监守自盗偷偷的做一些不法的东东,鄙视
  • 阈值调整与优化
  • 在实际应用中,根据反馈和效果不断调整阈值,以达到最佳的反作弊检测效果。
  • 可以考虑使用动态阈值,即根据实时数据或周期性评估来调整阈值。
  • 作弊行为检测
  • 对于新的游戏行为数据,使用训练好的自编码器进行重构,并计算重构误差。
  • 如果重构误差超过设定的阈值,则将该行为标记为可能的作弊行为,进行进一步的审查和处理。

本篇先聊到这里,后面慢慢填坑接着聊 

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

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

相关文章

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(三)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

鸿蒙开发 之 健康App案例

1.项目介绍 该项目是记录用户日常饮食情况&#xff0c;以及针对不同食物摄入营养不同会有对应的营养摄入情况和日常运动消耗情况&#xff0c;用户可以自己添加食品以及对应的热量。 1.1登陆页 1.2饮食统计页 1.3 食物列表页 2.登陆页 2.1自定义弹框 import preferences from oh…

使用自定义的shiro密码匹配器CredentialsMatcher完成密码验证

今天突然想研究一下shiro怎么匹配用户的密码。 我们使用shiro的API登录时&#xff0c;会先创建一个令牌对象&#xff0c;而经常用的令牌对象是UsernamePasswordToken&#xff0c;把用户输入的用户名和密码作为参数构建一个UsernamePasswordToken&#xff0c;然后通过Subject.l…

十二、Yocto集成ROS2 app程序(package)

文章目录 Yocto集成ROS2 app程序1. 添加一个ros2 package应用程序2. 添加bb文件集成app应用程序 Yocto集成ROS2 app程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十二篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

stable diffusion 模型和lora融合

炜哥的AI学习笔记——SuperMerger插件学习 - 哔哩哔哩接下来学习的插件名字叫做 SuperMerger,它的作用正如其名,可以融合大模型或者 LoRA,一般来说会结合之前的插件 LoRA Block Weight 使用,在调整完成 LoRA 模型的权重后使用改插件进行重新打包。除了 LoRA ,Checkpoint 也…

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xf…

pgsql的套接字文件不存在

问题&#xff1a;psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory 解决方式&#xff1a; 检查 postgresql.conf 文件中的 unix_socket_directories 设置&#xff0c;确保它包含 /tmp 或者你期望的目录。 重…

文本分析|小白教程

在信息爆炸的时代&#xff0c;文本数据无处不在&#xff0c;如何从这些海量的文字中提炼出有价值的信息呢&#xff1f;答案就是——文本分析。文本分析&#xff0c;简单来说&#xff0c;就是对文本数据进行深度的研究和分析。它能够从看似普通的文字中&#xff0c;提取出主题、…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识&#xff1a; 聚类&#xff0c;可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法&#xff0c;可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯&#xff0c;可参考 sheng的学习笔记-AI-…

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 网线是七类网线&#xff0c;外接的USB网卡驱动 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB驱动下载地址 https://download.csdn.net/downlo…

分销裂变实战:PLG模式如何助力企业突破增长瓶颈

在竞争激烈的商业环境中&#xff0c;企业如何快速、有效地实现增长&#xff0c;一直是业界关注的焦点。近年来&#xff0c;分销裂变作为一种新兴的商业模式&#xff0c;凭借其独特的优势&#xff0c;逐渐受到企业的青睐。而产品驱动增长&#xff08;PLG&#xff09;模式更是为分…

JAVA:Word2Vec的使用

1、简介 Word2Vec是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想&#xff0c;可以通过训练&#xff0c;把对文本内容的处理简化为 K 维向量空间中的向量运算&#xff0c;而向量空间上的相似度可以用来表示文本语义上的相似度。 Wo…

Maven deploy上传远程私服失败

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project 你的项目: Cannot deploy artifacts when Maven is in offline mode 解决方案&#xff1a; 1.IDEA把这个钩子去掉 2. settings.xml里把 <offline>标…

聊聊啥项目适合做自动化测试

作为测试从业者&#xff0c;你是否遇到过这样的场景&#xff0c;某天公司大Boss找你谈话。 老板&#xff1a;小李&#xff0c;最近工作辛苦了 小李&#xff1a;常感谢您的认可&#xff0c;这不仅是对我个人的鼓励&#xff0c;更是对我们整个团队努力的认可。我们的成果离不开每…

填完高考志愿后,每天必须要做的三件事!

填完志愿后是等录取通知书吗&#xff1f;错&#xff0c;大错特错&#xff0c;今天老师特别提醒大家&#xff0c;每天要做的3件事非常重要&#xff0c;一定要点赞收藏起来。 第一&#xff0c;每天早上9点登录你们省教育考试院的官网&#xff0c;凭个人的账号和密码查看招生考试…

PTA—C语言期末复习(选择题)

1. 按照标识符的要求&#xff0c;&#xff08;A&#xff09;不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中&#xff0c;标识符通常由字母&#xff08;包括大写和小写&#xff09;、数字和下划线组成&#xff0c;但不能以数字开头&#xff0c…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式595张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;595 标注数量(xml文件个数)&#xff1a;595 标注数量(txt文件个数)&#xff1a;595 标注类别…

预制聚氨酯保温管:高效节能管道保温

在现代能源输送领域&#xff0c;预制聚氨酯保温管正凭借其出色的性能&#xff0c;成为保障能源高效传输的关键角色。 预制聚氨酯保温管&#xff0c;顾名思义&#xff0c;其核心在于聚氨酯保温层。这一独特的设计赋予了它卓越的保温性能。聚氨酯材料具有极低的导热系数&#xff…

2024上海MWC 参展预告 | 未来先行,解锁数字化新纪元!

一、展会介绍——2024世界移动通信大会 2024年世界移动通信大会上海(MWC上海)将于6月26日至28日在上海新国际博览中心举行。 本届大会以“未来先行(Future First)”为主题聚焦“超越5G”、“数智制“人工智能经济’造”三大热点话题。届时将在包括超级品牌馆(Super Hall)在内…

Charles网络抓包工具安装和web抓包(一)

目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#…