《机器学习》读书笔记:总结“第5章 神经网络”中的概念

news2024/9/23 17:23:01

💠神经网络(neural network)

神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。

神经网络中最基本的成分是 神经元(neuron / unit),即上述定义的 “简单单元”。

💠神经元

在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个 “阈值”(threshold / bias), 那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。

💠M-P 神经元模型

[McCulloch and Pitts, 1943] 将上述情形抽象为 “M-P 神经元模型” :
在这里插入图片描述
在这个模型中, 神经元接收到来自 n 个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过 “激活函数” (activation function) 处理以产生神经元的输出。

💠激活函数:阶跃函数

在这里插入图片描述

💠激活函数:Sigmoid函数(S形函数)

由于阶跃函数具有 不连续不光滑 等不太好的性质。因此实际常用Sigmoid函数作为激活函数:
在这里插入图片描述

💠感知机(perceptron)

感知机由两层神经元组成:

  • 输入层:接收外界输入信号后传递给输出层。
  • 输出层:一个 M-P神经元。

在这里插入图片描述

感知机表示 “与”、“或”、“非” 运算:

感知机可以容易地实现 运算:
对于 y = f ( ∑ i ω i x i − θ ) y=f(\sum_i\omega_ix_i-\theta) y=f(iωixiθ) 且假定其中的 f f f 是阶跃函数:

要表示的逻辑运算数学表示所用的权重与阈值备注
x 1 ∧ x 2 x_1\land x_2 x1x2 ω 1 = ω 2 = 1 , θ = 2 \omega_1=\omega_2=1,\theta=2 ω1=ω2=1,θ=2仅在 x 1 = x 2 = 1 x_1=x_2=1 x1=x2=1 y = 1 y=1 y=1
x 1 ∨ x 2 x_1\lor x_2 x1x2 ω 1 = ω 2 = 1 , θ = 0.5 \omega_1=\omega_2=1,\theta=0.5 ω1=ω2=1,θ=0.5 x 1 = 1 x_1=1 x1=1 或 $ x_2=1$ 时 y = 1 y=1 y=1
¬ x 1 \lnot x_1 ¬x1 ω 1 = − 0.6 , ω 2 = 0 , θ = − 0.5 \omega_1=-0.6, \omega_2=0,\theta=-0.5 ω1=0.6,ω2=0,θ=0.5 x 1 = 1 x_1=1 x1=1 y = 0 y=0 y=0 x 1 = 0 x_1=0 x1=0 y = 1 y=1 y=1

感知机的学习

权重 ω i ( i = 1 , 2 , . . . , n ) \omega_i(i=1,2,...,n) ωi(i=1,2,...,n) 以及阈值 θ \theta θ 可通过学习得到。

阈值 θ \theta θ 可以看作是一个固定输入值为 -1.0 的 “哑结点(dummy node)”所对应的连接权重 ω n + 1 \omega_{n+1} ωn+1
即:
ω 1 ⋅ x 1 + ω 2 ⋅ x 2 + . . . + ω n ⋅ x n − θ = ω 1 ⋅ x 1 + ω 2 ⋅ x 2 + . . . + ω n ⋅ x n + ω n + 1 ⋅ ( − 1.0 ) \begin{alignedat}{3} & \omega_1 \cdot x_1+\omega_2\cdot x_2 +...+\omega_n\cdot x_n-\theta \\ =& \omega_1 \cdot x_1+\omega_2\cdot x_2 +...+\omega_n\cdot x_n+\omega_{n+1}\cdot(-1.0) \\ \end{alignedat} =ω1x1+ω2x2+...+ωnxnθω1x1+ω2x2+...+ωnxn+ωn+1(1.0)

所以,“权重和阈值的学习” 可以统一为 “权重的学习”。

感知机的学习规则非常简单,对于训练样本 ( x , y ) (\bold{x},y) (x,y) ,若当前感知机的输出为 y ^ \hat{y} y^ 则感知机这样调整:
ω i ← ω i + Δ ω i 其中 Δ ω i = η ( y − y ^ ) x i \omega_i \leftarrow \omega_i+\Delta\omega_i \\ 其中\Delta\omega_i=\eta(y-\hat{y})x_i ωiωi+Δωi其中Δωi=η(yy^)xi

其中 η ∈ ( 0 , 1 ) \eta \in(0,1) η(0,1) 称为 学习率(learning rate)。通常设置为一个小的正数比如 0.1 。

💠线性可分问题(linearly separable)

线性可分:存在一个线性超平面能分开。
比如刚才提到的 运算:
在这里插入图片描述

异或运算是非线性可分问题:
在这里插入图片描述

💠多层神经网络

感知机只拥有一层有激活函数的神经元(另一层是输入层)。其学习能力十分有限。实际上,对于 “线性可分” 问题,感知机的学习过程一定会 收敛(converge),最终求得稳定的权重值。但对于 “非线性可分” 问题,感知机的学习过程不能收敛,会发生 振荡(fluctuation),难以求得稳定的权重值。

要解决非线性可分问题,需要考虑多层神经网络。

💠隐含层(hidden layer)

输出层和输入层之间的层被称为 隐含层(hidden layer)
隐含层和输出层神经元都是拥有激活函数的神经元。

表示“异或”运算的网络

在这里插入图片描述

💠多层前馈神经网络(multi-layer feedforward neural network)

更一般的,常见的神经网络如图所示:
在这里插入图片描述
每层神经元与下层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为 “多层前馈神经网络”。
(其中的 “前馈” 并不意味着网络中的信号不能向后传,而是指网络拓扑结构上不存在 “环” 或 “回路”)

💠误差逆传播(error BackPropagation,简称BP)算法

多层网络学习能力比单层的感知机强得多,但需要更强大的学习算法。误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法。下面解释这个算法。


给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(\bold{x}_1,\bold{y}_1),(\bold{x}_2,\bold{y}_2),...,(\bold{x}_m,\bold{y}_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)}
每个输入示例 x k \bold{x}_k xk d d d 个属性描述,即 x k = { x 1 k , x 2 k , . . . , x d k } \bold{x}_k=\{x^k_1,x^k_2,...,x^k_d\} xk={x1k,x2k,...,xdk}
对应的每个输出示例 y k \bold{y}_k yk l l l 维实值向量,即 k i = { y 1 k , y 2 k , . . . , y l k } \bold{k}_i=\{y^k_1,y^k_2,...,y^k_l\} ki={y1k,y2k,...,ylk}

下面给出一个拥有 d d d 个输入神经元, l l l 个输出神经元, q q q 个隐层神经元 的多层前馈神经网络:
在这里插入图片描述
其中:
θ j \theta_j θj 表示输出层第 j j j 个神经元的阈值。
γ h \gamma_h γh 表示隐层第 h h h 个神经元的阈值。
ω h j \omega_{hj} ωhj 表示隐层第 h h h 个神经元与输出层第 j j j 个神经元的连接权重。
v i h v_{ih} vih 表示输入层第 i i i 个神经元与隐层第 h h h 个神经元的连接权重。
然后:
β j \beta_j βj 表示输出层第 j j j 个神经元接收到的输入,即 β j = ∑ h = 1 q ω h j b h \beta_j=\sum_{h=1}^q \omega_{hj}b_h βj=h=1qωhjbh
α h \alpha_h αh 表示隐层第 h h h 个神经元接收到的输入,即 α h = ∑ i = 1 d v i h x i \alpha_h=\sum_{i=1}^dv_{ih}x_i αh=i=1dvihxi
也就是说,在计算上面的神经元时:
y j = f ( β j − θ j ) y_j=f(\beta_j-\theta_j) yj=f(βjθj)
b h = f ( α h − γ h ) b_h=f(\alpha_h-\gamma_h) bh=f(αhγh)


上述神经网络里一共要学习的参数有:

  • l l l 个输出层神经元的阈值。即 θ j \theta_j θj
  • q q q 个隐层神经元的阈值。即 γ h \gamma_h γh
  • 隐层到输出层的 q × l q\times l q×l 个权重值。即 ω h j \omega_{hj} ωhj
  • 输入层到隐层的 d × q d\times q d×q 个权重值。即 v i h v_{ih} vih

BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计。与感知机类似,任意参数 v v v 的更新估计式为:
v ← v + Δ v v \leftarrow v+\Delta v vv+Δv

BP算法基于 梯度下降(gradient descent) 策略,以目标的负梯度方向对参数进行调整。即对于误差 E k E_k Ek 和学习率 η \eta η ,有:
Δ v = − η ∂ E k ∂ v \Delta v=-\eta\frac{\partial E_k}{\partial v} Δv=ηvEk


假设隐层和输出层的神经元都使用了 s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\frac{1}{1+e^{-x}} sigmoid(x)=1+ex1 作为激活函数 f f f

对于训练集 ( x k , y k ) (\bold{x}_k,\bold{y}_k) (xk,yk),假设神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , . . . , y ^ l k ) \hat{\bold{y}}_k=(\hat{y}_1^k,\hat{y}_2^k,...,\hat{y}_l^k) y^k=(y^1k,y^2k,...,y^lk),即
y ^ j k = f ( β j − θ j ) \hat{y}^k_j=f(\beta_j-\theta_j) y^jk=f(βjθj)

而网络在 ( x k , y k ) (\bold{x}_k,\bold{y}_k) (xk,yk) 上的均方误差为:(下面式子的 1 2 \frac{1}{2} 21 没有特别的意义,可加可不加,加了后只是让求导的结果少了个系数,表示上更优雅而已)
E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 E_k=\frac{1}{2} \sum_{j=1}^l(\hat{y}^k_j-y^k_j)^2 Ek=21j=1l(y^jkyjk)2

则可以求得,各个参数的更新公式为:
Δ ω h j = η g j b h Δ θ j = − η g j Δ v i h = η e h x i Δ γ h = − η e h 其中: g j = y ^ j k ( 1 − y ^ j k ) ( y j k − y ^ j k ) e h = b h ( 1 − b h ) ∑ j = 1 l ω h j g j \Delta\omega_{hj}=\eta g_jb_h \\ \Delta\theta_j=-\eta g_j \\ \Delta v_{ih}=\eta e_hx_i \\ \Delta\gamma_h=-\eta e_h \\ 其中:\\ g_j=\hat{y}^k_j(1-\hat{y}^k_j)(y^k_j-\hat{y}^k_j)\\ e_h=b_h(1-b_h)\sum^l_{j=1}\omega_{hj}g_j Δωhj=ηgjbhΔθj=ηgjΔvih=ηehxiΔγh=ηeh其中:gj=y^jk(1y^jk)(yjky^jk)eh=bh(1bh)j=1lωhjgj


算法:

在(0,1)范围内随机初始化网络中的所有权重和阈值
repeat
····for all ( x k , y k ) ∈ D (\bold{x}_k,\bold{y}_k) \in D (xk,yk)D do
········计算出当前样本的输出 y ^ k \hat{\bold{y}}_k y^k
········计算出 l l l g j g_j gj
········计算出 q q q e h e_h eh
········更新 θ j \theta_j θj γ h \gamma_h γh ω h j \omega_{hj} ωhj v i h v_{ih} vih
····end for
until 达到停止条件(比如训练误差已经达到一个很小的值)

上面介绍的是“标准BP算法”,每次针对一个样例更新参数。
“累计BP算法”:针对累计误差进行更新,即读取整个训练集一遍后才进行一轮更新。

如何设置隐层神经元的个数仍是未决的问题,实际中通常靠 “试错法”(trail-by-error) 调整。

💠缓解过拟合的策略:早停(early stopping)

将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差。若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。

💠缓解过拟合的策略:正则化(regularization)

在误差目标函数中增加一个 “用于描述网络复杂度的部分”,比如“连接权与阈值的平方和”。令 ω i \omega_i ωi 表示连接权和阈值。则误差目标函数变为:
E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i ω i 2 E=\lambda\frac{1}{m}\sum^m_{k=1}E_k+(1-\lambda)\sum_i\omega_i^2 E=λm1k=1mEk+(1λ)iωi2
其中 λ ∈ ( 0 , 1 ) \lambda\in(0,1) λ(0,1) 用于对“经验误差”与“网络复杂度”这两项折中,常通过交叉验证法来估计。

💠“全局最小” 与 “局部极小”

若用 E E E 表示神经网络在训练集上的误差,则它显然是关于 “连接权 w \boldsymbol{w} w” 和 “阈值 θ \theta θ” 的函数。那么神经网络的训练过程可以看作是一个参数寻优的过程,即在参数空间中,寻找一组最优参数使得 E E E 最小。

两种“最优”:“全局最小(global minimum)” 和 “局部极小(local minimum)”:
在这里插入图片描述
可能存在多个“局部极小”,但只会有一个“全局最小”。显然,我们希望找到“全局最小”。

基于梯度的搜索是使用最为广泛的参数寻优方法。负梯度就是函数下降最快的方向,因此梯度下降法就是沿着负梯度寻找最优解,最终抵达梯度为零的局部极小,更新量为零,即停止。显然,如果误差函数仅有一个局部极小,则此时找到的局部极小就是全局最小。然而,如果误差函数有多个局部极小,则不能保证我们找到了全局最小,此时我们称“陷入”了局部极小,这显然不是我们希望的。

人们常采用以下策略来试图“跳出”局部极小,从而接近全局最小:

  • 以多组参数初始化多个网路。最后选择最小的。
  • “模拟退火”(simulated annealing):每一步都以一定概率接收比当前解更差的结果(但是概率应该逐渐降低,从而让算法稳定)
  • 使用随机梯度下降:在计算梯度时加入随机因素。
  • 遗传算法

需要注意,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。

其他常见神经网络

(笔者注:原文此处介绍的比较简略,有很多名词我无法理解,所以这里仅保留名字,不做更多记录)

  • RBF(Radial Basis Function,径向基函数)网络
  • ART(Adaptive Resonance Theory,自适应谐振理论)网络。一种竞争学习型无监督神经网络。
  • SOM(Self-Organizing Map,自组织映射)网络。一种竞争学习型无监督神经网络。
  • 级联相关(Cascade-Correlation)网络。是结构自适应网络的重要代表。
  • Elman网络是最常用的 “递归神经网络”(允许网络中出现环形结构)
  • Boltzmann机,是一种“基于能量的模型”,现实中常采用 “受限Boltzmann机”(Restricted Boltzmann Machine,简称RBM)

💠深度学习

典型的深度学习模型就是很深层的神经网络。

虽然模型复杂度可以通过单纯增加隐层神经元数目来实现,但是从增加模型复杂度的角度来看,“增加隐层数目” 显然比 “增加隐层神经元数目” 更有效,因为这还增加了激活函数嵌套的层数。

然而,多隐层神经网络难以直接用经典算法(例如标准BP算法)进行训练,因为误差在多隐层内逆传播时,往往会 “发散(diverge)” 而不能收敛到稳定状态。

多隐层神经网络的训练策略:

  • 无监督逐层学习(unsupervised layer-wise training):每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为"预训练" (pre-training);在顶训练全部完成后,再对整个网络进行"微调" (fine-tuning)训练。
    • 例如在深度信念网络(deep belief network,简称DBN),每层都是一个 “受限Boltzmann机”(Restricted Boltzmann Machine)。
  • 权共享(weight sharing):让一组神经元使用相同的连接权。
    • 这个策略在 “卷积神经网络”(Convolutional Neural Network,简称CNN)中发挥了重要作用。

💠卷积神经网络(Convolutional Neural Network,简称CNN)

以 [LeCun et al., 1998] 《Gradient-based learning applied to document recognition》 中用CNN进行手写文字识别任务为例。
在这里插入图片描述
在这里插入图片描述
这里结合原论文的描述对每一层解释:

  • 输入层: 32 × 32 32\times32 32×32 像素的图像。
  • 卷积层C1:我们使用的卷积核的大小为 5×5。由于输入图片每行有32个像素,所以卷积后每行有32-5+1=28个值。即卷积后是有28×28个值的 特征映射(feature map,也成为特征图),这样特征图的每个值对应输入给一个神经元,所以共有28×28个神经元。需要注意,“权共享”意味着,这28×28个神经元将共享一个权重值。对于C1这一层,我们使用了6个特征图。所以在C1层总共需要训练的参数数量为:6个特征图×(卷积核中5×5个权重+1个阈值)=156。
  • 采样层S2:采样层亦称为 “汇合” (pooling)层,其作用是基于局部相关性原理进行亚采样,从而在减少数据量的同时保留有用信息。对于S2这一层,它其中的每个神经元对应于输入的2×2邻域,所以长宽都是输入的一半,即14×14。同样,“权共享”意味着,这14×14个神经元将共享一个权重值和阈值。所以在S2层总共需要训练的参数数量为:6个特征图×(1个权重+1个阈值)=12。
  • 卷积层C3。同样使用大小为5×5的卷积核。卷积后是10×10大小的特征映射。使用16个特征图。但是需要注意,并非输入的S2的6个特征图每个都与C3的16个特征图的每个相连。实际是这样:在这里插入图片描述
    即:前6个从S2中三个相邻的特征图获取输入。接下来的6个从S2中四个相邻的特征图获取输入。接下来的3个从四个特征图的不连续子集获取输入。最后1个从S2中所有特征图获取输入。数一数上图的X的个数,总共60个,即60个卷积核。所以在C3层总共需要训练的参数数量为:卷积核中5×5个权重×60个卷积核+16个阈值=1516。
  • 采样层S4。类似S2,长宽都是输入的一半,即5×5。在S4层总共需要训练的参数数量为:16个特征图×(1个权重+1个阈值)=32。
  • 卷积层C5。同样使用大小为5×5的卷积核,由于输入的S4的特征图的尺寸也是5×5,所以C5的特征图的尺寸变为了1×1。C5由120个特征图构成,与S4全连接。所以C5层总共需要训练的参数数量为:卷积核中5×5个权重×120×16+120个阈值=48120。
  • 连接层F6。由84个神经元构成(为什么数目是84,原文有解释),与C5全连接。所以F6层总共需要训练的参数数量为:120×84个权重+84个阈值=10164。

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

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

相关文章

机械臂泡水维修|机器人雨后进水维修措施

如果机器人不慎被水淹,别慌!我们为你准备了一份紧急的机械臂泡水维修抢修指南,帮助你解决这个问题。 【机器人浸水被淹后紧急维修抢修|如何处理?】 机械臂被淹进水后维修处理方式 1. 机械手淹水后断电断网 首先&am…

Hive分布式SQL计算平台

Hive分布式SQL计算平台 一、Hive 概述二、Hive架构三、Hive客户端 1、Hive有哪些客户端可以使用2、Hive第三方客户端 四、Hive使用语法 1、数据库操作2、内部表,外部表3、数据的导入与导出4、分区表5、分桶表6、复杂类型操作7、数据抽样8、Virtual Columns 虚拟列9…

压缩视频大小的方法 怎么减少视频内存大小 几个简单方法

随着4K、8K高清视频的流行,我们越来越容易遇到视频文件体积过大,导致存储空间不足、传输速度缓慢等问题。视频压缩成为解决这一问题的有效途径,但如何在减小文件大小的同时,保证视频质量不受影响呢?本文将为你揭晓答案…

(10)深入理解pandas的核心数据结构:DataFrame高效数据清洗技巧

目录 前言1. DataFrame数据清洗1.1 处理缺失值(NaNs)1.1.1 数据准备1.1.2 读取数据1.1.3 查找具有 null 值或缺失值的行和列1.1.4 计算每列缺失值的总数1.1.5 删除包含 null 值或缺失值的行1.1.6 利用 .fillna() 方法用Portfolio …

OpenCV Mat类简介,Mat对象创建与赋值 C++实现

在 C 中,OpenCV 提供了一个强大的类 Mat 来表示图像和多维矩阵。Mat 类是 OpenCV 中最基础和最常用的类,用于存储和操作图像数据。 文章目录 Mat类简介Mat 类的定义Mat 类的构造函数 代码示例深拷贝示例赋值示例浅拷贝示例 Mat类简介 Mat 类是一个多维…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…

ChatGPT实战100例 - (20) 如何玩转影刀RPA

文章目录 ChatGPT实战100例 - (20) 如何玩转影刀RPA背景需求需求分析与流程设计一、需求收集二、流程梳理三、可行性分析流程设计(详细步骤)具体步骤的影刀RPA实现流程图总结AIGC在影刀RPA中的使用总结其他RPA步骤中可能用到AIGC的地方展望总结ChatGPT实战100例 - (20) 如何玩…

EasyExcel相关

1. easyexcel–100M EasyExcel是一个基于Java的使用简单、节省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 节省内存的原因:在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据&#xff0c…

深度学习之基础知识整理

现在大语言模型很火,但它的基础仍然是以神经网络为基础的深度学习,不懂神经网络,不了解深度学习,对于大语言模型的二次开发也是整不明白。 那到底需要了解哪些知识?才能看懂深度学习/神经网络的基础模型,想…

后端传递中文到前端 乱码问题

后端代码 前端 乱码 decodeURI(name);使用这个方法,这个方法应该是jquery中的方法 这样就不乱码了

Pointnet++改进即插即用系列:全网首发WTConv2d大接受域的小波卷积|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入WTConv2d,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…

JVM:垃圾回收器演进

文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah并发执行大部分GC工作,包括并发的整理,堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…

MySQL数据库基本用法

了解数据库基本概念 什么是数据库? • 长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库” MySQL数据库的特点 • 开源免费,小巧但功能齐全 • 可在Windows和Linux系统上运行 • 操作方便,…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本,它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下: IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

记录解决springboot项目上传图片到本地,在html里不能回显的问题

项目场景: 项目场景:在我的博客系统里:有个相册模块:需要把图片上传到项目里,在html页面上显示 解决方案 1.建一个文件夹 例如在windows系统下。可以在项目根目录下建个photos文件夹,把上传的图片文件…

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰,是一个常见的汉字,其拼音为“ch”,音调为第四声。它既可以表示动词,也可以表示形容词或副词,意义广泛,经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…

WSL2 Centos7 Docker服务启动失败怎么办?

wsl 安装的CentOS7镜像,安装了Docker之后,发现用systemctl start docker 无法将docker启动起来。 解决办法 1、编辑文件 vim /usr/lib/systemd/system/docker.service将13行注释掉,然后在下面新增14行的内容。然后保存退出。 2、再次验证 可以发现,我们已经可以正常通过s…

C++笔试练习笔记【3】:Fibonacci数列 WY22

文章目录 Fibonacci数列分析题目代码实现 Fibonacci数列 分析题目 首先我们可以通过三个变量进行移动来形成Fibonacci数列 其次我们通过最前面的变量与N进行比较从而固定数列 之后N和左右两个变量做差取最小值即可 代码实现 #include <iostream> using namespace std;…

pcdn技术如何降低网络延迟

PCDN技术通过以下方式降低网络延迟: 1.动态调度与负载均衡: PCDN通过在CDN的边缘节点上部署代理服务器&#xff0c;能够动态地调度和传输内容。当用户请求内容时&#xff0c; PCDN会根据各个节点的负载情况、距离、传输速度等因素来动态选择最优的节点来提供内容。这种动态调…

大语言模型-文本检索任务基准 BEIR

BEIR (A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models) 文本检索任务的基准&#xff0c;使用18 个数据集为检索系统的零样本评估提出了一个标准化基准&#xff0c; BEIR 基准上在9个不同领域的检索任务评估 10 种不同的检索方法。 九个…