深度学习模型九大经典初始化方案

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

1. 正态分布初始化

正态分布初始化将权重初始化为来自正态(或高斯)分布的随机数。该分布通常以0为均值,其标准差(或方差)可以根据网络的特定需求进行调整。这种方法在保证权重不会开始时过大或过小的同时,允许模型自行学习适合的权重分布。

让我们用Python来实现正态初始化:

def normal_distribution_initialization(n_in, n_out, std=0.01):"""Normal distribution initialization for a weight matrix.:param n_in: Number of input units.:param n_out: Number of output units.:param std: Standard deviation of the normal distribution.:return: Initialized weight matrix."""weights = np.random.normal(0, std, (n_out, n_in))  # Initialize weightsreturn weights# Example: Initialize weights for a layer with 100 input units and 50 output units using normal distribution
weights_normal = normal_distribution_initialization(n_in, n_out, std=0.01)# Plot the histogram of the initialized weights
plt.hist(weights_normal.flatten(), bins=50, color='purple', alpha=0.7)
plt.title('Normal Distribution Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码运行结果如下:

图片[1]-深度学习模型九大经典初始化方案-VenusAI
图1 运行结果

在图1中,我们展示了使用正态分布初始化方法初始化权重后的权重分布直方图。可以看到,这些权重值主要集中在零附近,呈现出紧凑的高斯分布形状。在这个例子中,标准差设置为0.01,这意味着大多数权重值都位于[−0.02,0.02] 的范围内。

正态分布初始化是一种通用的初始化策略,适用于多种不同类型的神经网络。通过合理选择分布的标准差,可以确保权重既不会过大,也不会过小,有助于网络在训练过程中稳定地学习。

2. 均匀初始化

均匀初始化是一种简单而常用的神经网络权重初始化方法。在这种方法中,权重被初始化为在一个特定的小范围内均匀分布的随机数。均匀初始化的主要优势在于其简单性和在许多场景下的有效性。它适用于多种不同类型的神经网络,特别是在缺乏先验知识时,提供了一种合理的权重初始化选择。通过在合理的范围内均匀分布权重,这种方法有助于避免在训练初期激活值过大或过小,从而促进了有效的学习过程。

接下来,我将介绍均匀分布初始化的实现和可视化。

# 均匀分布初始化的实现和权重分布直方图def uniform_distribution_initialization(n_in, n_out, limit=0.01):"""Uniform distribution initialization for a weight matrix.:param n_in: Number of input units.:param n_out: Number of output units.:param limit: The range of the uniform distribution (-limit, limit).:return: Initialized weight matrix."""weights = np.random.uniform(-limit, limit, (n_out, n_in))  # Initialize weightsreturn weights# Example: Initialize weights for a layer with 100 input units and 50 output units using uniform distribution
weights_uniform = uniform_distribution_initialization(n_in, n_out, limit=0.01)# Plot the histogram of the initialized weights
plt.hist(weights_uniform.flatten(), bins=50, color='orange', alpha=0.7)
plt.title('Uniform Distribution Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码运行结果如下:

图片[2]-深度学习模型九大经典初始化方案-VenusAI
图2 运行结果

在图2中,我们展示了使用均匀分布初始化方法初始化权重后的权重分布直方图。这些权重值均匀分布在 [−0.01,0.01] 的范围内,呈现出较为平坦的直方图形状。

均匀分布初始化为权重赋予了在给定范围内均匀分布的随机值,这有助于在网络训练的初期阶段保持激活和梯度的多样性。这种初始化方式适用于多种网络架构,尤其是在缺乏先验知识时,它提供了一种简单且有效的权重初始化选择。

通过对比正态分布和均匀分布的初始化,可以看到不同初始化策略对权重值分布的影响,这进一步说明了初始化对神经网络训练过程的重要性。

3. Xavier/Glorot 初始化

这种初始化方法由 Xavier Glorot 和 Yoshua Bengio 提出,特别适用于具有S型激活函数(如sigmoid或tanh)的网络。其核心思想是通过调整权重的规模来保持网络各层的输出方差大致相同,这有助于避免在训练过程中的梯度消失或爆炸。

在实现这种初始化方法时,权重通常从一个均值为0,方差为\frac2{n_\mathrm{in}+n_\mathrm{out}} 的正态分布中随机抽取,其中\mathrm{~}n_\mathrm{in}和 n_{\mathrm{out}}分别是权重矩阵的输入和输出连接数量。这种方法也可以使用均匀分布来实现,此时分布的范围会根据\mathrm{~}n_\mathrm{in} 和 n_{\mathrm{out}} 进行调整。

让我们用Python来实现Xavier初始化,并可视化一个初始化后的权重矩阵。我们将初始化一个简单的全连接层的权重,并使用热图显示初始化后的权重分布。

import numpy as np
import matplotlib.pyplot as pltdef xavier_initialization(n_in, n_out):"""Xavier initialization for a weight matrix.:param n_in: Number of input units.:param n_out: Number of output units.:return: Initialized weight matrix."""var = 2.0 / (n_in + n_out)  # Calculate the variance for Xavier initializationweights = np.random.normal(0, np.sqrt(var), (n_out, n_in))  # Initialize weightsreturn weights# Example: Initialize weights for a layer with 100 input units and 50 output units
n_in, n_out = 100, 50
weights_xavier = xavier_initialization(n_in, n_out)# Plot the histogram of the initialized weights
plt.hist(weights_xavier.flatten(), bins=50, color='blue', alpha=0.7)
plt.title('Xavier Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码的运行结果如下:

图片[3]-深度学习模型九大经典初始化方案-VenusAI
图3 运行结果

在图3中,我们可视化了使用 Xavier/Glorot 初始化方法初始化的权重矩阵。这个矩阵代表一个从100个输入单元到50个输出单元的全连接层的权重。

如图3所示,这些权重被初始化为接近零的小数值,分布均匀且对称。这有助于确保网络在训练开始时,各层输出的方差保持大致相同,从而有助于避免梯度消失或爆炸,特别是在使用S型激活函数时。

Xavier初始化是深度学习中一种常用的初始化技术,特别适用于深度前馈神经网络和具有S型激活函数的网络。通过合理的初始化,它可以显著提高网络训练的稳定性和收敛速度。

4. He 初始化

这种方法由 Kaiming He 等人提出,特别适用于使用ReLU激活函数的网络。He 初始化的主要思想是在深度网络中维持信号的方差,从而避免梯度消失或爆炸的问题。

在实现 He 初始化时,权重通常从一个均值为 0 ,方差为 \frac2{n_{in}}的正态分布中随机抽取,其中n_{in}是权重矩阵的输入连接数量。这种方法也可以使用均匀分布来实现,此时分布的范围会根据n_{in}进行调整。

让我们用Python来实现He初始化,并可视化一个初始化后的权重矩阵。我们将初始化一个简单的全连接层的权重,并使用热图显示初始化后的权重分布。

让我们用Python来实现He初始化,并可视化一个初始化后的权重矩阵。我们将初始化一个简单的全连接层的权重,并使用热图显示初始化后的权重分布。

# He 初始化的完整代码和权重分布直方图def he_initialization(n_in, n_out):"""He initialization for a weight matrix.:param n_in: Number of input units.:param n_out: Number of output units.:return: Initialized weight matrix."""var = 2.0 / n_in  # Calculate the variance for He initializationweights = np.random.normal(0, np.sqrt(var), (n_out, n_in))  # Initialize weightsreturn weights# Example: Initialize weights for a layer with 100 input units and 50 output units
weights_he = he_initialization(n_in, n_out)# Plot the histogram of the initialized weights
plt.hist(weights_he.flatten(), bins=50, color='green', alpha=0.7)
plt.title('He Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码运行结果如下:

图片[7]-深度学习模型九大经典初始化方案-VenusAI
图4 运行结果

从图4中可以看出,He 初始化产生的权重值分布更宽,相较于 Xavier 初始化,这些权重的方差更大。

He 初始化特别适用于使用 ReLU(及其变体)激活函数的网络。通过提高权重的初始方差,这种方法有助于维持网络在深层中的激活和梯度的传播,从而避免了梯度消失的问题。

5. 正交初始化

正交初始化是一种专门用于神经网络权重初始化的方法。它基于正交矩阵的概念,即矩阵的行或列是彼此正交并且单位化的。这种初始化方式有助于维持梯度的规模,防止在深度神经网络训练过程中发生梯度爆炸或消失。

实现正交初始化通常涉及生成一个随机矩阵,然后通过奇异值分解(SVD)来获取近似正交的矩阵。这个近似正交的矩阵被用作网络层的权重。这种方法特别适用于递归神经网络(RNN),但也可用于其他类型的深度网络。

在实际应用中,如果权重矩阵的形状是m\times n,正交初始化会生成一个 m\times n 的矩阵,其中 m是输出单元数, n 是输入单元数。通过SVD处理后,得到的矩阵保持了其列 (或行) 之间的正交性。

正交初始化通过保持权重矩阵的正交性,有助于避免在训练过程中的数值不稳定性,特别是在递归网络中,这对于保持梯度的稳定传播非常重要。Python代码实现如下:

def orthogonal_initialization(shape, gain=1.0):"""Orthogonal initialization for a weight matrix.:param shape: The shape of the weight matrix.:param gain: A scaling factor applied to the orthogonal matrix.:return: Initialized weight matrix."""# Create a random matrixa = np.random.normal(0.0, 1.0, shape)# Perform QR factorizationu, _, v = np.linalg.svd(a, full_matrices=False)# Pick the one with the correct shapeq = u if u.shape == shape else v# Scale the matrixreturn gain * q# Example: Initialize weights for a layer with 100 input units and 50 output units
shape = (50, 100)
weights_orthogonal = orthogonal_initialization(shape)# Plot the histogram of the initialized weights
plt.hist(weights_orthogonal.flatten(), bins=50, color='red', alpha=0.7)
plt.title('Orthogonal Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码运行结果如下:

图片[5]-深度学习模型九大经典初始化方案-VenusAI
图5 运行结果

在图5中,我们展示了使用正交初始化方法初始化权重后的权重分布直方图。可以看到,这些权重值的分布呈现出一定的对称性,并且覆盖了一个相对宽泛的值域。

正交初始化通过维持初始化权重的独立性和分散性,可以显著减少训练初期的梯度消失或爆炸问题,从而有助于网络的快速和稳定训练。

6. 稀疏初始化

稀疏初始化是一种神经网络权重初始化方法,它将大部分权重设置为零,只有少数权重被赋予非零值。这种方法的目的是减少参数间的冗余,提高网络训练的效率和泛化能力。

在实现稀疏初始化时,通常会指定一个稀疏度参数(如每个神经元连接到的前一层神经元的数量),然后随机选择这些连接并赋予它们非零的权重。这些非零权重可以从一个正态分布或均匀分布中随机抽取。

如果权重矩阵的形状是 m\times n ,并且稀疏度为 k ,则每个输出神经元只与输入层中的 k个神经元连接,权重矩阵中大约有 m\times k个非零元素。

稀疏初始化减少了模型的参数数量,有助于防止过拟合,并且在一些情况下可以加速神经网络的训练过程。这种初始化尤其适用于输入特征非常多但是只有少数是重要的场景。Python代码实现如下:

def sparse_initialization(n_in, n_out, sparsity=50):"""Sparse initialization for a weight matrix.:param n_in: Number of input units.:param n_out: Number of output units.:param sparsity: Number of non-zero connections for each output unit.:return: Initialized weight matrix."""# Initialize a matrix of zerosweights = np.zeros((n_out, n_in))for i in range(n_out):# Randomly choose indices for non-zero weightsnon_zero_indices = np.random.choice(n_in, sparsity, replace=False)# Assign random values from a normal distribution to these indicesweights[i, non_zero_indices] = np.random.normal(0, 0.1, sparsity)return weights# Example: Initialize weights for a layer with 100 input units and 50 output units with sparsity 10
weights_sparse = sparse_initialization(100, 50, 10)# Plot the histogram of the initialized weights
plt.hist(weights_sparse.flatten(), bins=50, color='brown', alpha=0.7)
plt.title('Sparse Initialization Weight Distribution')
plt.xlabel('Weight value')
plt.ylabel('Frequency')
plt.show()

代码运行结果如下:

图片[6]-深度学习模型九大经典初始化方案-VenusAI
图6 运行结果

在图6中,我们展示了使用稀疏初始化方法初始化权重后的权重分布直方图。如图所示,大多数权重值为零(这在直方图中表现为一个高峰),而非零权重则分布在一个较小的值域内。

稀疏初始化通过显著减少非零权重的数量,有助于提高网络训练的效率和泛化能力。这种初始化方法特别适用于那些输入特征非常多但只有少数特征是重要的情况,如在处理高维稀疏数据时。通过减少模型的参数数量,稀疏初始化也有助于防止过拟合。

7. LSUV初始化

LSUV初始化是一种逐层初始化方法,旨在确保神经网络的每一层在初始化时都有单位方差。这种方法特别适用于深层网络,可以有效避免训练过程中的梯度问题。

LSUV初始化首先随机初始化权重,然后逐层调整权重,直到每层的输出方差接近1。这通常通过将层的输出与其标准差的倒数相乘来实现。这种方法确保了每层的激活值分布保持一致,有助于稳定和加速训练过程。

如果网络层 l的输出是o_{l},那么LSUV会调整该层的权重 W_{l},使得o_{l}的方差 Var\left(o_l\right)接近1。

LSUV初始化通过调整每层的权重以达到单位方差,有助于防止梯度消失或爆炸,特别是在深层网络中。这种初始化方法对于使用ReLU及其变体的激活函数特别有用。

为了进行可视化,我们需要定义一个未训练的神经网络模型,并在训练之前使用LSUV初始化方法对其进行初始化。初始化后,我们可以通过前向传播一批输入数据并可视化每一层输出的激活分布,以展示LSUV初始化的效果。在这个示例中,我将使用TensorFlow和Keras来构建模型。然后,我们将通过可视化每一层的输出来展示初始化后的激活分布。实现如下:

import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
import numpy as np
import matplotlib.pyplot as pltdef create_model():model = Sequential([Dense(64, activation='relu', input_shape=(100,)),Dense(64, activation='relu'),Dense(10, activation='softmax')])return modeldef lsuv_initialization(layer, batch_input):weights = layer.get_weights()if len(weights) > 0:activation_model = tf.keras.Model(inputs=model.input, outputs=layer.output)activations = activation_model.predict(batch_input)std_dev = np.std(activations)if np.abs(std_dev - 1) > 0.1:scale = 1 / std_devnew_weights = [w * scale for w in weights]layer.set_weights(new_weights)activations = activation_model.predict(batch_input)  # Recompute activationsreturn activationsmodel = create_model()
batch_input = np.random.randn(100, 100)activations = []
for layer in model.layers:layer_activations = lsuv_initialization(layer, batch_input)activations.append(layer_activations)# Plot the histogram of activations for each layer in a single figure
plt.figure(figsize=(12, 8))
for i, layer_activations in enumerate(activations):plt.subplot(1, len(activations), i+1)plt.hist(layer_activations.flatten(), bins=50)plt.title(f'Layer {i+1}')plt.xlabel('Activation Value')if i == 0:plt.ylabel('Frequency')
plt.tight_layout()
plt.show()
代码运行结果如下:
图片[7]-深度学习模型九大经典初始化方案-VenusAI
图7 运行结果

8. Delta-正交初始化

Delta-正交初始化是一种特别为卷积网络设计的权重初始化方法。它是正交初始化的一个变体,专门针对卷积层的结构进行了优化。这种初始化方法通过保持卷积核的正交性,有助于在训练深度卷积网络时保持梯度的稳定性。

在实现Delta-正交初始化时,需要确保卷积核的每个切片是正交的。这通常通过在卷积核的每个切片上应用奇异值分解(SVD)并使用得到的正交矩阵来实现。这种方法特别适用于具有ReLU激活函数的深度卷积网络。

对于一个给定的卷积核,其形状为 h\times w\times n_\mathrm{in~}\times n_\mathrm{out},其中 h 和 w 是卷积核的高度和宽度,n_{\mathrm{in}} 是输入通道数, n_{\mathrm{out}} 是输出通道数。Delta-正交初始化确保卷积核在 h\times w\times n_\mathrm{in} 维空间中的每个 n_{\mathrm{out}} 维切片是正交的。

Delta-正交初始化有助于在训练过程中保持卷积层输出的特征图的多样性,从而防止梯度消失或爆炸,特别是在深层卷积网络中。这种方法尤其适用于处理复杂的视觉任务,例如图像分类和对象检测。

由于Delta-正交初始化专为卷积层设计,因此它不适用于全连接层或其他类型的层。你可以在具备相应库(如TensorFlow或PyTorch)的环境中根据上述描述实现Delta-正交初始化。

9. 自适应初始化方法

自适应初始化方法,如 MetaInit,使用算法自动确定最佳的初始化参数。这种方法的核心思想是在模型的训练初期,通过优化一个小的数据集上的训练损失来确定初始化参数。这有助于为特定的网络结构找到合适的初始化方式。

MetaInit等自适应初始化方法通常涉及到以下步骤:

  1. 随机初始化:首先随机初始化网络权重。
  2. 小批量前向传播:使用一个小批量的训练数据进行前向传播。
  3. 损失优化:基于前向传播的结果,通过优化算法(如梯度下降)调整初始化参数,以最小化训练损失。
  4. 迭代更新:重复这个过程多次,直到找到一组使得模型在这个小数据集上表现良好的初始化参数。

自适应初始化方法通过根据具体模型和数据动态调整初始化参数,可以显著提高模型训练的起始性能,尤其是在复杂的模型或不常见的架构中。需要注意的是,这种方法需要额外的计算步骤来确定初始化参数,可能增加模型设置的复杂性。此外,自适应初始化的效果可能依赖于所选择的小批量数据的代表性。

自适应初始化方法是一个不断发展的领域,随着深度学习领域的发展,可能会出现更多高级的自适应初始化技术。

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

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

相关文章

HTTPS是什么,那些行业适合部署呢?

随着在线活动的增加,对您共享的关键数据的威胁已经产生了严重的后果,包括欺诈性金融交易、在线身份盗窃等。此外,随着技术使用的增加,网络攻击也变得更加复杂和具有挑战性。 毫无疑问,互联网用户的数据安全意识成倍增长…

友思特应用 | 轻装上阵:便携式光谱仪,助力食品安全的便捷保障

欢迎访问官网了解更多:智能化手持光谱仪 | Linksqaure光谱仪 | 近红外便携式光谱仪 | 价液体检测台 | 广州友思特科技有限公司 导读 食品安全是一个备受瞩目的话题。在消费电子和光子学的进步推动下,手持式光学仪器可用于食品安全以及质量的评估&#x…

PaddleOCR CPU 文本文字识别 docker部署

需求: 需要把所有滑块图片的数据文字提取出来 启动服务 mkdir paddle cd paddle docker run -itd --name ppocr -v $PWD:/paddle --networkhost -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash docker exec -it ppocr bash …

蓝牙网关在智慧医疗的应用

蓝牙网关在智慧医疗的应用已经逐渐得到广泛关注。作为一种无线通信技术,蓝牙网关能够将各种蓝牙设备连接起来,实现数据传输和信息共享。在智慧医疗领域,蓝牙网关的应用不仅可以提高医疗服务的效率和质量,还可以为患者带来更好的医…

2024年Android开发陷入饱和,,面试杀手锏

背景介绍 现在是一个信息大爆炸的时代,互联网世界中存在着无数的数据。信息就是这个时代最宝贵的资源,拥有了资源就相当于。互联网是块风水宝地,里面藏了无数的宝藏!能不能挖到就看本事了。谁拥有了最全、最准确的信息&#xff0…

Jmeter 压测 —— 利用Docker分布式压测!

Jmeter分布式测试环境中有两个角色:Master 和 Slaves Master节点:向参与的Slaves节点发送测试脚本,并聚合Agent节点的执行结果。Slaves节点:接收并执行Master节点发送过来的测试脚本,并将执行结果返回给Master。 为什…

threejs展示glb模型

原模型为rvt模型 <template><div ref"threeJsContainer"class"three-js-container"></div> </template> <script> import { defineComponent } from "vue"; import * as THREE from "three"; import…

npm 私服以及使用

在工作中&#xff0c;公司有很多内部的包并不希望发布到npm官网仓库&#xff0c;因为可能涉及到一些私有代码不能暴露。对于前端来讲&#xff0c;这时就可以选择在公司内网搭建npm私有仓库。当前比较主流的几种解决方案&#xff1a;verdaccio、nexus、cnpm。大家可以按照自己的…

GEE遥感云大数据林业应用典型案例实践及GPT模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

SDWAN专线,解决银行网络搭建痛点

金融行业的不断发展和数字化转型&#xff0c;银行网络的搭建和管理面临着诸多挑战和痛点。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;专线作为一种创新的网络解决方案&#xff0c;为银行解决了诸多网络搭建痛点&#xff0c;…

【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题

摘要 当在uni-app中进行iOS打包时&#xff0c;有时会遇到profile文件与私钥证书不匹配的问题。本文将介绍如何解决这一问题&#xff0c;以及相关的技术细节和操作步骤。 引言 在uni-app开发过程中&#xff0c;iOS打包是一个常见的操作。然而&#xff0c;有时会出现profile文…

【vue.js】文档解读【day 2】 | 响应式基础

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 响应式基础声明响应式状态(属性)响应式代理 vs 原始值声明方法深层响应性DOM 更新时机有状态方法 响应式…

NineData云原生智能数据管理平台新功能发布|2024年2月版

SQL开发&#xff1a;全功能支持百度云 GaiaDB 介绍&#xff1a;支持通过 SQL 开发所有能力管理 GaiaDB 实例。更多信息&#xff0c;请参见&#xff1a;真香&#xff01;NineData SQL 开发全面适配 GaiaDB 场景&#xff1a;企业使用 GaiaDB 管理企业数据&#xff0c;需要一个一…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

【Android】位置修改相关

获取位置服务总开关状态 //获取LOCATION_MODE值&#xff0c;但adb状态下无法获取 //0为关闭&#xff0c;1 gps、2 network、3 高精度等 int state Settings.Secure.getInt(mContext.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_HIGH_…

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.MongoDbHelper封装 /*** MongoDB Operation class* author HyoJung* date …

进程的奥德赛:并发世界中的核心概念与动态管理

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

力扣hot10---大根堆+双端队列

题目&#xff1a; 大根堆思路&#xff1a; 维护最大值&#xff0c;应该首先想到大根堆。C中对应着priority_queue&#xff0c;这里用pair<int,int>来记录对应的值和在nums中的索引。所以有priority_queue<pair<int,int>> q。在大根堆中&#xff0c;用q.top()…

【框架学习 | 第一篇】一篇文章读懂MyBatis

文章目录 1.Mybatis介绍1.1Mybatis历史1.2Mybatis特点1.3与其他持久化框架对比1.4对象关系映射——ORM 2.搭建Mybatis2.1引入依赖2.2创建核心配置文件2.3创建表、实体类、mapper接口2.4创建映射文件2.4.1映射文件命名位置规则2.4.2编写映射文件2.4.3修改核心配置文件中映射文件…