当前位置: 首页 > news >正文

A General Framework for Uncertainty Estimation in Deep Learning源码阅读(二)

接上文

ResNet定义:

代码使用

def ResNet18ADF(noise_variance=1e-3, min_variance=1e-3):return ResNet(BasicBlock, [2,2,2,2], num_classes=10, noise_variance=1e-3, min_variance=1e-3, initialize_msra=False)

定义模型,其中ResNet定义为:

class ResNet(nn.Module):def __init__(self, block, num_blocks, num_classes=10, noise_variance=1e-3, min_variance=1e-3, initialize_msra=False):super(ResNet, self).__init__()self.keep_variance_fn = lambda x: keep_variance(x, min_variance=min_variance)self._noise_variance = noise_varianceself.in_planes = 64self.conv1 = adf.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False, keep_variance_fn=self.keep_variance_fn)self.bn1 = adf.BatchNorm2d(64, keep_variance_fn=self.keep_variance_fn)self.ReLU = adf.ReLU(keep_variance_fn=self.keep_variance_fn)self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1, keep_variance_fn=self.keep_variance_fn)self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2, keep_variance_fn=self.keep_variance_fn)self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2, keep_variance_fn=self.keep_variance_fn)self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2, keep_variance_fn=self.keep_variance_fn)self.linear = adf.Linear(512*block.expansion, num_classes, keep_variance_fn=self.keep_variance_fn)self.AvgPool2d = adf.AvgPool2d(keep_variance_fn=self.keep_variance_fn)def _make_layer(self, block, planes, num_blocks, stride, keep_variance_fn=None):strides = [stride] + [1]*(num_blocks-1)layers = []for stride in strides:layers.append(block(self.in_planes, planes, stride, keep_variance_fn=self.keep_variance_fn))self.in_planes = planes * block.expansionreturn adf.Sequential(*layers)def forward(self, x):inputs_mean = xinputs_variance = torch.zeros_like(inputs_mean) + self._noise_variancex = inputs_mean, inputs_varianceout = self.ReLU(*self.bn1(*self.conv1(*x)))out = self.layer1(*out)out = self.layer2(*out)out = self.layer3(*out)out = self.layer4(*out)out = self.AvgPool2d(*out, 4)out_mean = out[0].view(out[0].size(0), -1) # Flattenout_var = out[1].view(out[1].size(0), -1)out = out_mean, out_varout = self.linear(*out)return out

其中,*的作用是:

在Python中,一个星号(*)通常被用来进行解包(unpacking)操作。当一个星号出现在函数调用中的一个参数前面时,它会告诉Python将该参数解包成多个独立的值,然后再将这些值传递给函数。
当一个星号出现在一个变量名前面时,它可以被用来表示一个可变数量的参数。这被称为可变参数列表(variable-length argument list)或者不定长参数(arbitrary argument)。这样的语法允许函数接受不定数量的参数。
下面是一个例子,展示了如何使用星号来定义一个可变参数列表:
def my_func(*args):
for arg in args:
print(arg)
my_func(1, 2, 3, 4, 5)
这个函数可以接受任意数量的参数,并将它们打印出来。在函数中,参数args被定义为一个元组,其中包含了传递给函数的所有参数。

(可以观察到,self.layer等模型层输出的out应该包含两部分)

adf.Sequential()

ResNet中比较关键的是_make_layer,其中用到了adf.Sequential:

class Sequential(nn.Module):def __init__(self, *args):super(Sequential, self).__init__()if len(args) == 1 and isinstance(args[0], OrderedDict):for key, module in args[0].items():self.add_module(key, module)else:for idx, module in enumerate(args):self.add_module(str(idx), module)def _get_item_by_idx(self, iterator, idx):"""Get the idx-th item of the iterator"""size = len(self)idx = operator.index(idx)if not -size <= idx < size:raise IndexError('index {} is out of range'.format(idx))idx %= sizereturn next(islice(iterator, idx, None))def __getitem__(self, idx):if isinstance(idx, slice):return Sequential(OrderedDict(list(self._modules.items())[idx]))else:return self._get_item_by_idx(self._modules.values(), idx)def __setitem__(self, idx, module):key = self._get_item_by_idx(self._modules.keys(), idx)return setattr(self, key, module)def __delitem__(self, idx):if isinstance(idx, slice):for key in list(self._modules.keys())[idx]:delattr(self, key)else:key = self._get_item_by_idx(self._modules.keys(), idx)delattr(self, key)def __len__(self):return len(self._modules)def __dir__(self):keys = super(Sequential, self).__dir__()keys = [key for key in keys if not key.isdigit()]return keysdef forward(self, inputs, inputs_variance):for module in self._modules.values():inputs, inputs_variance = module(inputs, inputs_variance)return inputs, inputs_variance

其中,add_module()作用是:

add_module() 是 PyTorch 中 nn.Module 类的一个方法,用于将子模块添加到当前模块中。它接受两个参数:

name:子模块的名称。 module:要添加的子模块。 下面是一个例子,展示了如何使用 add_module()
方法向一个模块中添加子模块:

     import torch.nn as nnclass MyModel(nn.Module):
def __init__(self):super(MyModel, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)self.relu1 = nn.ReLU()self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.relu2 = nn.ReLU()self.fc1 = nn.Linear(32 * 28 * 28, 1024)self.relu3 = nn.ReLU()self.fc2 = nn.Linear(1024, 10)self.softmax = nn.Softmax(dim=1)# 使用 add_module() 方法添加一个 BatchNorm2d 模块self.bn = nn.BatchNorm2d(32)self.add_module('batch_norm', self.bn)
def forward(self, x):x = self.conv1(x)x = self.relu1(x)x = self.conv2(x)x = self.bn(x)x = self.relu2(x)x = x.view(-1, 32 * 28 * 28)x = self.fc1(x)x = self.relu3(x)x = self.fc2(x)x = self.softmax(x)return x 

在这个例子中,我们创建了一个自定义的模型 MyModel,并使用 add_module() 方法将一个 BatchNorm2d 模块添加到模型中。这个方法可以方便地管理模型中的子模块,并在需要时进行访问和修改。

在上面的代码中,确实可以直接使用 self.bn 调用 BatchNorm2d
模块,而不需要使用 add_module() 方法。然而,使用 add_module()
方法可以将模块的名称与其实例进行绑定,从而使模块的名称可以在模型的其他地方进行访问和修改。这在模型较复杂的情况下非常有用。

举个例子,如果我们想要访问模型中的所有 BatchNorm2d 模块,可以使用 named_modules()
方法来获取所有模块及其名称,并在其中筛选出 BatchNorm2d 模块:

  for name, module in my_model.named_modules():if isinstance(module, nn.BatchNorm2d):print(f'{name}: {module}') 这将输出模型中所有的 BatchNorm2d 模块及其名称。

另外,add_module() 方法还可以与 register_parameter()
方法和其他方法一起使用,方便地管理模型的参数和其他属性。因此,在设计复杂的模型时,使用 add_module()
方法可以提高代码的可读性和可维护性。

在forward中,读取add后的module进行计算:

    def forward(self, inputs, inputs_variance):for module in self._modules.values():inputs, inputs_variance = module(inputs, inputs_variance)return inputs, inputs_variance

BasicBlock

ResNet中比较关键的是_make_layer,其中用到了block(),指的是:

class BasicBlock(nn.Module):expansion = 1def __init__(self, in_planes, planes, stride=1, keep_variance_fn=None):super(BasicBlock, self).__init__()self.keep_variance_fn = keep_variance_fnself.conv1 = adf.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False, keep_variance_fn=self.keep_variance_fn)self.bn1 = adf.BatchNorm2d(planes, keep_variance_fn=self.keep_variance_fn)self.conv2 = adf.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False, keep_variance_fn=self.keep_variance_fn)self.bn2 = adf.BatchNorm2d(planes, keep_variance_fn=self.keep_variance_fn)self.ReLU = adf.ReLU(keep_variance_fn=self.keep_variance_fn)self.shortcut = adf.Sequential()if stride != 1 or in_planes != self.expansion*planes:self.shortcut = adf.Sequential(adf.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False, keep_variance_fn=self.keep_variance_fn),adf.BatchNorm2d(self.expansion*planes, keep_variance_fn=self.keep_variance_fn))def forward(self, inputs_mean, inputs_variance):x = inputs_mean, inputs_varianceout = self.ReLU(*self.bn1(*self.conv1(*x)))out_mean, out_var = self.bn2(*self.conv2(*out))shortcut_mean, shortcut_var = self.shortcut(*x)out_mean, out_var = out_mean + shortcut_mean, out_var + shortcut_varout = out_mean, out_var out = self.ReLU(*out)return out

BasicBlock里把mean和var合成了一个out,而Sequential选择分开传播mean和var,有什么说法吗?

adf.Conv2d()

可以看到BasicBlock使用了adf.Conv2d():

class Conv2d(_ConvNd):def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1, bias=True,keep_variance_fn=None, padding_mode='zeros'):self._keep_variance_fn = keep_variance_fnkernel_size = _pair(kernel_size)stride = _pair(stride)padding = _pair(padding)dilation = _pair(dilation)super(Conv2d, self).__init__(in_channels, out_channels, kernel_size, stride, padding, dilation,False, _pair(0), groups, bias, padding_mode)def forward(self, inputs_mean, inputs_variance):outputs_mean = F.conv2d(inputs_mean, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups)outputs_variance = F.conv2d(inputs_variance, self.weight ** 2, None, self.stride, self.padding, self.dilation, self.groups)if self._keep_variance_fn is not None:outputs_variance = self._keep_variance_fn(outputs_variance)return outputs_mean, outputs_variance

其中,对于均值和方差是共享权重的:

outputs_mean, outputs_variance两个卷积操作共享权重吗?
是的,outputs_mean 和 outputs_variance 两个卷积操作在这个类中是共享权重的。在这个类的 init() 方法中,使用父类 _ConvNd 的构造函数初始化了模型的卷积核权重和偏置,并在 forward() 方法中对这些权重和偏置进行了调用
具体来说,F.conv2d() 函数的第一个参数 inputs_mean 和第二个参数 inputs_variance 都使用了 self.weight 权重作为卷积核,这意味着这两个卷积操作共享相同的权重。同时,由于 inputs_variance 使用了 self.weight 的平方作为卷积核,因此两个卷积操作的权重实际上也是不同的。
需要注意的是,在卷积神经网络中,共享权重是一种常见的技术,它可以减少模型中需要训练的参数数量,从而减轻过拟合的风险。但是,共享权重也可能会限制模型的表达能力,因此需要根据具体问题和数据集的情况进行权衡和选择。

这个代码,使用weight2weight^2weight2作为方差的权重,有什么道理嘛?勉强可以理解吧!

adf.BatchNorm2d()

可以看到BasicBlock中使用了adf.BatchNorm2d():

class BatchNorm2d(nn.Module):_version = 2__constants__ = ['track_running_stats', 'momentum', 'eps', 'weight', 'bias','running_mean', 'running_var', 'num_batches_tracked']def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True,track_running_stats=True, keep_variance_fn=None):super(BatchNorm2d, self).__init__()self._keep_variance_fn = keep_variance_fnself.num_features = num_featuresself.eps = epsself.momentum = momentumself.affine = affineself.track_running_stats = track_running_statsif self.affine:self.weight = Parameter(torch.Tensor(num_features))self.bias = Parameter(torch.Tensor(num_features))else:self.register_parameter('weight', None)self.register_parameter('bias', None)if self.track_running_stats:self.register_buffer('running_mean', torch.zeros(num_features))self.register_buffer('running_var', torch.ones(num_features))self.register_buffer('num_batches_tracked', torch.tensor(0, dtype=torch.long))else:self.register_parameter('running_mean', None)self.register_parameter('running_var', None)self.register_parameter('num_batches_tracked', None)self.reset_parameters()def reset_running_stats(self):if self.track_running_stats:self.running_mean.zero_()self.running_var.fill_(1)self.num_batches_tracked.zero_()def reset_parameters(self):self.reset_running_stats()if self.affine:nn.init.uniform_(self.weight)nn.init.zeros_(self.bias)def _check_input_dim(self, input):raise NotImplementedErrordef forward(self, inputs_mean, inputs_variance):# exponential_average_factor is self.momentum set to# (when it is available) only so that if gets updated# in ONNX graph when this node is exported to ONNX.if self.momentum is None:exponential_average_factor = 0.0else:exponential_average_factor = self.momentumif self.training and self.track_running_stats:if self.num_batches_tracked is not None:self.num_batches_tracked += 1if self.momentum is None:  # use cumulative moving averageexponential_average_factor = 1.0 / float(self.num_batches_tracked)else:  # use exponential moving averageexponential_average_factor = self.momentumoutputs_mean = F.batch_norm(inputs_mean, self.running_mean, self.running_var, self.weight, self.bias,self.training or not self.track_running_stats,exponential_average_factor, self.eps)outputs_variance = inputs_varianceweight = ((self.weight.unsqueeze(0)).unsqueeze(2)).unsqueeze(3)outputs_variance = outputs_variance*weight**2"""for i in range(outputs_variance.size(1)):outputs_variance[:,i,:,:]=outputs_variance[:,i,:,:].clone()*self.weight[i]**2"""if self._keep_variance_fn is not None:outputs_variance = self._keep_variance_fn(outputs_variance)return outputs_mean, outputs_variance

对于均值与方差来说,只有均值需要进行归一化,方差不需要;
而本函数添加了两个可学习的参数:

在 BatchNorm2d 类的构造函数中,当 affine 参数为 True 时,会初始化 self.weight 和 self.bias 两个可学习参数。具体来说,这里的 self.weight 是一个形状为 (num_features,) 的一维张量,用于缩放归一化后的数据。而 self.bias 也是一个形状为 (num_features,) 的一维张量,用于平移归一化后的数据。
这两个参数在 forward() 方法中会被应用于输出张量上,从而进一步提高模型的表达能力和灵活性。在 forward() 方法中,self.weight 用于对归一化后的数据进行缩放,即将均值为 0、方差为 1 的数据缩放为均值为 0、方差为 self.weight 的数据。而 self.bias 则用于对归一化后的数据进行平移,即将缩放后的数据加上一个偏置项 self.bias,从而使得模型能够适应更加复杂和多样的数据分布。
需要注意的是,如果在构造函数中将 affine 参数设为 False,则不会初始化 self.weight 和 self.bias,也就不会应用缩放和平移操作。在这种情况下,BatchNorm2d 类实际上只是对输入的数据进行了均值和方差的归一化处理,而没有引入额外的可学习参数。

adf.ReLU()

可以看到BasicBlock中使用了adf.ReLU():

class ReLU(nn.Module):def __init__(self, keep_variance_fn=None):super(ReLU, self).__init__()self._keep_variance_fn = keep_variance_fndef forward(self, features_mean, features_variance):features_stddev = torch.sqrt(features_variance)div = features_mean / features_stddevpdf = normpdf(div)cdf = normcdf(div)outputs_mean = features_mean * cdf + features_stddev * pdfoutputs_variance = (features_mean ** 2 + features_variance) * cdf \+ features_mean * features_stddev * pdf - outputs_mean ** 2if self._keep_variance_fn is not None:outputs_variance = self._keep_variance_fn(outputs_variance)return outputs_mean, outputs_variance

在 forward() 方法中,输入的参数包含两部分,即 features_mean 表示输入特征的均值,features_variance 表示输入特征的方差。在计算输出时,首先计算输入特征的标准差 features_stddev,然后计算出 cdf 和 pdf,这两个量分别表示标准正态分布的累积分布函数和概率密度函数。最后,根据 ReLU 函数的定义,对均值和方差分别进行处理,得到输出特征的均值 outputs_mean 和方差 outputs_variance。

相关文章:

A General Framework for Uncertainty Estimation in Deep Learning源码阅读(二)

接上文 ResNet定义&#xff1a; 代码使用 def ResNet18ADF(noise_variance1e-3, min_variance1e-3):return ResNet(BasicBlock, [2,2,2,2], num_classes10, noise_variance1e-3, min_variance1e-3, initialize_msraFalse)定义模型&#xff0c;其中ResNet定义为&#xff1a; …...

串行通信协议---HART协议

实际应用中&#xff0c;HART协议是仅次于Modbus协议的最接近统一现场总线的标准&#xff0c;主要是在4~20mA电流信号上面叠加数字信号&#xff0c;物理层采用Bell 202标准的FSK技术成功实现模拟信号和数字信号双向同时通信而互不干扰。HART协议规定了传输的物理形式、消息结构、…...

【独家】华为OD机试 - 寻找密码(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:寻找密码 题目 小王在进行游…...

FPGA有哪些优质的带源码的IP开源网站?

这是某乎上的一个问题&#xff0c;我觉得还不错&#xff0c;今天就系统性的总结一下1、fpga4funhttps://www.fpga4fun.com/你能在这个网站上找到什么&#xff1f;您可以找到信息页面&#xff0c;以及使用 FPGA 板构建的 FPGA 项目。注重点&#xff1a;项目。FPGA 项目使用一种称…...

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Postman接口测试之Mock快速入门

一、Mock简介 1.Mock定义 Mock是一种比较特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行接口或单元测试。通常情况下&#xff0c;Mock与其他方法的区别是&#xff0c;用于模拟代码依赖对象&#xff0c;并允许设置对应的期望值。简单一点来讲&#xff0c;就是Mock创建…...

分享一个国内可用的免费ChatGPT网站

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个程序员&#xff0c;我也忍不住做了一个基于ChatGPT的网站&#xff0c;免费&#xff01;免登陆&#xff01;&#xff01;国内可直接对话ChatGPT&#xff0c;也…...

15. 三数之和(Java)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 …...

Navicat Premium 16安装教程

1.鼠标右击【Navicat Premium 16(64bit)】压缩包&#xff08;win11及以上系统需先选择“显示更多选项”&#xff09;选择【解压到 Navicat Premium 16(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【setup】选择【以管理员身份运行】。 3.点击【下一步】。 4.选择【我…...

蓝桥杯刷题冲刺 | 倒计时8天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.三角形的面积2.图中点的层次1.三角形的面积 题目 链接&#xff1a; 三角形的面积 - 蓝桥云课 …...

四.JAVA基础面试题:重要知识

四.JAVA基础面试题&#xff1a;重要知识 1.为什么JAVA只有值传递 2.JAVA获取运行时类的四种方式 四.JAVA基础面试题&#xff1a;重要知识 1.为什么JAVA只有值传递 实参&#xff1a;传递给形参的实际参数。 形参&#xff1a;接受实参的参数。值传递&#xff1a;方法接受实参…...

某面试官分享经验:看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上...

我们以前分享过许多经验&#xff0c;但大多是站在打工人的视角上&#xff0c;今天给大家带来一个面试官的经验&#xff1a;1. 看求职者第一眼&#xff0c;开口说第一句话&#xff0c;面试结果就差不多定了&#xff0c;准确率高达90%以上。2. 绝不考八股文&#xff0c;如果问技术…...

Java开发 - 消息队列之RabbitMQ初体验

目录 前言 RabbitMQ 什么是RabbitMQ RabbitMQ特点 安装启动 RabbitMQ和Kafka的消息收发区别 RabbitMQ使用案例 添加依赖 添加配置 创建RabbitMQ配置类 RabbitMQ消息的发送 RabbitMQ消息的接收 测试 结语 前言 前一篇&#xff0c;我们学习了Kafka的基本使用&#…...

蓝桥杯入职项目(HTML + springBoot)

文章目录需要解决npm包安装axioshttp-servedebug开发下个阶段测试运行方式注意清理磁盘缓存问题解决HTML Web项目的结构通常是基于MVC&#xff08;Model-View-Controller&#xff09;模式设计的。下面是一般的项目结构&#xff1a;index.html&#xff1a;项目的入口文件&#x…...

【IAR工程】STM8S208RB基于ST标准库下按键检测

【IAR工程】STM8S208RB基于ST标准库下按键检测&#x1f4cd;相关篇《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》&#x1f388;《【IAR工程】STM8S208RB基于ST标准库下EXTI外部中断》&#x1f516;基于ST STM8S/A标准外设库:STSW-STM8069,版本号&#xff1a;2.3.1&…...

【5】深度学习之Pytorch——如何使用张量处理文本数据集(语料库数据集)

在计算机领域&#xff0c;不断崛起的两个领域&#xff0c;一个是CV一个是NLP&#xff0c;下面我们可以探索一下深度学习在NLP的应用和特点。 深度学习在自然语言处理&#xff08;NLP&#xff09;领域有广泛的应用。以下是一些主要的应用和特点&#xff1a; 语音识别&#xff1…...

《Spring系列》第5章 refresh()

前言 Spring框架中最重要的肯定是IOC容器&#xff0c;那么其如何进行初始化&#xff0c;就是通过refresh()这个方法&#xff0c;无论是单独使用Spring框架&#xff0c;还是SpringBoot&#xff0c;最终都会通过执行到这个方法&#xff0c;那么下面会介绍一下这个方法 一、IOC容…...

ThreeJS-缩放、旋转(四)

代码&#xff1a; <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {OrbitControls } from three/examples/jsm/controls/OrbitControls export default { name: &quo…...

数据更新 | CnOpenData法拍房数据

法拍房数据 一、数据简介 法拍房&#xff0c;即“法院拍卖房产”&#xff0c;是被法院强制执行拍卖的房屋 。当债务人&#xff08;业主&#xff09;无力履行借款合约或无法清偿债务时&#xff0c;而被债权人经司法程序向法院申请强制执行&#xff0c;将债务人名下房屋拍卖&…...

【Spring从成神到升仙系列 五】从根上剖析 Spring 循环依赖

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…...

设计模式之代理模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、代理模式是什么&#xff1f; 代理模式是一种结构型的软件设计模式&#xff0c;在不改变原代码前提下&#xff0c;提供一个代理…...

c++11 标准模板(STL)(std::unordered_multimap)(三)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…...

Linux进程控制-2

紧接着上篇博客出发&#xff0c;我们接着来讲述Linux中进程控制的内容。 目录 1.等待 1.1具体操作 1.等待 进程等待主要的作用在于&#xff1a;父进程创建子进程之后&#xff0c;等待子进程退出&#xff0c;获取子进程的退出码&#xff0c;释放子进程的资源&#xff0c;避…...

快速排序算法

一&#xff1a;快速排序思想 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数&#xff08;不要被这个名词吓到了&#xff0c;就是一个用来参照的数&#xff0c;待会你就知道它用来做啥的了&#xff09;。为了方便&#xff…...

中华好诗词大学季第二季(四)

第七期 1,二十四友一朝尽&#xff0c;爱妾坠楼何足言出自许浑的《金谷园》&#xff0c;“爱妾”指的是谁 2,李白在《九月十日即事》借菊花表达自己的惋惜之情&#xff0c;请问九月十日是什么节日 A 后登高 B 菊花节 C 小重阳 3,贾宝玉在大观园里面题了“曲径通幽”&#xf…...

分布式系统容灾部署方案

本文主要以OceanBase部署来说明分布式系统容灾部署方案 分布式系统提供持续可用的服务尤为重要。 好的分布式系统根据需求提供不同等级的的高可用与容灾级别。 而在分布式系统中&#xff0c;数据库系统又是最核心最关键的系统。 我们以数据库分布式系统为主&#xff0c;考虑…...

Python 爬虫性能相关总结

这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些url需要我们获取相关数据&#xff0c;我们首先想到的是循环 简单的循环串行 这一种方法相对来说是最慢的&#xff0c;因为一个一个循环&#xff0c;耗时是最长的&#xff0c;是所有的时间总和 代码…...

Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)

Baumer工业相机堡盟工业相机如何设置网口的IP地址&#xff08;工业相机连接的网口设置IP地址步骤&#xff09;Baumer工业相机Baumer工业相机设置网络端口IP地址匹配设置网络端口IP地址和工业相机IP地址匹配第一次打开CameraExplorer软件确认问题为IP地址不匹配问题打开网络连接…...

Android MediaCodec设置H264 Profile到High

H264 High Profile压缩率高&#xff0c;能降低码率&#xff0c;这里记录下MediaCodec Profile设置到High遇到的一些问题。 Android 4.1 就引入了MediaCodecInfo.CodecProfileLevel类&#xff0c;下面截取H264(AVC)的Profile和Level定义: /** Copyright (C) 2012 The Android O…...

QT之QSysInfo(查看电脑信息)

文章目录前言一、API使用总结前言 QSysInfo是Qt中用于获取有关运行应用程序的系统信息的类。 我们可以获取以下信息&#xff1a; 返回系统产品类型&#xff0c;如ios&#xff0c;windows&#xff0c;Linux等 返回当前系统的产品版本。 返回当前系统的内核类型。 返回当前系统的…...