游戏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) 映射回与原始输入数据维度相同的重构数据 (r)。这个过程可以表示为:
其中,是解码器的神经网络函数, 是解码器的参数,是编码器的输出(即隐藏表示), 是重构的数据。
自编码器的训练
自编码器的训练目标是最小化输入数据 和重构数据 之间的差异。这通常通过优化一个损失函数(如均方误差MSE)来实现:
其中,是输入数据的维度,和 分别是输入数据和重构数据在第 维上的值。
需要注意的是,自编码器的具体实现和公式可能会因应用场景、网络结构和优化目标的不同而有所变化。上述描述和公式提供了一个基本的框架和概念。
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. 实际应用场景
特征降维与数据压缩:
游戏中的数据往往维度很高,例如玩家的行为数据、游戏场景的状态等。自编码器可以用于将这些高维数据压缩到较低的维度,同时保留重要特征,便于后续的分析和处理。异常检测:
通过训练自编码器来重构正常行为的数据,当输入异常数据时,自编码器的重构误差会显著增大,从而可以用于检测游戏中的异常行为,如作弊、外挂等。生成模型:
自编码器可以用作生成模型的一部分,生成新的游戏内容,如地图、角色或物品等。这在游戏设计和测试中非常有用。预测与决策支持:
利用自编码器提取的特征可以输入到其他机器学习模型中,用于玩家行为预测、游戏结果预测等,从而辅助游戏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的具有编程能力的玩家也会监守自盗偷偷的做一些不法的东东,鄙视)
- 阈值调整与优化:
- 在实际应用中,根据反馈和效果不断调整阈值,以达到最佳的反作弊检测效果。
- 可以考虑使用动态阈值,即根据实时数据或周期性评估来调整阈值。
- 作弊行为检测:
- 对于新的游戏行为数据,使用训练好的自编码器进行重构,并计算重构误差。
- 如果重构误差超过设定的阈值,则将该行为标记为可能的作弊行为,进行进一步的审查和处理。
本篇先聊到这里,后面慢慢填坑接着聊
相关文章:
游戏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…...
基于SpringBoot养老院管理系统设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…...
餐饮点餐的简单MySQL集合
ER图 模型图(没有进行排序,混乱) DDL和DML /* Navicat MySQL Data TransferSource Server : Mylink Source Server Version : 50726 Source Host : localhost:3306 Source Database : schooldbTarget Server Type …...
STM32驱动-ads1112
汇总一系列AD/DA的驱动程序 ads1112.c #include "ads1112.h" #include "common.h"void AD5726_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能 G…...
数据结构与算法高频面试题
初级面试题及详细解答 当涉及到数据结构与算法的初级面试题时,通常涉及基本的数据结构操作、算法复杂度分析和基本算法的应用。 1. 什么是数组?数组和链表有什么区别? 解答: 数组:是一种线性数据结构,用…...
uni-app的showModal提示框,进行删除的二次确认,可自定义确定或取消操作
实现效果: 此处为删除的二次确认示例,点击删除按钮时出现该提示,该提示写在js script中。 实现方式: 通过uni.showModal进行提示,success为确认状态下的操作自定义,此处调用后端接口进行了删除操作&#…...
5款提高工作效率的免费工具推荐
SimpleTex SimpleTex是一款用于创建和编辑LaTeX公式的简单工具。它能够识别图片中的复杂公式并将其转换为可编辑的数据格式。该软件提供了一个直观的界面,用户可以在编辑LaTeX代码的同时实时预览公式的效果,无需额外的编译步骤。此外,SimpleT…...
区块链的技术架构:节点、网络和数据结构
区块链技术听起来很高大上,但其实它的核心架构并不难理解。今天我们就用一些简单的例子和有趣的比喻,来聊聊区块链的技术架构:节点、网络和数据结构。 节点:区块链的“细胞” 想象一下,区块链就像是一个大型的组织&a…...
pdfmake不能设置表格边框颜色?
找到pdfmake>build>pdfmake.js中: 找到定义的“TableProcessor.prototype.drawVerticalLine”和“TableProcessor.prototype.drawHorizontalLine”两个方法: 重新定义borderColor: var borderColor this.tableNode.table.borderColor||"#…...
laravel 使用RabbitMQ作为消息中间件
先搞定环境,安装amqp扩展 确保已安装rabbitmq-c-dev。 比如 可以使用apk add rabbmit-c-dev安装 cd ~ wget http://pecl.php.net/get/amqp-1.10.2.tgz tar -zxf amqp-1.10.2.tgz cd amqp-1.10.2 phpize ./configure make && make install cd ~ rm -rf am…...
web项目打包成可以离线跑的exe软件
目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时,我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标,其中 pywebview 是一个轻量级的库,它允许我们…...
BFS:队列+树的宽搜
一、二叉树的层序遍历 . - 力扣(LeetCode) 该题的层序遍历和以往不同的是需要一层一层去遍历,每一次while循环都要知道在队列中节点的个数,然后用一个for循环将该层节点走完了再走下一层 class Solution { public:vector<vec…...
MySQL高级-SQL优化- count 优化 - 尽量使用count(*)
文章目录 1、count 优化2、count的几种用法3、count(*)4、count(id)5、count(profession)6、count(null)7、 count(1) 1、count 优化 MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高&a…...
python Flask methods
在 Flask 中,app.route() 装饰器用于定义 URL 路由和与之关联的视图函数。当你想指定某个 URL 可以接受哪些 HTTP 方法时,你可以使用 methods 参数。methods 是一个列表,它可以包含任何有效的 HTTP 方法。 Falsk文章中的描述: 链…...
three.js场景三元素
three.js是一个基于WebGL的轻量级、易于使用的3D库。它极大地简化了WebGL的复杂细节,降低了学习成本,同时提高了性能。 three.js的三大核心元素: 场景(Scene) 场景是一个三维空间,是所有物品的容器。可以将…...
Spring AOP(面向切面编程)详解
Spring AOP(面向切面编程)详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 什么是Spring AOP? Spring AOP(…...
Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理
目录 引入 ——为什么分布式系统需要用第三方软件? JMS 对比 组件 架构推演——备份实现安全可靠 , Zookeeper controller的选举 controller和broker底层通信原理 BROKER内部组件 编辑 topic创建 引入 ——为什么分布式系统需要用第三方软件&#…...
14、顺时针打印矩阵
题目: 顺时针打印矩阵 描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如, 如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字:1,2,3,4,8,1…...
毅速丨金属3D打印是制造业转型升级的重要技术
随着科技的进步,金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势,正引领着制造业迈向新的未来。 金属3D打印技术的突破: 设计自由。金属3D打印能制造任意形状和结构的零件,为设计师提供了无限的创意空间。 快速制…...
uni-app uni-data-picker级联选择器无法使用和清除选中的值
出现问题: 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法: 在uni-app uni-data-picker使用中,要添加v-model,v-model在官网的示例中没有体现,但若不加则无法清除。 <uni-data-picker v-m…...
构造函数的小白理解
一、实例 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;//定义一个名为Question的类,用于存储问题及相关信息 [Serializable] public class Question {public string questionText;//存储题目文本字段public str…...
招聘,短信与您:招聘人员完整指南
招聘人员面临的最大挑战之一就是沟通和联系候选人。为何?我们可以从以下原因开始:候选人通常被太多的招聘人员包围,试图联系他们,这使得你很难吸引他们的注意。在招聘过程的不同阶段,根据不同的工作量,让申请人保持最…...
JAVA-矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路: 找到0的位置,把0出现的数组的其他值夜置为0 需要额外空间方法: 1、定义两个布尔数组标记二维数组中行和列…...
[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器
前言 不是学电子出身的,这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为: H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc1 这是因为一阶低通滤波器的设计目标是允许低频信…...
Mac环境 aab包转apks,并安装apks
一、下载下载bundletool工具 Releases google/bundletool GitHub 二、将下载bundletool.jar包、aab、keystore文件全部放到同一个目录下 例如我全部放到download目录下 转换命令行: java -jar bundletool-all-1.16.0.jar build-apks --modeuniversal --bundle…...
银河麒麟V10 SP1.1操作系统 离线安装 nginx1.21.5、redis 服务
银河麒麟官网地址:国产操作系统、麒麟操作系统——麒麟软件官方网站 一、查看系统版本 命令:nkvers 我的是 release V10 (SP1),根据这个版本去官网找对应的rpm包 银河麒麟操作系统的rpm包必须从官方找, 要是随便找个Centos的rp…...
ios swift5 视频播放 播放视频失败 无法播放HEVC (H.265) 格式的视频 H.264格式的可以播放
文章目录 1.问题2.原因:iOS swift AVPlayerViewController无法播放HEVC (H.265) 格式的视频3.解决方法用第三方框架MobileVLCKit来播放4.用MobileVLCKit写的播放器4.1 两个oc版本的4.2 两个swiftUI版本的5.苹果是支持HEVC (H.265) 格式的视频,是硬件那边…...
网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休
01 上海吾索信息科技有限公司 🔷招聘岗位:网络工程师 🔷岗位职责: 1)具备网络系统运维服务经验以及数据库实施经验,具备网络系统认证相关资质或证书; 2)掌握常用各设备的运维巡检…...
【Qt】QMessageBox 各种对话框的默认显示效果
1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…...
一文弄懂线性回归模型
1、引言 今天,我们将深入探讨机器学习中的三个关键概念:线性回归、代价函数和梯度下降。这些概念构成了许多机器学习算法的基础。起初,我决定不写一篇关于这些主题的文章,因为它们已经被广泛涉及。不过,我改变了主意&…...
8月4号建设部网站/下载百度app
您所在位置:网站首页 > 海量文档 > 计算机 > Java如何利用Java实现QQ文件传输功能.pdf2页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性,…...
东莞网站建设营销哪家好/排名网站
React学习01React简介React的特点React第一个例子虚拟DOM的两种创建方式虚拟DOM与真实DOM的区别JSXJSX练习模块与组件函数式组件类式组件组件属性stateReact事件bind的使用setState的使用state的简写方式props使用state进行实现(不建议使用)使用props批量传递props对props进行限…...
cms建站系统哪家好/2024年新冠疫情最新消息今天
我们在调试WebPart或者EventHandler之类的自定义组件时会遇到如何定位部署的网站集所对应的w3wp.exe进程的问题,方法如下 :方法1.直接开始运行,输入cmd,再输入iisapp可以列出当前所有IIS中的WebApplication所对应的w3wp.exe进程,后…...
电子政务网站建设ppt/金戈枸橼酸西地那非片
在很多实际项目中,有一类实际问题,就是将一些图层设置为可选和不可选,类似于地图背景是不能被选择的, 自己添加的一些图元(如GPS应用中的被监控车辆、最优化路径中的必须经过点)是可以选择和编辑的。 设置图层可不可以选择&#x…...
c2c网站开发策划/公众号软文是什么意思
Latex基本语法的备忘录 Latex基本语法前言一、常见的数学符号1. 数学上的“**属于**”、“**不属于**”符号。2. 数学的矩阵的**转置符号**书写。3. 数学中求和公式。4.数学中字母代上标5.数字或公式上添加方框6.数学分式7.数学公式中在某些符号下添加花括号8.数学中的垂直符号…...
wordpress网易云音乐自定义css/阿里指数官网最新版本
关注并标星百问科技嵌入式干货,第一时间送达------感谢各位耐心等候。昨天更新蓝牙第4节:009.蓝牙系统从零讲解/第02课_BLE协议栈/第03节_BLE协议各层数据格式概述 ,这节依然免费试看,下一节开始加密收费。主讲:BLE协议…...