常见的类 nn.Conv2d,nn.BatchNorm2D,nn.AdaptiveAvgPool2d

  • nn.Conv2d
    • 理论部分
    • 代码部分
      • PaddlePaddle 版
      • torch 版
      • 分析
  • nn.BatchNorm2D
    • 理论部分
    • 代码部分
      • PaddlePaddle 版
      • Torch 版
      • 分析
        • PaddlePaddle 版
        • Torch 版
  • nn.AdaptiveAvgPool2d
    • 理论部分
    • 代码部分
      • PaddlePaddle 版
      • 分析
      • Torch 版

可以到适配的飞桨公开项目更好的理解:练习 PyTorch 中的常用类

  • 项目随文更。

nn.Conv2d

理论部分

nn.Conv2d 是 PyTorch 中的一个二维卷积层(Convolutional Layer)类,用于处理二维图像数据或者序列信号数据(比如语音、文本等)。它可以实现二维卷积操作通过卷积核对输入特征图进行滑动,提取出不同位置的特征信息,得到一个新的特征图

在使用 nn.Conv2d 时,需要指定卷积核的一些参数,包括输入通道数、输出通道数、卷积核大小、步长、填充方式、偏差项等。具体来说,参数说明如下:

  1. in_channels:输入的通道数,即特征图的深度(depth)。

  2. out_channels:输出的通道数,即卷积核的个数。每个卷积核可以提取一种特征,并得到一张新的特征图。

  3. kernel_size:卷积核的大小,是一个数值或者一个元组,比如 3 或者 (3, 3)。这里的大小表示卷积核的高和宽。

  4. stride:步长,表示卷积核在输入特征图上滑动的步长。也是一个数值或者一个元组,比如 1 或者 (2, 2)。

  5. padding:填充方式,指在输入特征图的边缘添加一些像素,这样可以使得输出特征图的大小和输入特征图的大小相同。padding 可以是一个数值或则一个元组,表示在每个维度上的填充量。比如 padding=1 表示在每个边缘添加一行或一列像素。

  6. dilation:空洞卷积(Dilated Convolution)操作,也称为扩张卷积,可以增加卷积核之间的距离,从而使得感受野更加广阔。这里为默认值 1。

  7. groups:分组卷积(Grouped Convolution)操作,能够将卷积核划分成多个组,每个组内部只对输入的一部分通道进行卷积操作。这里为默认值 1。

  8. bias:偏差项(Bias Term),默认为 True,表示是否添加偏差项。

nn.Conv2d 的输入是一个四维张量,其形状为 (batch_size, in_channels, height, width),其中 batch_size 表示样本的数量,in_channels 表示输入特征图的通道数,height 和 width 分别表示输入特征图的高度和宽度。

输出也是一个四维张量,其形状为 (batch_size, out_channels, height’, width’),其中 height’ 和 width’ 表示卷积后得到的新的特征图的高度和宽度。

整个卷积层的尺寸为(m * n * k1 * k2)是一个4维张量,其中 m 表示卷积核的数量,n 表示通道数量,k1 表示每一个卷积核通道的宽,k2 表示每一个卷积核通道的高。

代码部分

nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)

PaddlePaddle 版

import paddle
import paddle.nn as nn
import paddle.nn.functional as F
 
in_channels = 5  #输入通道数量
out_channels =10 #输出通道数量
width = 100      #每个输入通道上的卷积尺寸的宽
height = 100     #每个输入通道上的卷积尺寸的高
kernel_size = 3  #每个输入通道上的卷积尺寸
batch_size = 1   #批数量
 
input = paddle.randn([batch_size, in_channels, width, height])
conv_layer = nn.Conv2D(in_channels=in_channels,
                      out_channels=out_channels,
                      kernel_size=kernel_size,
                      stride=1)
 
out_put = conv_layer(input)
 
print(input.shape)
print(out_put.shape)
print(conv_layer.weight.shape)

输出如下:
在这里插入图片描述

torch 版

import torch
 
in_channels = 5  #输入通道数量
out_channels =10 #输出通道数量
width = 100      #每个输入通道上的卷积尺寸的宽
heigth = 100     #每个输入通道上的卷积尺寸的高
kernel_size = 3  #每个输入通道上的卷积尺寸
batch_size = 1   #批数量
 
input = torch.randn(batch_size,in_channels,width,heigth)
conv_layer = torch.nn.Conv2d(in_channels,out_channels,kernel_size=kernel_size)
 
out_put = conv_layer(input)
 
print(input.shape)
print(out_put.shape)
print(conv_layer.weight.shape)

输出如下:

在这里插入图片描述

分析

  • 输入的张量信息为 [1,5,100,100] 分别表示 batch_size,in_channels,width,height;
  • 输出的张量信息为 [1,10,100,100] 分别表示 batch_size,out_channels,width’,height’,其中 width’,height’ 表示卷积后的每个通道的新尺寸大小;
  • conv_layer.weight.shape 的输出结果为 [10, 5, 3, 3],分表表示 out_channels,in_channels,kernel_size ,kernel_size ,可以看到与上面的公式 m * n * k1 * k2 一致。

nn.BatchNorm2D

nn.BatchNorm2D 是 PaddlePaddle 库中用于实现二维批量归一化(Batch Normalization)操作的类。

理论部分

在深度神经网络训练过程中,网络参数的更新通常会伴随着数据分布的变化,这会造成后续层的输入分布不稳定,从而导致训练难以收敛。批量归一化通过对每个小批次数据分别进行规范化,将数据分布调整到均值为0、方差为1的标准正态分布,从而增强了网络的泛化能力,加快了训练速度,同时还有一定的正则化效果。

nn.BatchNorm2D 通过对每个特征通道(feature map)上的数据进行均值和方差的归一化操作,增强了网络的表征能力,使得网络的输出更加稳定,提高了模型的准确性。具体来说,它可以在数据预处理、网络训练和网络推断三个阶段都进行归一化处理,使得训练过程更加稳定,提高了模型的鲁棒性。

nn.BatchNorm2D 的参数如下:

  • num_features:一般输入数据为 batch_size * num_features * height *
    width,即为其中 num_features 特征维度数;
  • eps:分母添加到方差估计中的小量,避免分母为0,默认为:1e-5;
  • momentum (float) :动量参数,一个用于运行过程中均值和方差的一个估计参数;

在训练时,每次计算完一批(batch)数据的卷积或全连接结果后,我们需要将该批数据的输出特征图沿着 batch_size 这一维进行统计。具体地,

  • 我们计算该批数据中每个通道上的均值和方差,并将其保存下来。
  • 然后,我们使用这些均值和方差对该批数据的输出特征图进行标准化处理,得到标准化的输出特征图。

为了进一步提高归一化的效果,我们通常还会在标准化之后再引入可学习的偏移(offset)和缩放(scale)参数,以便让网络能够自适应地学习到更好的表示。具体地,

  • 对于每个特征通道,我们引入两个可学习的参数gamma和beta,将标准化后的输出特征图进行缩放和平移,得到最终的输出特征图。

BatchNorm2d()函数数学原理如下:

在这里插入图片描述

代码部分

PaddlePaddle 版

import paddle
import paddle.nn as nn

#eps:default:1e-5 (公式中为数值稳定性加到分母上的值)
m=nn.BatchNorm2D(2) #与PyTorch不同,PaddlePaddle中的BatchNorm层默认情况下是开启可学习参数的,
                    #无需设置weight和bias参数来启用可学习参数
input=paddle.randn([1,2,3,4])
output=m(input)
 
print(input)
print(m.weight)
print(m.bias)
print(output)
print(output.shape)

输出如下:
在这里插入图片描述

Torch 版

#encoding:utf-8
import torch
import torch.nn as nn
#num_features - num_features from an expected input of size:batch_size*num_features*height*width
#eps:default:1e-5 (公式中为数值稳定性加到分母上的值)
#momentum:动量参数,用于running_mean and running_var计算的值,default:0.1
m=nn.BatchNorm2d(2,affine=True) #affine参数设为True表示weight和bias将被使用
input=torch.randn(1,2,3,4)
output=m(input)
 
print(input)
print(m.weight)
print(m.bias)
print(output)
print(output.size())

输出如下:

tensor([[[[ 1.4174, -1.9512, -0.4910, -0.5675],
          [ 1.2095,  1.0312,  0.8652, -0.1177],
          [-0.5964,  0.5000, -1.4704,  2.3610]],
 
         [[-0.8312, -0.8122, -0.3876,  0.1245],
          [ 0.5627, -0.1876, -1.6413, -1.8722],
          [-0.0636,  0.7284,  2.1816,  0.4933]]]])
Parameter containing:
tensor([0.2837, 0.1493], requires_grad=True)
Parameter containing:
tensor([0., 0.], requires_grad=True)
tensor([[[[ 0.2892, -0.4996, -0.1577, -0.1756],
          [ 0.2405,  0.1987,  0.1599, -0.0703],
          [-0.1824,  0.0743, -0.3871,  0.5101]],
 
         [[-0.0975, -0.0948, -0.0347,  0.0377],
          [ 0.0997, -0.0064, -0.2121, -0.2448],
          [ 0.0111,  0.1232,  0.3287,  0.0899]]]],
       grad_fn=<NativeBatchNormBackward>)
torch.Size([1, 2, 3, 4])

分析

PaddlePaddle 版

输入是一个1 * 2 * 3 * 4 四维矩阵,gamma 和 beta 为一维数组,是针对 input[0][0],input[0][1] 两个3 * 4的二维矩阵分别进行处理的,我们不妨将 input[0][0] 的按照上面介绍的基本公式来运算,看是否能对的上 output[0][0] 中的数据。首先我们将 input[0][0] 中的数据输出,并计算其中的均值和方差。

print("输入的第一个维度:")
print(input[0][0]) #这个数据是第一个3*4的二维数据

#求第一个维度的均值和方差
# axis=0表示按照第一个维度(通道维度)进行求均值和方差
firstDimenMean=paddle.mean(input[0][0])
firstDimenVar=paddle.var(input[0][0], unbiased=False)  
# unbiased参数设置为False,表示使用无偏方差计算方式,贝塞尔校正不会被使用
print(m)
print(firstDimenMean)
print(firstDimenVar)

PaddlePaddle 输出如下:

在这里插入图片描述

注意,这里 momentum 默认为0.9,epsilon 默认为1e-05。

我们可以通过计算器(线上Desmos计算器)计算出均值和方差均正确计算。以均值举例:

在这里插入图片描述

最后通过公式计算 input[0][0][0][0] 的值,代码如下:

batchnormone=((input[0][0][0][0]-firstDimenMean)/(paddle.sqrt(firstDimenVar+1e-5)))\
    *m.weight[0]+m.bias[0]
print(batchnormone)
print(m.weight[0])
print(m.bias[0])

输出的结果值等于 output[0][0][0][0],代码和公式完美的对应起来了。
在这里插入图片描述

Torch 版
print("输入的第一个维度:")
print(input[0][0]) #这个数据是第一个3*4的二维数据
#求第一个维度的均值和方差
firstDimenMean=torch.Tensor.mean(input[0][0])
firstDimenVar=torch.Tensor.var(input[0][0],False)   #false表示贝塞尔校正不会被使用
print(m)
print('m.eps=',m.eps)
print(firstDimenMean)
print(firstDimenVar)

输出结果如下:

输入的第一个维度:
tensor([[ 1.4174, -1.9512, -0.4910, -0.5675],
        [ 1.2095,  1.0312,  0.8652, -0.1177],
        [-0.5964,  0.5000, -1.4704,  2.3610]])
BatchNorm2d(2, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
m.eps= 1e-05
tensor(0.1825)
tensor(1.4675)

最后通过公式计算input[0][0][0][0]的值,代码如下:

batchnormone=((input[0][0][0][0]-firstDimenMean)/(torch.pow(firstDimenVar,0.5)+m.eps))\
    *m.weight[0]+m.bias[0]
print(batchnormone)

输出结果如下:

tensor(0.2892, grad_fn=<AddBackward0>)

结果值等于 output[0][0][0][0]。ok,代码和公式也完美的对应起来了。

nn.AdaptiveAvgPool2d

nn.AdaptiveAvgPool2d(output_size)

理论部分

PyTorch 中的 nn.AdaptiveAvgPool2d 模块,是一个自适应的平均池化层,可以根据输入的尺寸自动调整池化窗口的大小,将任意大小的输入数据进行池化,并输出指定大小的特征图。在实例化 nn.AdaptiveAvgPool2d 层时,需要指定 output_size 参数,该参数是一个二元组,用于表示输出的特征图的大小 (H, W)。

在对输入尺寸为(B, C, Hin, Win)的数据进行前向传播时,nn.AdaptiveAvgPool2d 层会自动计算出池化窗口的大小 (KH,KW),使得输入的每个通道上的特征图都被均匀地划分为 KH * KW 个小块,然后对每个小块内的特征值求平均,最终输出一个 (B, C, H, W) 大小的特征图。

自适应池化层与传统的池化层不同,传统池化层通常需要手动设置池化窗口的大小和步幅,而自适应池化层可以根据输入数据的大小自动调整池化窗口的大小,从而灵活地适应各种输入尺寸的情况。

nn.AdaptiveAvgPool2d 层只适用于二维输入数据,如果输入数据是三维或更高维的,则需要使用其他的自适应平均池化层,如 nn.AdaptiveAvgPool3d。

代码部分

PaddlePaddle 版

import paddle
import paddle.nn as nn
m = nn.AdaptiveAvgPool2D((2,1))
m1 = nn.AdaptiveAvgPool2D((None,5))
m2 = nn.AdaptiveAvgPool2D(1)

input = paddle.randn([2, 4, 3, 4])
output = m(input)
output1 = m1(input)
output2 = m2(input)

print('nn.AdaptiveAvgPool2D((2,1)):',output.shape)
print('nn.AdaptiveAvgPool2D((None,5)):',output1.shape)
print('nn.AdaptiveAvgPool2D(1):',output2.shape)

输出如下:

在这里插入图片描述

可以具体打印出来看看里面的数:

print(input)
print(output)
print(output1)
print(output2)

输出如下,非常直观:

Tensor(shape=[2, 4, 3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
       [[[[ 0.90092957,  1.49062014, -0.43891591,  2.49542785],
          [-1.15749526, -0.30942214,  0.72686249,  0.19894561],
          [-0.52102602,  0.51292664, -0.14769700, -0.27466503]],

         [[ 0.76802170,  1.88680339,  1.33473635, -0.10681593],
          [ 0.21126194, -0.55997390, -0.51836526, -0.60124677],
          [-0.55262327, -1.67555463, -0.39201534, -2.58948588]],

         [[-0.32876831, -0.29057825, -0.34900934, -0.31911403],
          [-0.24603273,  0.02774601,  0.63011044, -1.04943550],
          [ 0.03737868, -0.79992193,  0.00638078, -0.97455049]],

         [[-0.42034203,  0.96777660,  0.62801188, -0.88072026],
          [-0.51847357,  1.37803781,  1.34817588, -0.74566907],
          [ 0.02777599, -0.05300835,  0.62294286,  0.29386613]]],


        [[[ 1.39181197,  1.51279640,  1.32197428,  1.23052955],
          [ 0.15545924,  1.01186311,  1.25041449,  0.07155325],
          [ 0.67657405, -1.73660100, -0.21091940, -0.02831869]],

         [[ 0.34955356,  0.06948886, -0.62700498, -0.93837327],
          [-0.32064596, -0.33115095,  0.88660580, -0.39552480],
          [-1.19203579, -4.19258356, -1.44245422,  2.13827157]],

         [[ 0.12091599,  0.69894040, -0.85016263, -0.84999377],
          [-0.61187607, -0.47178757,  0.24921176,  0.20200004],
          [ 1.90948820,  1.44339752, -0.48322666,  0.58571112]],

         [[-0.80645448,  1.03674793,  1.61488795, -1.18364632],
          [-0.81818682, -0.20740594, -0.60765731, -1.58125830],
          [-0.15702702,  0.91145509,  0.97826558, -1.30869794]]]])
Tensor(shape=[2, 4, 2, 1], dtype=float32, place=Place(cpu), stop_gradient=True,
       [[[[ 0.48836899],
          [-0.12144634]],

         [[ 0.30180269],
          [-0.83475041]],

         [[-0.24063522],
          [-0.29604059]],

         [[ 0.21959963],
          [ 0.29420596]]],


        [[[ 0.99330032],
          [ 0.14875315]],

         [[-0.16338146],
          [-0.60618973]],

         [[-0.18909398],
          [ 0.35286474]],

         [[-0.31912166],
          [-0.34881410]]]])
Tensor(shape=[2, 4, 3, 5], dtype=float32, place=Place(cpu), stop_gradient=True,
       [[[[ 0.90092957,  1.19577479,  0.52585208,  1.02825594,  2.49542785],
          [-1.15749526, -0.73345870,  0.20872018,  0.46290404,  0.19894561],
          [-0.52102602, -0.00404969,  0.18261482, -0.21118101, -0.27466503]],

         [[ 0.76802170,  1.32741261,  1.61076987,  0.61396021, -0.10681593],
          [ 0.21126194, -0.17435598, -0.53916955, -0.55980599, -0.60124677],
          [-0.55262327, -1.11408901, -1.03378499, -1.49075055, -2.58948588]],

         [[-0.32876831, -0.30967328, -0.31979379, -0.33406168, -0.31911403],
          [-0.24603273, -0.10914336,  0.32892823, -0.20966253, -1.04943550],
          [ 0.03737868, -0.38127163, -0.39677057, -0.48408484, -0.97455049]],

         [[-0.42034203,  0.27371728,  0.79789424, -0.12635419, -0.88072026],
          [-0.51847357,  0.42978212,  1.36310685,  0.30125341, -0.74566907],
          [ 0.02777599, -0.01261618,  0.28496724,  0.45840448,  0.29386613]]],


        [[[ 1.39181197,  1.45230412,  1.41738534,  1.27625191,  1.23052955],
          [ 0.15545924,  0.58366120,  1.13113880,  0.66098386,  0.07155325],
          [ 0.67657405, -0.53001344, -0.97376019, -0.11961904, -0.02831869]],

         [[ 0.34955356,  0.20952120, -0.27875805, -0.78268909, -0.93837327],
          [-0.32064596, -0.32589847,  0.27772743,  0.24554050, -0.39552480],
          [-1.19203579, -2.69230962, -2.81751895,  0.34790868,  2.13827157]],

         [[ 0.12091599,  0.40992820, -0.07561111, -0.85007823, -0.84999377],
          [-0.61187607, -0.54183185, -0.11128791,  0.22560591,  0.20200004],
          [ 1.90948820,  1.67644286,  0.48008543,  0.05124223,  0.58571112]],

         [[-0.80645448,  0.11514673,  1.32581794,  0.21562082, -1.18364632],
          [-0.81818682, -0.51279640, -0.40753162, -1.09445786, -1.58125830],
          [-0.15702702,  0.37721404,  0.94486034, -0.16521618, -1.30869794]]]])
Tensor(shape=[2, 4, 1, 1], dtype=float32, place=Place(cpu), stop_gradient=True,
       [[[[ 0.28970751]],

         [[-0.23293813]],

         [[-0.30464956]],

         [[ 0.22069782]]],


        [[[ 0.55392808]],

         [[-0.49965444]],

         [[ 0.16188486]],

         [[-0.17741479]]]])

分析

原来输入的大小是 [2, 4, 3, 4],见上图输出的四维矩阵,后来经过 nn.AdaptiveAvgPool2D((2,1)) 操作后,output 变成了 [2, 4, 2, 1] 大小的四维矩阵。

Torch 版

import torch
import torch.nn as nn
m = nn.AdaptiveAvgPool2d((5,1))
m1 = nn.AdaptiveAvgPool2d((None,5))
m2 = nn.AdaptiveAvgPool2d(1)
input = torch.randn(2, 64, 8, 9)
output = m(input)
output1 = m1(input)
output2 = m2(input)
print('nn.AdaptiveAvgPool2d((5,1)):',output.shape)
print('nn.AdaptiveAvgPool2d((None,5)):',output1.shape)
print('nn.AdaptiveAvgPool2d(1):',output2.shape)

输出如下:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈安科瑞ASJ继电器在菲律宾矿厂的应用

摘要&#xff1a;对电气线路进行接地故障保护&#xff0c;方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点&#xff0c;设计安装剩余电流继电器&#xff0c;实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…

分布式搜索引擎elasticsearch

目录 一、了解es1.1、elasticsearch作用1.2 ELK技术栈 二、倒排索引2.1 正向索引2.2倒排索引 三、es的概念3.1 文档和字段3.2 索引和映射3.3 mysql与elasticsearch 一、了解es 1.1、elasticsearch作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功…

linux环境下编译安装OpenCV For Java(CentOS 7)

最近在业余时间学习了一些有关图像处理的代码&#xff0c;但是只能本地处理&#xff0c;满足不了将来开放远程服务的需求。 因此&#xff0c;查找并参考了一些资料&#xff0c;成功在centos7环境安装上了opencv 460。 下面上具体安装步骤&#xff0c;希望能帮到有需要的同学。 …

Java中xml映射文件是干什么的

Java中的XML映射文件主要用于将Java对象与XML文档之间进行转换。它通常用于处理数据交换和存储&#xff0c;例如将Java对象转换为XML格式以便在网络上传输或保存到文件中&#xff0c;或者将XML文档解析为Java对象以进行处理。这种转换可以通过Java的JAXB&#xff08;Java Archi…

FIORI /N/UI2/FLP 始终在IE浏览器中打开 无法在缺省浏览器中打开

在使用/N/UI2/FLP 打开fiori 启动面板的时候&#xff0c;总是会在IE浏览器中打开&#xff0c;无法在缺省浏览器打开 并且URL中包含myssocntl 无法正常打开 启动面板 这种情况可以取消激活ICF节点/sap/public/myssocntl

【开源】基于Vue.js的医院门诊预约挂号系统的设计和实现

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

酷开系统 | 酷开科技聚焦价值人群 助力营销增长

2023年&#xff0c;是消费复苏回暖的一年&#xff0c;市场中充溢着大量品牌重启增长的机遇与实例。品牌商期望能够把握住市场趋势&#xff0c;通过营销获得确定性的业绩提升&#xff0c;并在未来收获长期稳定的增长。作为数字媒介的代表之一&#xff0c;OTT大屏营销的属性和价值…

Java数据结构之《合并线性表》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我…

【腾讯云 HAI域探秘】借助高性能应用HAI——我也能使用【stable diffusion】制作高级视频封面了

目录 高性能应用服务HAI_GPU云服务器的申请与服务创建 官网地址&#xff1a;高性能应用服务HAI_GPU云服务器_腾讯云 通过高性能应用服务HAI——创建【stable diffusion】 WebUI效果&#xff1a; 服务器后台效果&#xff1a; stable-diffusion服务测试 启动接口服务 配置…

【Redis】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

目录 Redis的慢查询 慢查询配置 慢查询操作命令 慢查询建议 Pipeline 事务 Redis的事务原理 Redis的watch命令 Pipeline和事务的区别 Lua Lua入门 安装Lua Lua基本语法 注释 标示符 关键词 全局变量 Lua中的数据类型 Lua 中的函数 Lua 变量 Lua中的控制语句…

为计算机设计一个完美的思维模型,帮找bug和漏洞,一起来做渗透测试吧 最赚钱的10种思维模型

芒格 如果我不能淘汰自己一年前的思维模型&#xff0c;这一年我就白过了。&#xff08;终身学习&#xff0c;不断迭代自己。&#xff09; 思维模型是什么&#xff0c;有哪些&#xff1f; 思维模型是用来简化和理解复杂现实世界的概念框架。它们是一种思考和解决问题的工具&a…

基于springboot实现的学生成绩管理系统

一、系统架构 前端&#xff1a;html | jquery | layui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | maven | mysql 二、代码及数据库 三、功能介绍 01. 登录页 02. 教师端-学生管理 03. 教师端-成绩管理 04. 教师端-学生总成绩管理 05. 学生端-我的成绩 0…

轻型载重汽车转向前桥总成系统毕业设计机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;前桥 获取完整说明报告工程源文件 绪论 1.1 轻型载重汽车转向桥的设计意义 汽车是现代交通工具中用得最多&#xff0c;最普遍&#xff0c;也是最方便的交通运输工具。汽车转向系是汽车上的一个重要系统,它是汽车转向运动…

从实践角度深入探究数据驱动和关键字驱动测试方法!

数据驱动 数据驱动&#xff0c;指在软件测试领域当中的数据驱动测试&#xff08;Data-Driven Testing&#xff0c;简称DDT&#xff09;是⼀种软件测试⽅法&#xff0c;在不同的数据下重复执⾏相同顺序的测试步骤&#xff0c;测试脚本从数据源读取测试数据&#xff0c;⽽不使⽤…

数学建模-基于集成学习的共享单车异常检测的研究

基于集成学习的共享单车异常检测的研究 整体求解过程概述(摘要) 近年来&#xff0c;共享单车的快速发展在方便了人们出行的同时&#xff0c;也对城市交通产生了一定的负面影响&#xff0c;其主要原因为单车资源配置的不合理。本文通过建立单车租赁数量的预测模型和异常检测模型…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

初识Java 18-5 泛型

目录 动态类型安全 异常 混型 C中的混型 替代方案 与接口混合 使用装饰器模式 与动态代理混合 本笔记参考自&#xff1a; 《On Java 中文版》 动态类型安全 在Java 5引入泛型前&#xff0c;老版本的Java程序中就已经存在了List等原生集合类型。这意味着&#xff0c;我们…

vue3中的provide与inject跨层级组件(祖孙)间通信

provide和inject提供依赖注入&#xff0c;功能类似 vue2.x 的provide/inject 实现跨层级组件(祖孙)间通信 子或孙子组件接收到的数据可以用于读取显示&#xff0c;也可以进行修改&#xff0c;同步修改父&#xff08;祖&#xff09;组件的数据。 注意&#xff1a;无论子组件…

第二十章总结。。。

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thread…

大数据HCIE成神之路之数学(4)——最优化实验

最优化实验 1.1 最小二乘法实现1.1.1 算法介绍1.1.2 代码实现1.2 梯度下降法实现1.2.1 算法介绍1.2.2 代码实现1.3 拉格朗日乘子法1.3.1 实验1.3.2 实验操作步骤1.1 最小二乘法实现 1.1.1 算法介绍 最小二乘法(Least Square Method),做为分类回归算法的基础,有着悠久的历…