torch.nn.MSELoss扒开看看它

news2024/10/6 1:34:22

目录

  • 官网介绍
  • Toy
    • 默认参数
    • 定制参数
  • 预测问题-线性回归

官网介绍

请添加图片描述

Toy

X , Y ∈ R n × d \mathbf{X} , \mathbf{Y} \in \mathbf{R}^{n\times d} X,YRn×d,假设其中 X \mathbf{X} X是模型的输入, Y \mathbf{Y} Y是真实标签

默认参数

torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
如果在模型训练中直接使用MSELoss,即

loss = torch.nn.MSELoss()
loss = loss(X, Y)
print(loss)
loss.backward()
print(X.grad)

l o s s = 1 n × d ∣ ∣ X − Y ∣ ∣ 2 loss = \frac{1} {n\times d}||X-Y||^2 loss=n×d1∣∣XY2
X . g r a d = ∂ l o s s ∂ X = ∂ 1 n × d ∣ ∣ X − Y ∣ ∣ 2 ∂ X = 2 n × d ( X − Y ) X.grad = \frac{\partial loss}{\partial X} = \frac{\partial \frac{1} {n\times d}||X-Y||^2}{\partial X}=\frac{2}{n\times d}(\mathbf{X}-\mathbf{Y}) X.grad=Xloss=Xn×d1∣∣XY2=n×d2(XY) ,范数求导参考1

例如
X = [ 3 1 4 2 5 3 ] , Y = [ 2 2 1 4 6 2 ] ⇒ l o s s = 1 3 × 2 ∥ 3 − 2 1 − 2 4 − 1 2 − 4 5 − 6 3 − 2 ∥ 2 = 17 / 6 = 2.8333 \mathbf{X}=\begin{bmatrix} 3 & 1\\ 4 & 2\\ 5 & 3 \end{bmatrix}, \mathbf{Y}=\begin{bmatrix} 2 & 2 \\ 1 & 4 \\ 6 & 2 \end{bmatrix} \Rightarrow loss = \frac{1}{3\times2}\begin{Vmatrix} 3-2 & 1-2\\ 4-1 & 2-4\\ 5-6 & 3-2 \end{Vmatrix}^2=17/6=2.8333 X= 345123 ,Y= 216242 loss=3×21 324156122432 2=17/6=2.8333
X . g r a d = 2 3 × 2 [ 3 − 2 1 − 2 4 − 1 2 − 4 5 − 6 3 − 2 ] = 1 3 [ 1 − 1 3 − 2 − 1 − 1 ] X.grad = \frac{2}{3\times2}\begin{bmatrix} 3-2 & 1-2\\ 4-1 & 2-4\\ 5-6 & 3-2 \end{bmatrix}= \frac{1}{3}\begin{bmatrix} 1 & -1\\ 3 & -2\\ -1 & -1 \end{bmatrix} X.grad=3×22 324156122432 =31 131121
代码实现

import torch
X = torch.tensor([[3, 1], [4, 2], [5, 3]], dtype=torch.float, requires_grad=True)
Y = torch.tensor([[2, 2], [1, 4], [6, 2]], dtype=torch.float)
loss = torch.nn.MSELoss()
loss = loss(X, Y)
loss.backward()
print(loss)
# tensor(2.8333, grad_fn=<MseLossBackward0>)
print(X.grad)
#tensor([[ 0.3333, -0.3333],
#        [ 1.0000, -0.6667],
#        [-0.3333,  0.3333]])

定制参数

torch.nn.MSELoss(reduction='sum')
如果在模型训练中使用MSELoss(reduction='sum'),即

loss = torch.nn.MSELoss(reduction='sum')
loss = loss(X, Y)
print(loss)
loss.backward()
print(X.grad)

l o s s = ∣ ∣ X − Y ∣ ∣ 2 loss =||X-Y||^2 loss=∣∣XY2
X . g r a d = ∂ l o s s ∂ X = ∂ ∣ ∣ X − Y ∣ ∣ 2 ∂ X = 2 ( X − Y ) X.grad = \frac{\partial loss}{\partial X} = \frac{\partial ||X-Y||^2}{\partial X}=2(\mathbf{X}-\mathbf{Y}) X.grad=Xloss=X∣∣XY2=2(XY)

例如
X = [ 3 1 4 2 5 3 ] , Y = [ 2 2 1 4 6 2 ] ⇒ l o s s = ∥ 3 − 2 1 − 2 4 − 1 2 − 4 5 − 6 3 − 2 ∥ 2 = 17 \mathbf{X}=\begin{bmatrix} 3 & 1\\ 4 & 2\\ 5 & 3 \end{bmatrix}, \mathbf{Y}=\begin{bmatrix} 2 & 2 \\ 1 & 4 \\ 6 & 2 \end{bmatrix} \Rightarrow loss = \begin{Vmatrix} 3-2 & 1-2\\ 4-1 & 2-4\\ 5-6 & 3-2 \end{Vmatrix}^2=17 X= 345123 ,Y= 216242 loss= 324156122432 2=17
X . g r a d = 2 [ 3 − 2 1 − 2 4 − 1 2 − 4 5 − 6 3 − 2 ] = [ 2 − 2 6 − 4 − 2 − 2 ] X.grad = 2\begin{bmatrix} 3-2 & 1-2\\ 4-1 & 2-4\\ 5-6 & 3-2 \end{bmatrix}= \begin{bmatrix} 2 & -2\\ 6 & -4\\ -2 & -2 \end{bmatrix} X.grad=2 324156122432 = 262242
代码实现

import torch
X = torch.tensor([[3, 1], [4, 2], [5, 3]], dtype=torch.float, requires_grad=True)
Y = torch.tensor([[2, 2], [1, 4], [6, 2]], dtype=torch.float)
loss = torch.nn.MSELoss(reduction='sum')
loss = loss(X, Y)
loss.backward()
print(loss)
# tensor(17., grad_fn=<MseLossBackward0>)
print(X.grad)
#tensor([[ 2., -2.],
#        [ 6., -4.],
#        [-2.,  2.]])

预测问题-线性回归

为了解释线性回归,我们举一个实际的例子2: 我们希望根据房屋的面积(平方英尺)和房龄(年)来估算房屋价格(美元)。
使用 n n n来表示数据集中的样本数。对索引为 i i i的样本,其输入表示为 x ( i ) = [ x 1 ( i ) , x 2 ( i ) ] ⊤ \mathbf{x}^{(i)} = [x_1^{(i)}, x_2^{(i)}]^\top x(i)=[x1(i),x2(i)],其对应的标签是 y ( i ) y^{(i)} y(i)

线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:

p r i c e = w a r e a ⋅ a r e a + w a g e ⋅ a g e + b . \mathrm{price} = w_{\mathrm{area}} \cdot \mathrm{area} + w_{\mathrm{age}} \cdot \mathrm{age} + b. price=wareaarea+wageage+b.

给定一个数据集,我们的目标是寻找模型的权重 w = [ w 1 , w 2 ] \mathbf{w}=[w_1, w_2] w=[w1,w2]和偏置 b b b,使得根据模型做出的预测大体符合数据里的真实价格。

这里为了手算简单,我们使用的数据集有6个样本 X ∈ R 6 × 2 , y ∈ R 6 \mathbf{X}\in\mathbf{R}^{6\times 2},\mathbf{y}\in \mathbf{R}^6 XR6×2,yR6
X = [ 1 2 4 2 8 1 0 1 3 8 1 3 ] , y = [ 1 6 2 7 1 3 ] \mathbf{X}=\begin{bmatrix} 1 & 2\\ 4 & 2\\ 8 & 1\\ 0 & 1\\ 3 & 8\\ 1 & 3 \end{bmatrix},\mathbf{y}=\begin{bmatrix} 1 \\ 6\\ 2\\ 7\\ 1\\ 3 \end{bmatrix} X= 148031221183 y= 162713

麻雀虽小五脏俱全,我们将这6个样本分批训练,即batch_size = 3,同时为了复现上述的线性假设,我们使用nn.Linear(2, 1),即含有三个可学习的参数,分别是模型的权重 w = [ w 1 , w 2 ] \mathbf{w}=[w_1, w_2] w=[w1,w2]和偏置 b b b,我们初始化模型参数为 w 0 = [ 1 , 2 ] \mathbf{w_0}=[1, 2] w0=[1,2]和偏置 b 0 b_0 b0=0。这里也使用常用的优化算法stochastic gradient descent,即torch.optim.SGD()。进一步方便手算,我们使用的学习率lr = 0.5。训练之前的代码如下

import numpy as np
import torch
from torch.utils import data

# 为了手算理解内部计算过程,我们手动随便输入数据组成数据集
# 这里的数据集有6个数据样本,每个样本有两个特征
features = torch.tensor([[1, 2], [4, 2], [8, 1], [0, 1], [3, 8], [1, 3]], dtype=torch.float)
labels = torch.tensor([[1], [6], [2], [7], [1], [3]], dtype=torch.float)
# print(features, '\n', labels)

def load_array(data_arrays, batch_size, is_train=True): 
    """构造一个PyTorch数据迭代器"""
    # 布尔值is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

# 因为数据集有6个样本,所以这里批大小可以是3,为了理解而服务
batch_size = 3
data_iter = load_array((features, labels), batch_size)

# nn是神经网络的缩写
from torch import nn
# y = x_1*w_1 + x_2*w_2 + b
net = nn.Sequential(nn.Linear(2, 1))

# 手动初始化两个权重和偏置
net[0].weight.data = torch.tensor([[1, 2]], dtype=torch.float)
net[0].bias.data.fill_(0)
# print(net[0].weight.data, '\n', net[0].bias.data)

# 这里使用均方误差,即2范数的平方和,在训练迭代过程中要除以batch_size
loss=torch.nn.MSELoss(reduction='sum')

trainer = torch.optim.SGD(net.parameters(), lr=0.5)

训练过程:
在每个迭代周期里,我们将完整遍历一次数据集(train_data),不停地从中获取一个小批量的输入和相应的标签。对于每一个小批量,我们会进行以下步骤:

  • 通过调用net(X)生成预测并计算损失l(前向传播)。
  • 通过进行反向传播来计算梯度。
  • 通过调用优化器来更新模型参数。

为了更好的衡量训练效果,我们计算每个迭代周期后的损失,并打印它来监控训练过程。

# 训练周期为3
num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
#        print('X: ', X, ',y :', y)
#        print(len(y))
		# len(y)是批量大小,这里是为了让学习率与批量大小解耦 
        l = loss(net(X) ,y)/len(y)
#        print('l:', l)
        trainer.zero_grad()
        l.backward()
#        print('net[0].weight.data: ',net[0].weight.data,'\nnet[0].bias.data: ', net[0].bias.data)
#        print('w.grad: ', net[0].weight.grad, '\nb.grad: ', net[0].bias.grad)
        trainer.step()
        
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

每个训练周期中,因为 b a t c h _ s i z e = 3 batch\_size=3 batch_size=3,所以一共有 n / b a t c h _ s i z e = 6 / 3 n/batch\_size=6/3 n/batch_size=6/3个批次,假设 e p o c h 0 epoch \mathbf{0} epoch0的第一批抽取的3个样本组成的输入特征 X ∈ R 3 × 2 \mathbf{X}\in\mathbf{R}^{3\times 2} XR3×2和标签 y ∈ R 3 \mathbf{y}\in\mathbf{R}^3 yR3,分别(这里因为每批次的样本是从数据集中随机抽取的,所以具体运行因人而异)是 X = [ 1 3 4 2 1 2 ] , y = [ 3 6 1 ] \mathbf{X}=\begin{bmatrix} 1 & 3\\ 4 & 2\\ 1 & 2\\ \end{bmatrix}, \mathbf{y}=\begin{bmatrix} 3\\ 6\\ 1\\ \end{bmatrix} X= 141322 ,y= 361 ,则 l o s s = 1 ∣ b a t c h _ s i z e ∣ ∣ ∣ X w + b − y ∣ ∣ 2 = 1 3 ∥ [ 1 3 4 2 1 2 ] [ 1 2 ] + [ 0 0 0 ] − [ 3 6 1 ] ∥ 2 = 12 loss =\frac{1}{|\mathbf{batch\_size}|}||X\mathbf{w}+\mathbf{b}-y||^2=\frac{1}{3}\begin{Vmatrix} \begin{bmatrix} 1 & 3\\ 4 & 2\\ 1 & 2\\ \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix}+ \begin{bmatrix} 0\\ 0\\ 0 \end{bmatrix}- \begin{bmatrix} 3\\ 6\\ 1 \end{bmatrix} \end{Vmatrix}^2=12 loss=batch_size1∣∣Xw+by2=31 141322 [12]+ 000 361 2=12 w . g r a d = ∂ l o s s ∂ w = ∂ 1 ∣ b a t c h _ s i z e ∣ ∣ ∣ X w + b − y ∣ ∣ 2 ∂ w = 2 ∣ b a t c h _ s i z e ∣ X T ( X w + b − y ) = 2 3 [ 1 3 4 2 1 2 ] T ( [ 1 3 4 2 1 2 ] [ 1 2 ] + [ 0 0 0 ] − [ 3 6 1 ] ) = [ 32 3 16 ] \mathbf{w}.grad= \frac{\partial loss}{\partial \mathbf{w}} = \frac{\partial \frac{1}{|\mathbf{batch\_size}|}||X\mathbf{w}+\mathbf{b}-y||^2}{\partial \mathbf{w}}=\frac{2}{|\mathbf{batch\_size}|}X^{T}(X\mathbf{w}+\mathbf{b}-y)=\frac{2}{3}\begin{bmatrix} 1 & 3\\ 4 & 2\\ 1 & 2\\ \end{bmatrix} ^{T}(\begin{bmatrix} 1 & 3\\ 4 & 2\\ 1 & 2\\ \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix}+\begin{bmatrix} 0\\ 0\\ 0 \end{bmatrix}-\begin{bmatrix} 3\\ 6\\ 1 \end{bmatrix})=\begin{bmatrix} \mathbf{\frac{32}{3}}\\ \mathbf{16} \end{bmatrix} w.grad=wloss=wbatch_size1∣∣Xw+by2=batch_size2XT(Xw+by)=32 141322 T( 141322 [12]+ 000 361 )=[33216](这里偏置 b \mathbf{b} b使用了torch.tensor的广播机制3)。

值得注意的是 l o s s = 1 ∣ b a t c h _ s i z e ∣ ∣ ∣ X w + b − y ∣ ∣ 2 loss =\frac{1}{|\mathbf{batch\_size}|}||X\mathbf{w}+\mathbf{b}-y||^2 loss=batch_size1∣∣Xw+by2,这种形式是为了处理像这种多个维度的向量\矩阵,那么对于标量 b \mathbf{b} b而言, l o s s = 1 ∣ b a t c h _ s i z e ∣ ∣ ∣ X w + b − y ∣ ∣ 2 = 1 ∣ b a t c h _ s i z e ∣ ∑ i = 1 ∣ b a t c h _ s i z e ∣ ( x 1 w 1 + x 2 w 2 + b − y ) 2 = 1 3 [ ( 1 ∗ 1 + 3 ∗ 2 + 0 − 3 ) 2 + ( 4 ∗ 1 + 2 ∗ 2 + 0 − 6 ) 2 + ( 1 ∗ 1 + 2 ∗ 2 + 0 − 1 ) 2 ] = 12 loss =\frac{1}{|\mathbf{batch\_size}|}||X\mathbf{w}+\mathbf{b}-y||^2=\frac{1}{|\mathbf{batch\_size}|}\sum_{i=1}^{|batch\_size|}(x_1w_1+x_2w_2+\mathbf{b}-y)^2=\frac{1}{3}\mathbf{[}(1*1+3*2+\mathbf{0}-3)^2+(4*1+2*2+\mathbf{0}-6)^2+(1*1+2*2+\mathbf{0}-1)^2]=12 loss=batch_size1∣∣Xw+by2=batch_size1i=1batch_size(x1w1+x2w2+by)2=31[(11+32+03)2+(41+22+06)2+(11+22+01)2]=12,所以 b . g r a d = ∂ l o s s ∂ b = ∂ 1 ∣ b a t c h _ s i z e ∣ ∑ i = 1 ∣ b a t c h _ s i z e ∣ ( x 1 w 1 + x 2 w 2 + b − y ) 2 ∂ b = 2 ∣ b a t c h _ s i z e ∣ ∑ i = 1 ∣ b a t c h _ s i z e ∣ ( x 1 w 1 + x 2 w 2 + b − y ) = 2 3 [ ( 1 ∗ 1 + 3 ∗ 2 + 0 − 3 ) + ( 4 ∗ 1 + 2 ∗ 2 + 0 − 6 ) + ( 1 ∗ 1 + 2 ∗ 2 + 0 − 1 ) ] = 20 3 = 6.6667 \mathbf{b}.grad= \frac{\partial loss}{\partial \mathbf{b}} = \frac{\partial \frac{1}{|\mathbf{batch\_size}|}\sum_{i=1}^{|batch\_size|}(x_1w_1+x_2w_2+\mathbf{b}-y)^2}{\partial \mathbf{b}}=\frac{2}{|\mathbf{batch\_size}|}\sum_{i=1}^{|batch\_size|}(x_1w_1+x_2w_2+\mathbf{b}-y)=\frac{2}{3}\mathbf{[}(1*1+3*2+\mathbf{0}-3)+(4*1+2*2+\mathbf{0}-6)+(1*1+2*2+\mathbf{0}-1)]=\frac{20}{3}=\mathbf{6.6667} b.grad=bloss=bbatch_size1i=1batch_size(x1w1+x2w2+by)2=batch_size2i=1batch_size(x1w1+x2w2+by)=32[(11+32+03)+(41+22+06)+(11+22+01)]=320=6.6667

运行截图:
请添加图片描述
同时可学习的参数 w \mathbf{w} w b \mathbf{b} b通过SGD得到更新,即
w 1 = w 0 − η ∂ l o s s ∂ w = w 0 − η w . g r a d = [ 1 2 ] − 0.5 ∗ [ 10.6667 16 ] = [ − 4.3333 − 6 ] \mathbf{w_1}=\mathbf{w_0}-\eta\frac{\partial loss}{\partial \mathbf{w}}=\mathbf{w_0}-\eta\mathbf{w}.grad=\begin{bmatrix} 1\\ 2 \end{bmatrix}-0.5*\begin{bmatrix} 10.6667\\ 16 \end{bmatrix}=\begin{bmatrix} -4.3333\\ -6 \end{bmatrix} w1=w0ηwloss=w0ηw.grad=[12]0.5[10.666716]=[4.33336]和偏置 b 1 = b 0 − η ∂ l o s s ∂ b = b 0 − η b . g r a d = 0 − 0.5 ∗ 6.6667 = − 3.3333 \mathbf{b_1}=\mathbf{b_0}-\eta\frac{\partial loss}{\partial \mathbf{b}}=\mathbf{b_0}-\eta\mathbf{b}.grad=0-0.5*6.6667=-3.3333 b1=b0ηbloss=b0ηb.grad=00.56.6667=3.3333。后面的更新类似迭代即可。


  1. http://matrixcookbook.com ↩︎

  2. https://zh.d2l.ai/chapter_linear-networks/linear-regression-concise.html ↩︎

  3. https://zh.d2l.ai/chapter_linear-networks/linear-regression-scratch.html ↩︎

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

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

相关文章

【Java IO流】字节流详解

文章目录1. IO 流概述2. IO 流分类3. 字节输出流4. 字节输入流5. 文件拷贝6. IO 流中的异常处理7. 总结Java编程基础教程系列1. IO 流概述 什么是 IO 流&#xff1f; IO 流是存取数据的解决方案&#xff0c;在计算机中数据存放在硬盘的文件中&#xff0c;如果程序需要使用这些…

Gitlab 项目上传到Maven仓库

Gitlab 项目上传到Maven仓库Gitlab 项目上传到Maven仓库1. 生成Deploy tokens2.项目工程AS的build.gradle配置Maven3. 拉取Maven库Gitlab 项目上传到Maven仓库 1. 生成Deploy tokens 项目地址-》Settings-》Repository-》Deploy tokens-》Expand-》输入Name-》Create deploy …

回收租赁商城系统功能拆解10讲-会员等级

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

数据分析面试题--SQL面试题

目录标题1&#xff0c;UNION和JOIN的区别2&#xff0c;连续登录问题3&#xff0c;窗口函数和普通聚合函数的区别4&#xff0c;窗口函数的基本用法5&#xff0c;序号函数:row_number(),rank(),dense_rank()的区别6&#xff0c;窗口函数涉及的一些其他函数7&#xff0c;次日留存率…

CAD软件中如何标注曲线长度?

在CAD设计过程中&#xff0c;如果想要用CAD标注图纸中某一曲线的长度该如何操作呢&#xff1f;今天小编就来给大家分享一个CAD标注曲线长度的小工具&#xff0c;有需要的小伙伴可以一起来看看哦&#xff01; 此插件可以用多种方式标注多段线、样条曲线的长度&#xff0c;并可以…

Go语言笔记:UDP基础使用与广播

文章目录目的基础说明作为服务器使用作为客户端使用广播总结目的 UDP是比较基础常用的网络通讯方式&#xff0c;这篇文章将介绍Go语言中UDP基础使用的一些内容。 本文中使用 Packet Sender 工具进行测试&#xff0c;其官网地址如下&#xff1a; https://packetsender.com/ 基…

知识站点上关于Notes Domino话题几个问答

大家好&#xff0c;才是真的好。 今天周一我们继续不讲技术&#xff0c;介绍一下知识网站上关于Notes/Domino几个有趣问题的讨论。 国内的知识网站头把交椅是知乎&#xff0c;在中文界中是扛把子.不过在国外&#xff0c;最流行的知识网站叫做Quora&#xff0c;上面关于Notes/…

【Java】【系列篇】【Spring源码解析】【三】【体系】【PostProcessors体系】

PostProcessor英文翻译为后置处理器&#xff0c;在Spring体系里面主要针对的对象为Bean和BeanFactory.有着收尾或完善的作用。一、BeanPostProcessor分支 1.1、作用 在Bean对象在实例化和依赖注入完毕后&#xff0c;在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean…

【学习笔记】【Pytorch】十六、模型训练套路

【学习笔记】【Pytorch】十六、模型训练套路一、内容概述二、模型训练套路1.代码实现&#xff1a;CPU版本2.代码实现&#xff1a;优先GPU版本a3.代码实现&#xff1a;优先GPU版本b4.计算测试集上的正确率三、使用免费GPU训练模型一、内容概述 本内容主要是介绍一个完整的模型训…

信用评分分卡简介

背景 随着金融科技初创企业的兴起&#xff0c;过去 5 年中出现了许多新的消费信贷机构&#xff0c;与传统银行展开竞争。他们通常瞄准银行认为规模太小或因金融危机期间发生的后期损失而不得不削减贷款的细分市场。通俗的讲就是消费金融公司瞄准了银行的次贷市场。 这些新的消…

【C语言】文件操作修改通讯录(升级版本)可以存储数据

文件操作的内容&#xff0c;我们在上文已经学习了&#xff0c;那么如果有不明白的小伙伴请看这篇文章 【C语言】小王带您实现文件操作&#xff08;简单图示讲解&#xff09;_小王学代码的博客-CSDN博客 通讯录我们在之前也学习实现了静态、动态通讯录 【C语言】使用C语言实现静…

分享80个PHP源码,总有一款适合您

PHP源码 分享80个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 80个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1yJ1aR6vt2kDjiVyqj0gPuw?pwdlfl9 提取码&#xff…

深信服EDR任意用户登录与命令执行漏洞

深信服EDR任意用户登录与命令执行漏洞1.深信服EDR简介2.深信服EDR漏洞2.1.后台任意用户登录漏洞2.1.1.漏洞描述2.1.2.影响版本2.1.3.漏洞复现2.2.任意命令执行漏洞2.2.1.漏洞描述2.2.2.影响版本2.2.3.漏洞复现2.2.3.1.构建URL2.2.3.2.效果1.深信服EDR简介 终端检测响应平台&…

C生万物 | 使用宏将一个整数的二进制位的奇数位和偶数位交换

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 淋漓尽致——位运算✒题目分析 && 实现思路[位运算]1、获取这个整数的奇数位和偶数位2、使用移位运算使【奇变偶】【偶变奇…

如何通过限流算法防止系统过载

限流算法&#xff0c;顾名思义&#xff0c;就是指对流量进行控制的算法&#xff0c;因此也常被称为流控算法。 我们在日常生活中&#xff0c;就有很多限流的例子&#xff0c;比如地铁站在早高峰的时候&#xff0c;会利用围栏让乘客们有序排队&#xff0c;限制队伍行进的速度&am…

扫雷——“C”

各位uu们我又来啦&#xff0c;今天&#xff0c;小雅兰给大家介绍的又是一个小游戏&#xff0c;就是扫雷这款游戏&#xff0c;这个游戏和我昨天给大家介绍的三子棋游戏有异曲同工之妙&#xff0c;相信很多人都玩过&#xff0c;话不多说&#xff0c;我们进入正题吧. 《扫雷》是一…

【学习笔记】【Pytorch】十七、模型测试套路

【学习笔记】【Pytorch】十七、模型测试套路一、内容概述二、模型测试套路代码实现一、内容概述 利用已经训练好的模型&#xff0c;然后给它提供输入&#xff0c;判断输出是否正确&#xff0c;即模型的应用测试。 在模型测试也会有一些坑&#xff1a; 神经网络的输入一般是4…

【错误记录】Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )

文章目录一、报错信息二、问题分析三、解决方案 ( 初始化块定义在所有属性之后 )一、报错信息 在 Kotlin 中 , init 初始化块 要 定义在所有成员属性之后 ; 如果在 init 初始化块 中 , 使用到了 成员属性 , 有可能出现 编译时报错信息 ; 报错代码示例 : class Hello{init {va…

seata安装及配置

1.下载 下载地址&#xff1a;https://github.com/seata/seata/tags 本文选用seata-1.4.2版 2.解压 tar -zxvf seata-server-1.4.2.tar.gz 3. 初始化数据库 登录mysql&#xff0c;然后创建数据库和数据表&#xff1a; -- -------------------------------- The script used…

【Java】【系列篇】【Spring源码解析】【三】【体系】【Environment体系】

整体结构图 本篇文章仅作简单了解&#xff0c;详细还等到Springboot系列里面详解PropertyResolver 作用 用于针对任何基础源解析属性(Property)的接口 方法解析 // 查看规定指定的key是否有对应的value 对应key的值是null的话也算是不能解析 boolean containsProperty(Stri…