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

让人工智障具备信念吧,依莫拉萨~~~串频道+暴露年龄。。。不过深度信念和信念真的没啥关系,不知道为啥这样起名

目录

3.6. 深度信念网络(DBN)

3.6.1. 定义

3.6.2. 发展历史

3.6.3. 算法公式

3.6.4. 运行原理

3.6.4.1. 基本原理

3.6.4.2. Python实现

3.6.4.2.1.简单实现

3.6.4.2.2. DBN训练过程

3.6.4.2.3. DBN的重构函数

3.6.4.3. C++实现方法讨论

3.6.5. 优缺点

3.6.6.游戏AI中使用该算法的场景、方法

3.6.6.1.概述

3.6.6.2. 智能控制游戏AI的算法示例


3.6. 深度信念网络(DBN)

3.6.1. 定义

深度信念网络是由多层受限玻尔兹曼机(Restricted Boltzmann Machines, RBM)堆叠而成的生成式图模型。

它包含多个层次,每一层都学习数据中的高级抽象特征。

在DBN中,最底层是可见层,负责接收输入数据;而顶层及其它所有隐藏层则是RBM。

3.6.2. 发展历史

深度信念网络由Geoffrey Hinton和他的研究小组在2006年首次提出。

这一模型的提出在深度学习领域具有里程碑意义,因为它通过无监督学习有效地训练多层神经网络,克服了传统神经网络训练的一些难题,推动了深度学习的发展。

3.6.3. 算法公式

在DBN中,每一层RBM的学习过程涉及到权重的调整。假设DBN由L层组成,第l层的RBM有权重矩阵(W^l)和偏置向量(b^l)。前向传播过程(从可见层到隐层)中,对于第l层,其隐层变量(z^l)的激活概率由以下公式给出:

[ p(z^l | x^{l-1}) = \sigma(W^l \cdot x^{l-1} + b^l) ]

其中,(\sigma)是sigmoid函数,用于将线性加权和转化为概率分布。反向传播过程(从隐层到可见层)类似,但方向相反。

3.6.4. 运行原理

3.6.4.1. 基本原理

DBN的运行原理基于两个主要阶段:无监督的预训练有监督的微调

无监督的预训练:在这个阶段,每个RBM层独立地进行无监督训练,学习数据的分布。这通过对比散度(Contrastive Divergence)算法实现,该算法能够近似最大化数据的似然函数。

有监督的微调:在预训练完成后,DBN可以使用有标签的数据进行微调,以提高在特定任务上的性能。这通常通过反向传播算法和梯度下降来实现。

3.6.4.2. Python实现
3.6.4.2.1.简单实现

在Python中,我们通常使用深度学习库如TensorFlow或PyTorch来实现DBN。以下是一个简化的DBN实现示例,使用TensorFlow和Keras:

import numpy as np  
import tensorflow as tf  
from tensorflow.keras.layers import Dense  
from tensorflow.keras.models import Sequential, Model  
from tensorflow.keras.layers import Input  # 定义RBM模型  
class RBM(tf.keras.Model):  def __init__(self, num_visible, num_hidden):  super(RBM, self).__init__()  self.num_hidden = num_hidden  self.num_visible = num_visible  self.weights = tf.Variable(tf.random.normal([self.num_visible, self.num_hidden]))  self.bias_hidden = tf.Variable(tf.zeros([self.num_hidden]))  self.bias_visible = tf.Variable(tf.zeros([self.num_visible]))  # ... (此处省略RBM的前向传播、反向传播等方法的实现)  # 定义DBN模型  
class DBN(Model):  def __init__(self, rbm_layers, output_size):  super(DBN, self).__init__()  self.rbm_layers = rbm_layers  self.output_layer = Dense(output_size, activation='softmax')  def call(self, inputs):  x = inputs  for rbm in self.rbm_layers:  x = rbm(x)  # 这里假设RBM类实现了__call__方法来进行前向传播  x = self.output_layer(x)  return x  # 示例:构建一个具有两个RBM层的DBN模型  
rbm1 = RBM(num_visible=784, num_hidden=500)  # 假设输入是28x28的图像  
rbm2 = RBM(num_visible=500, num_hidden=250)  
dbn = DBN(rbm_layers=[rbm1, rbm2], output_size=10)  # 假设有10个类别  # 编译模型(仅用于输出层)  
dbn.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])  # 假设X_train和y_train已经准备好  
# dbn.fit(X_train, y_train, epochs=10, batch_size=32)

上述代码是一个高度简化的示例,用于说明DBN的基本结构。

3.6.4.2.2. DBN训练过程

在实际应用中,你需要实现RBM的前向传播、反向传播(例如,使用CD-k算法)以及DBN的训练过程。以下是DBN训练过程python代码(示例):

深度信念网络(DBN)的训练过程通常分为两步:

首先是无监督的逐层预训练,然后是有监督的微调。

以下是一个简化的DBN训练过程的Python代码示例,使用了scikit-learnnumpy库。

首先,我们需要定义一个RBM类来实现受限玻尔兹曼机的功能:

import numpy as np  
from sklearn.neural_network import BernoulliRBM  class RBMModel:  def __init__(self, num_visible, num_hidden, learning_rate=0.01, n_iter=10, batch_size=10):  self.num_visible = num_visible  self.num_hidden = num_hidden  self.rbm = BernoulliRBM(n_components=num_hidden, learning_rate=learning_rate, n_iter=n_iter, batch_size=batch_size, verbose=0)  def fit(self, X):  self.rbm.fit(X)  def transform(self, X):  return self.rbm.transform(X)

然后,我们可以定义一个DBN类,该类将使用RBM类进行逐层预训练,并添加一个逻辑回归层进行有监督学习:

from sklearn.linear_model import LogisticRegression  class DBN:  def __init__(self, rbm_layers_sizes, learning_rate=0.01, n_iter=10, batch_size=10):  self.rbm_layers = []  self.learning_rate = learning_rate  self.n_iter = n_iter  self.batch_size = batch_size  # 初始化RBM层  for i in range(len(rbm_layers_sizes) - 1):  visible_size = rbm_layers_sizes[i]  hidden_size = rbm_layers_sizes[i + 1]  rbm = RBMModel(visible_size, hidden_size, learning_rate, n_iter, batch_size)  self.rbm_layers.append(rbm)  def pretrain(self, X):  current_data = X  for rbm in self.rbm_layers:  rbm.fit(current_data)  current_data = rbm.transform(current_data)  def finetune(self, X, y):  # 使用最顶层的RBM转换数据  transformed_X = self.transform(X)  # 使用逻辑回归进行微调  self.logistic_regression = LogisticRegression(max_iter=1000)  self.logistic_regression.fit(transformed_X, y)  def transform(self, X):  current_data = X  for rbm in self.rbm_layers:  current_data = rbm.transform(current_data)  return current_data  def predict(self, X):  transformed_X = self.transform(X)  return self.logistic_regression.predict(transformed_X)

现在,使用以下代码来训练DBN:

# 假设 X_train 是训练数据,y_train 是对应的标签  
X_train = ...  # 输入数据,形状为 (样本数, 特征数)  
y_train = ...  # 标签数据  # 定义DBN结构,例如输入层有784个节点(对应于28x28的图像),两个隐藏层分别有500和250个节点  
dbn = DBN([784, 500, 250])  # 进行逐层预训练  
dbn.pretrain(X_train)  # 进行有监督的微调  
dbn.finetune(X_train, y_train)  # 使用训练好的DBN进行预测  
predictions = dbn.predict(X_train)

以上示例使用了scikit-learn中的BernoulliRBMLogisticRegression,它们可能不是最优的选择,特别是对于大型数据集或复杂任务。在实际应用中,你可能需要使用更高级的库(如TensorFlow或PyTorch)来实现更高效的RBM和微调过程。此外,为了获得更好的性能,你可能还需要调整学习率、迭代次数、批处理大小等参数。

3.6.4.2.3. DBN的重构函数

实现RBM的重构函数主要涉及到两个步骤:正向传播(编码)和反向传播(解码)。在RBM中,正向传播是将可见层的数据通过激活函数和权重映射到隐藏层,而反向传播则是将隐藏层的激活通过权重和激活函数映射回可见层。

以下是一个简化的RBM重构函数的实现步骤:

  1. 正向传播(编码)
    • 给定可见层的状态 (v),计算隐藏层每个神经元的激活概率。
    • 使用某种随机过程(如Gibbs采样)或确定性方法(如使用sigmoid函数的输出作为激活概率)来设置隐藏层的状态(h)
  2. 反向传播(解码)
    • 使用隐藏层的状态 (h) 和权重矩阵来重构可见层的状态(\tilde{v})
    • 这通常涉及到计算每个可见层神经元的激活概率,并可能再次使用随机过程或确定性方法来设置重构后的可见层状态。

在编码阶段,隐藏层的激活通常使用sigmoid函数来计算,给定可见层 (v)和权重(W) 以及隐藏层的偏置(b),隐藏层神经元的激活概率(p(h_j=1|v))可以计算为:

[ p(h_j=1|v) = \sigma\left( \sum_i W_{ij} v_i + b_j \right) ]

其中 (\sigma)是sigmoid函数。

在解码阶段,重构的可见层 (\tilde{v})可以通过以下方式计算:

[ p(\tilde{v}i=1|h) = \sigma\left( \sum_j W{ij} h_j + c_i \right) ]

其中 (c)是可见层的偏置。

以下是一个简化的伪代码实现:

import numpy as np  def sigmoid(x):  return 1 / (1 + np.exp(-x))  class RBM:  # 假设RBM类已经初始化了权重W、可见层偏置c和隐藏层偏置b  def reconstruct(self, v):  # 编码:计算隐藏层的激活概率并采样  h_prob = sigmoid(np.dot(v, self.W) + self.b)  h = (np.random.rand(h_prob.shape[0]) < h_prob).astype(int)  # 解码:根据隐藏层状态重构可见层  v_recon_prob = sigmoid(np.dot(h, self.W.T) + self.c)  v_recon = (np.random.rand(v_recon_prob.shape[0]) < v_recon_prob).astype(int)  return v_recon

这个伪代码使用了随机采样来设置隐藏层和重构后的可见层的状态。在实际应用中,你可能需要根据你的具体需求来调整这个过程,例如,使用确定性方法而不是随机采样。

此外,RBM的训练通常涉及复杂的迭代过程,如对比散度(Contrastive Divergence),在这个过程中,重构函数会被多次调用以进行权重和偏置的更新。这里的重构函数仅展示了如何从给定的可见层状态得到重构的可见层状态,而不涉及训练过程。

3.6.4.3. C++实现方法讨论

深度信念网络(DBN)在C++中的实现相对复杂,特别是如果你选择自行实现或者使用像TinyDNN这样的轻量级库。TinyDNN是一个纯C++实现的、无依赖的深度学习库,它支持前向神经网络,但并没有直接支持深度信念网络(DBN)或受限玻尔兹曼机(RBM)。因此,如果你选择使用TinyDNN,你需要自行实现RBM层及其训练逻辑。

以下是一个简化的示例,展示了如何使用C++和TinyDNN库的基础组件来构建一个类似DBN的结构。

  1. 实现RBM类
    • 定义一个RBM类,包含权重矩阵、偏置向量等参数。
    • 实现RBM的训练算法,如对比散度(Contrastive Divergence, CD)。
    • 实现RBM的重构函数,用于将输入数据通过RBM进行编码和解码。
  2. 构建DBN
    • 创建一个DBN类,该类将包含多个RBM对象。
    • 在DBN类中,实现一个方法来逐层训练RBMs,即无监督的预训练。
  3. 微调DBN
    • 在DBN的顶部添加一个输出层,用于分类或回归任务。
    • 使用TinyDNN的有监督学习功能对整个网络进行微调。
// 伪代码示例,不可直接运行  class RBM {  // RBM的实现细节,包括权重、偏置、训练函数等  
};  class DBN {  
private:  std::vector<RBM> rbms; // 存储RBM对象的向量  // 可以添加TinyDNN的网络结构用于微调  public:  DBN(const std::vector<int>& layer_sizes) {  // 根据层大小初始化RBMs  for (size_t i = 0; i < layer_sizes.size() - 1; ++i) {  rbms.emplace_back(layer_sizes[i], layer_sizes[i + 1]);  }  }  void pretrain(const std::vector<tiny_dnn::vec_t>& data) {  // 对每个RBM进行逐层预训练  for (auto& rbm : rbms) {  // 训练逻辑,可能需要将数据通过之前的RBM层进行传递  }  }  void finetune(const std::vector<tiny_dnn::vec_t>& data, const std::vector<tiny_dnn::label_t>& labels) {  // 使用TinyDNN创建顶部的监督学习网络结构  // 并将RBM的权重作为初始化参数  // 然后使用有标签数据进行微调  }  
};

请注意,这个示例主要是为了展示概念,并不是一个完整的DBN实现。

首先,确保你已经安装了TinyDNN库。

#include <tiny_dnn/tiny_dnn.h>  
#include <iostream>  
#include <vector>  // 假设你已经有了一个RBM的实现,这里我们仅声明其接口  
class RBM {  
public:  virtual void train(const tiny_dnn::vec_t& input) = 0;  virtual tiny_dnn::vec_t reconstruct(const tiny_dnn::vec_t& input) = 0;  // ... 其他RBM相关的方法和成员  
};  // 你的具体RBM实现将放在这里  
// ...  class DBN {  
private:  std::vector<std::shared_ptr<RBM>> rbm_layers;  tiny_dnn::network<tiny_dnn::sequential> nn;  public:  DBN(const std::vector<int>& layer_sizes) {  // 构建RBM层  for (size_t i = 0; i < layer_sizes.size() - 1; ++i) {  // 这里你需要用你的RBM实现来替换这个伪代码  auto rbm = std::make_shared<RBMImpl>(layer_sizes[i], layer_sizes[i+1]);  rbm_layers.push_back(rbm);  }  // 构建顶部的神经网络层(例如,一个softmax分类器)  for (size_t i = 1; i < layer_sizes.size(); ++i) {  nn << tiny_dnn::fully_connected_layer(layer_sizes[i-1], layer_sizes[i], true, tiny_dnn::activation::tanh)  << tiny_dnn::softmax_layer(layer_sizes.back());  }  }  void pretrain(const std::vector<tiny_dnn::vec_t>& data) {  for (const auto& sample : data) {  tiny_dnn::vec_t current = sample;  for (const auto& rbm : rbm_layers) {  rbm->train(current);  current = rbm->reconstruct(current); // 假设reconstruct也执行了CD-k步骤  }  }  }  void finetune(const std::vector<tiny_dnn::vec_t>& data, const std::vector<tiny_dnn::label_t>& labels) {  // 使用TinyDNN进行微调  tiny_dnn::adam optimizer;  for (size_t i = 0; i < data.size(); ++i) {  tiny_dnn::vec_t input = data[i];  for (const auto& rbm : rbm_layers) {  input = rbm->reconstruct(input); // 通过RBM层进行前向传播  }  nn.train_once(input, labels[i], optimizer); // 使用顶层的神经网络进行训练  }  }  // ... 其他方法,如predict等  
};  int main() {  // 示例:创建一个DBN,其中包含两个RBM层和一个softmax输出层  DBN dbn({784, 500, 250, 10}); // 假设输入是28x28的图像,有10个类别  // 加载或生成数据  std::vector<tiny_dnn::vec_t> train_data; // 应该包含784维的向量  std::vector<tiny_dnn::label_t> train_labels; // 对应的标签  // 填充train_data和train_labels...  // ...  // 预训练DBN  dbn.pretrain(train_data);  // 微调DBN  dbn.finetune(train_data, train_labels);  return 0;  
}

这个代码示例是一个高级框架,用于说明如何在C++中使用TinyDNN构建一个类似DBN的结构。实际的RBM实现(在RBMImpl类中)需要你自行完成,包括训练、重构等方法的详细逻辑。

由于TinyDNN本身不支持RBM或DBN,因此你需要对神经网络和机器学习有深入的理解,以便正确地实现这些组件。如果你对这些概念还不熟悉,建议先学习相关理论,或者考虑使用更高级的库,如TensorFlow或PyTorch,这些库通常有更多的社区支持和资源。

3.6.5. 优缺点

优点

  • DBN能够通过无监督学习提取数据的深层特征。
  • 适用于未标记数据,具有较强的特征学习能力。
  • 作为生成模型,能够生成新的数据示例。

缺点

  • 训练过程相对复杂,需要分阶段进行。
  • 在某些情况下,可能不如其他深度学习模型(如CNN或RNN)在特定任务上表现优异。

3.6.6.游戏AI中使用该算法的场景、方法

3.6.6.1.概述

在游戏AI中,DBN可以应用于以下场景和方法:

  • 特征学习:DBN可以自动从游戏数据中学习到有意义的特征表示。这些特征可以用于玩家行为分析、游戏内容推荐等任务。
  • 智能生成:利用DBN的生成能力,可以生成新的游戏内容,如关卡设计、角色动作等,为游戏提供丰富的多样性和可玩性。
  • 智能控制:通过训练DBN模型来理解玩家的游戏行为,游戏AI可以更加智能地控制游戏角色或NPC的行为,提高游戏的互动性和趣味性。

在实现上,游戏开发者可以收集游戏数据(如玩家行为日志、游戏截图等),然后使用DBN进行特征学习和模型训练。

训练好的模型可以集成到游戏引擎中,实现智能生成、智能控制等功能。

3.6.6.2. 智能控制游戏AI的算法示例

下面是一个简化的示例,展示如何使用Python和深度学习库(如TensorFlow或Keras,因为TinyDNN对深度学习的支持较为有限)来实现一个DBN,以便理解玩家的游戏行为并据此控制游戏角色或NPC。

请注意,以下代码是一个概念性示例,用于说明如何实现这样的系统,而不是一个即插即用的解决方案哦。(不要试图直接复制粘贴的说,而且训练数据需要专业收集和标注哦)

import numpy as np  
from sklearn.preprocessing import StandardScaler  
from tensorflow.keras.layers import Dense  
from tensorflow.keras.models import Sequential, Model  
from tensorflow.keras.optimizers import Adam  # 假设你已经有了一个RBM类,这里简化为一个占位符  
class RBM:  # RBM的实现细节(略)  pass  # 假设的游戏行为数据  
# 每行代表一个玩家的游戏行为记录,每列代表不同的行为特征  
game_behaviors = np.random.rand(1000, 20)  # 数据标准化  
scaler = StandardScaler()  
game_behaviors_scaled = scaler.fit_transform(game_behaviors)  # 构建DBN  
class DBN:  def __init__(self, layer_sizes):  self.rbms = []  for i in range(len(layer_sizes) - 1):  # 这里简化了RBM的创建和训练过程  rbm = RBM(layer_sizes[i], layer_sizes[i+1])  self.rbms.append(rbm)  self.layer_sizes = layer_sizes  def pretrain(self, data, epochs):  # 逐层预训练RBMs  for i, rbm in enumerate(self.rbms):  if i == 0:  input_data = data  else:  input_data = self.transform(input_data, through_layer=i-1)  # 假设RBM类有train方法  rbm.train(input_data, epochs=epochs)  def transform(self, data, through_layer):  # 将数据通过RBM层进行转换  for i in range(through_layer + 1):  # 假设RBM类有transform方法  data = self.rbms[i].transform(data)  return data  def fine_tune(self, input_data, labels):  # 微调DBN  # 首先,通过RBM层转换输入数据  transformed_data = self.transform(input_data, through_layer=len(self.rbms) - 1)  # 构建一个监督学习模型来进行微调  model = Sequential()  model.add(Dense(128, activation='relu', input_dim=self.layer_sizes[-1]))  model.add(Dense(64, activation='relu'))  model.add(Dense(len(np.unique(labels)), activation='softmax'))  model.compile(optimizer=Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy'])  model.fit(transformed_data, labels, epochs=10, batch_size=32)  return model  # 创建和预训练DBN  
dbn = DBN([20, 50, 100, 128])  # 假设的层大小  
dbn.pretrain(game_behaviors_scaled, epochs=10)  # 假设的预训练轮数  # 假设你有一些与游戏行为数据对应的标签(例如,玩家的不同策略或行为模式)  
labels = np.random.randint(0, 5, size=1000)  # 假设有5种不同的行为模式  # 微调DBN  
fine_tuned_model = dbn.fine_tune(game_behaviors_scaled, labels)  # 使用微调后的模型来预测新玩家的行为模式  
# 假设 new_game_behaviors 是新玩家的游戏行为数据  
new_game_behaviors = np.random.rand(10, 20)  
new_game_behaviors_scaled = scaler.transform(new_game_behaviors)  
predicted_patterns = fine_tuned_model.predict_classes(dbn.transform(new_game_behaviors_scaled, through_layer=len(dbn.rbms) - 1))  
print("Predicted behavior patterns:", predicted_patterns)

在实际应用中,你需要实现或集成一个功能完整的RBM,包括其训练、重构和转换方法。此外,微调部分的模型结构和参数也可能需要根据具体任务进行调整。

下一篇,将迎来深度学习的重头戏Transformer~~~

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

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

相关文章

【Week-G1】调用官方GAN实现MNIST数字识别,Pytorch框架

文章目录 1. 准备数据1.1 配置超参数1.2 下载数据1.3 配置数据 2. 创建模型2.1 定义鉴别器2.2 定义生成器 3. 训练模型3.1 创建实例3.2 开始训练3.3 保存模型 4. 什么是GAN&#xff08;对抗生成网络&#xff09;? &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 信号量和互斥锁 --(三)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

帕金森患者吞咽困难?如何让饮食更顺畅!

在帕金森病患者的日常生活中&#xff0c;吞咽困难是一个常见而又棘手的问题。它不仅影响了患者的饮食质量&#xff0c;还可能导致营养不良、吸入性肺炎等严重并发症。那么&#xff0c;面对帕金森综合症导致的吞咽困难&#xff0c;我们该如何应对呢&#xff1f; 一、了解帕金森综…

一个去掉PDF背景水印的思路

起因 昨天测试 使用“https://github.com/VikParuchuri/marker” 将 pdf 转 Markdown的过程中&#xff0c;发现转换后的文件中会保护一些背景图片&#xff0c;是转换过程中&#xff0c;程序把背景图识别为了内容。于是想着怎么把背景图片去掉。 背景水印图片的特征 我这里拿…

openGuass数据库极简版安装和远程连接实战(阿里云服务器操作)

openGauss部署之后&#xff0c;在服务器上提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能&#xff0c;还提供了若干高级特性&#xff0c;便于用户使用。但图形化工具除了官方的Data Studio外&#xff0c;还可以使用SQLynx进行连接&#xff08;…

Taro + vue3 中微信小程序中实现拉起支付

在前端开发中 H5 的拉起支付和微信小程序的拉起支付 是不太一样的 现在分享一下微信小程序中的拉起支付 逻辑都在后端 我是用的Taro 框架 其实就是一个Api Taro 文档

酷开系统丨开启家庭智能教育让学习成为一种乐趣

在数字化时代&#xff0c;孩子们接触的信息日益增多&#xff0c;而酷开系统洞察到了家长对孩子成长环境的关切。酷开系统&#xff0c;作为家庭娱乐与教育的融合平台&#xff0c;不仅注重提供丰富的教育资源&#xff0c;更致力于创造一个健康、有益的学习和娱乐环境。 在酷开系…

【数据同步】什么是ETL增量抽取?

目录 一、什么是ETL增量抽取 二、企业如何应用ETL增量抽取 三、如何进行ETL增量抽取 1.基于时间戳的增量抽取 2.基于主键的增量抽取 在当今信息化时代&#xff0c;数据的快速增长和多样化使得企业面临着巨大的数据管理挑战。为了高效地处理和利用数据&#xff0c;ETL&#xff0…

零知识证明基础:对称加密与非对称加密

1、绪论 在密码学体系中&#xff0c;对称加密、非对称加密、单向散列函数、消息认证码、数字签名和伪随机数生成器被统称为密码学家的工具箱。其中&#xff0c;对称加密和非对称加密主要是用来保证机密性&#xff1b;单向散列函数用来保证消息的完整性&#xff1b;消息认证码的…

权限 chmod

参考&#xff1a; Linux chmod 命令 | 菜鸟教程 (runoob.com) Linux chmod&#xff08;英文全拼&#xff1a;change mode&#xff09;命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者&#xff08;Owner Users&#xff09;用户组&#xff08…

Arduino - MG996R

Arduino - MG996R In this tutorial, we are going to learn how to use the MG996R high-torque servo motor with Arduino. 在本教程中&#xff0c;我们将学习如何将MG996R高扭矩伺服电机与Arduino一起使用。 Hardware Required 所需硬件 1Arduino UNO or Genuino UNO Ard…

windows系统如何快速查看显卡详情信息

winR&#xff0c;输入dxdiag 打开DirectX诊断工具&#xff0c;可以看到显卡的详细硬件信息

Vue原生写全选反选框

效果 场景&#xff1a;Vue全选框在头部&#xff0c;子框在v-for循环内部。 实现&#xff1a;点击全选框&#xff0c;所有子项选中&#xff0c;再次点击取消&#xff1b;子项全选中&#xff0c;全选框自动勾选&#xff0c;子项并未全选&#xff0c;全选框不勾选&#xff1b;已选…

国产音频放大器工作原理以及应用领域

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备&#xff0c;其重建的信号音量和功率级都要理想&#xff1a;如实、有效且失真低。音频范围为约20Hz&#xff5e;20000Hz&#xff0c;因此放大器在此范围内必须有良好的频率响应&#xff08;驱动频带受限的扬声器时要…

无人机操作注意事项

检查飞行设备 每次飞行前&#xff0c;要认真检查无人机的各处细节&#xff0c;遥控器等地面设备也不例外。 确保设备电量充足 起飞前&#xff0c;检查无人机是否电量充足&#xff0c;以及辅助设备如遥控器、手机等。 选择空旷的飞行场地 选择适宜的场地进行操作&#xff0…

机器学习原理和代码实现专辑

1. 往期文章推荐 1.【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现 2. 【机器学习】基于Gumbel-Sinkhorn网络的“潜在排列问题”求解 3. 【机器学习】基于Gumbel Top-k松弛技术的图形采样 4. 【机器学习】基于Softmax松弛技术的离散数据采样 5. 【机器学习】正则…

GNU、Unix、Linux、Makefile、GCC、GDB、GPL、CentOS 7、Ubuntu之间的关系

全文总结 早期&#xff0c;Unix系统作为一类强大的操作系统&#xff0c;在计算领域奠定了基础。然而&#xff0c;出于对软件自由的追求&#xff0c;Richard Stallman在1983年发起了GNU项目&#xff0c;旨在创建一个完全自由的、与Unix兼容的操作系统。GNU项目不仅倡议软件自由…

空间转录组学联合单细胞转录组学揭示卵巢癌生存相关受配体对

卵巢癌&#xff0c;作为女性生殖系统中的一种常见恶性肿瘤&#xff0c;其高级别浆液性卵巢癌&#xff08;HGSC&#xff09;亚型尤其致命。尽管多数患者对初次治疗反应良好&#xff0c;但超过75%的晚期HGSC患者会在治疗后复发&#xff0c;并且对化疗药物产生耐药性。然而&#x…

vs code + Keil Assistant 配置 Keil 单片机开发

1、 先安装vscode完成后 安装插件 2 安装C/C 与 keil Assistant 需说明一下 Assistant 1.7.0版本有bug F7按不了 所以安装1.6.2版本 以下是我的安装插件 EMBEDDED IDE 可安装 可不安装 随便你 3 配置 Assistant 4、设置C/C 目录 ${workspaceFolder}/**D:/Keil_v5/C51/INC/**…

排序算法系列一:选择排序、插入排序 与 希尔排序

零、说在前面 本文是一个系列&#xff0c;入口请移步这里 一、理论部分 1.1&#xff1a;选择排序 1.1.1&#xff1a;算法解读&#xff1a; 使用二分法和插入排序两种算法的思想来实现。流程分为“拆分”、“合并”两大部分&#xff0c;前者就是普通的二分思想&#xff0c;将…