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

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出,在CVPR 2016发表影响深远的网络模型,由何凯明团队提出来,在ImageNet的分类比赛上将网络深度直接提高到了152层,前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名,可以说ResNet的出现对深度神经网络来说具有重大的历史意义。

论文原文:Deep Residual Learning for Image Recognition

一、网络结构

ResNet在CNN图像方面有着非常突出的表现,利用shortcut 短路连接,解决了深度网络中模型退化的问题;每两层/三层之间增加了短路机制,通过residual learning残差学习使深层的网络发挥出作用。  

其中,提出了两种残差块——两层卷积(两组3x3卷积核)和三层卷积(两组1x1卷积核和一组3x3卷积核),不同残差块组合后形成不同参数量、计算量和性能的网络架构,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。

ResNet给出了五种层数的结构——18-layer、34-layer、50-layer、101-layer和152-layer。 

二、创新点

1.  超深的网络结构(超过1000层)

        在ResNet提出之前,所有的神经网络都是通过卷积层和池化层的叠加组成的。人们认为卷积层和池化层的层数越多,获取到的图片特征信息越全,学习效果也就越好。但是在实际的试验中发现,随着卷积层和池化层的叠加,不但没有出现学习效果越来越好的情况,反而出现梯度消失(若每一层的误差梯度小于1,反向传播时网络越深,梯度越趋近于0)或梯度爆炸(若每一层的误差梯度大于1,反向传播时网络越深,梯度越来越大)、退化的问题(随着层数的增加,预测效果反而越来越差)。

        因此,在 “plain” 网络中(卷积层、池化层、全连接层的堆叠,不存在残差连接),随着层数的增加,训练错误的最小值并没有提升,梯度通过反向传播逐渐回传到之前的位置,梯度越来越小以至于到最后就没什么梯度了,由于存储方式是浮点数,小于某个数值就视为0。但模型越深,在理论上效果会越好。为了解决梯度消失或梯度爆炸问题,ResNet提出通过数据的预处理以及在网络中使用BN(Batch Normalization)层来解决。为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为残差网络。最终使得网络结构超过1000层,并取得了很好的性能。

2. 提出residual(残差结构)模块

        “残差” 指的是输入和输出之间的差异。在传统的深层网络中,模型直接学习输入到输出的映射,这对于层数较深的网络来说,会导致训练困难,因为信号在网络中传播时容易丧失。残差连接通过让每一层学习“输入与目标输出之间的差异”,模型不再学习一个完整的映射 x→y ,而是学习一个小的“改动”或者“残差” F(x),有效避免了这个问题。在深层网络中,原始映射 x→y 可能非常复杂,而通过学习“差异”来调整网络参数通常会更高效。短路线相当于短路操作,在进行反向传播的时候,可以看作是将模型拆成了两个模型进行分别训练,也能更好的进行梯度的传递。

        shortcut 之后并不是通过简单的加法,由于CNN网络中做每一层的时候会发生维度的变化,所以我们需要用到1x1卷积层来调整维度,这也就是为什么有的残差连接是虚线而有些连接是实线。虚线残差结构将图像的高、宽和深度都改变了,实线残差结构的输入、输出特征矩阵维度是一样的,故可以直接进行相加。

3. Batch Normalization(BN)

        BN的目的是使一批(batch)数据所对应feature map的每一个channel的维度满足均值为0、方差为1的分布规律。通过这种方法能够加速网络的收敛并提升准确率。理论上是指整个训练样本集所对应feature map的数据要满足分布规律,也就是说,在计算出整个训练集的feature map之后,再进行标准化处理,但这对于一个大型数据集来说明显是不可能的。所以,我们就一个批次一个批次地进行处理,就是对于一个batch数据的feature map,分别对R、G、B三通道进行处理。在这个过程中,计算得到的 μ 和 \sigma^2 是一个向量而不是一个值,向量的每一个元素代表着一个维度的值。

        训练网络的过程是通过一个批次一个批次的数据进行训练的。但在预测过程通常都是输入一张图片进行预测,即batch_size=1,此时如果再通过上述方法计算均值和方差就没有意义了。所以,在训练过程中要不断地计算每个batch的均值和方差,并使用移动平均的方法记录统计的均值和方差,训练完后可以近似地认为所统计的均值和方差就等于整个训练集的均值和方差。在验证以及预测的过程中,就使用统计得到的均值和方差进行标准化处理。

        BN层让损失函数更平滑,添加BN层后,损失函数的landscape变得更平滑,相比高低不平上下起伏的loss surface,平滑loss surface的梯度预测性更好,可以选取较大的步长。同时,没有BN层的情况下,网络没办法直接控制每层输入的分布,其分布前面层的权重共同决定,或者说分布的均值和方差“隐藏”在前面层的每个权重中,网络若想调整其分布,需要通过复杂的反向传播过程调整前面的每个权重实现,BN层的存在相当于将分布的均值和方差从权重中剥离了出来,只需调整γ和β两个参数就可以直接调整分布,让分布和权重的配合变得更加容易。

三、代码

import torch.nn as nn
import math
from utee import misc
from collections import OrderedDict__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101','resnet152']model_urls = {'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth','resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth','resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth','resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth','resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
}def conv3x3(in_planes, out_planes, stride=1):# "3x3 convolution with padding"return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False)class BasicBlock(nn.Module):expansion = 1def __init__(self, inplanes, planes, stride=1, downsample=None):super(BasicBlock, self).__init__()m = OrderedDict()m['conv1'] = conv3x3(inplanes, planes, stride)m['bn1'] = nn.BatchNorm2d(planes)m['relu1'] = nn.ReLU(inplace=True)m['conv2'] = conv3x3(planes, planes)m['bn2'] = nn.BatchNorm2d(planes)self.group1 = nn.Sequential(m)self.relu= nn.Sequential(nn.ReLU(inplace=True))self.downsample = downsampledef forward(self, x):if self.downsample is not None:residual = self.downsample(x)else:residual = xout = self.group1(x) + residualout = self.relu(out)return outclass Bottleneck(nn.Module):expansion = 4def __init__(self, inplanes, planes, stride=1, downsample=None):super(Bottleneck, self).__init__()m  = OrderedDict()m['conv1'] = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)m['bn1'] = nn.BatchNorm2d(planes)m['relu1'] = nn.ReLU(inplace=True)m['conv2'] = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)m['bn2'] = nn.BatchNorm2d(planes)m['relu2'] = nn.ReLU(inplace=True)m['conv3'] = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)m['bn3'] = nn.BatchNorm2d(planes * 4)self.group1 = nn.Sequential(m)self.relu= nn.Sequential(nn.ReLU(inplace=True))self.downsample = downsampledef forward(self, x):if self.downsample is not None:residual = self.downsample(x)else:residual = xout = self.group1(x) + residualout = self.relu(out)return outclass ResNet(nn.Module):def __init__(self, block, layers, num_classes=1000):self.inplanes = 64super(ResNet, self).__init__()m = OrderedDict()m['conv1'] = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)m['bn1'] = nn.BatchNorm2d(64)m['relu1'] = nn.ReLU(inplace=True)m['maxpool'] = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)self.group1= nn.Sequential(m)self.layer1 = self._make_layer(block, 64, layers[0])self.layer2 = self._make_layer(block, 128, layers[1], stride=2)self.layer3 = self._make_layer(block, 256, layers[2], stride=2)self.layer4 = self._make_layer(block, 512, layers[3], stride=2)self.avgpool = nn.Sequential(nn.AvgPool2d(7))self.group2 = nn.Sequential(OrderedDict([('fc', nn.Linear(512 * block.expansion, num_classes))]))for m in self.modules():if isinstance(m, nn.Conv2d):n = m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()def _make_layer(self, block, planes, blocks, stride=1):downsample = Noneif stride != 1 or self.inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv2d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(planes * block.expansion),)layers = []layers.append(block(self.inplanes, planes, stride, downsample))self.inplanes = planes * block.expansionfor i in range(1, blocks):layers.append(block(self.inplanes, planes))return nn.Sequential(*layers)def forward(self, x):x = self.group1(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.avgpool(x)x = x.view(x.size(0), -1)x = self.group2(x)return xdef resnet18(pretrained=False, model_root=None, **kwargs):model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)if pretrained:misc.load_state_dict(model, model_urls['resnet18'], model_root)return modeldef resnet34(pretrained=False, model_root=None, **kwargs):model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)if pretrained:misc.load_state_dict(model, model_urls['resnet34'], model_root)return modeldef resnet50(pretrained=False, model_root=None, **kwargs):model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)if pretrained:misc.load_state_dict(model, model_urls['resnet50'], model_root)return modeldef resnet101(pretrained=False, model_root=None, **kwargs):model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)if pretrained:misc.load_state_dict(model, model_urls['resnet101'], model_root)return modeldef resnet152(pretrained=False, model_root=None, **kwargs):model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs)if pretrained:misc.load_state_dict(model, model_urls['resnet152'], model_root)return model

参考资料:

ResNet——CNN经典网络模型详解(pytorch实现)_resnet-cnn-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_44023658/article/details/105843701Batch Normalization(BN)超详细解析_batchnorm在预测阶段需要计算吗-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_44023658/article/details/105844861你必须要知道CNN模型:ResNet - 知乎icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/31852747

相关文章:

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出,在CVPR 2016发表影响深远的网络模型,由何凯明团队提出来,在ImageNet的分类比赛上将网络深度直接提高到了152层,前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…...

zookeeper学习

解决什么问题? 首先来分析下业务对象,才能对解决的问题进行归纳和总结。它解决的事分布式应用的问题,那么分布式应用会存在哪里问题是由它的业务特性来决定的,这些问题已是为了解决业务的问题。分布式的业务特征有哪些&#xff1…...

Monkey结合appium模拟操作特定界面

目录 1. 使用 Monkey 操作特定界面(通过UI标识来限制) 2. 结合 uiautomator 或 appium 定位特定元素 步骤: 3. 使用 Monkey Appium 控制特定界面点击 4. 如何结合 Appium 与 Monkey 5. 限制 Monkey 只点击固定界面上的元素 使用 --pc…...

智能指针【C++11】

文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针,auto_ptr通过管理权转移的方式解决智能指针的拷贝问题,保证一个资源…...

plsql 执行存储过程 SYS_REFCURSOR

关键字:plsql 执行存储过程 SYS_REFCURSOR 在PL/SQL中,SYS_REFCURSOR是一种特殊的数据类型,用于表示引用游标,可以用来返回查询结果或者操作数据库中的结果集。 以下是一个使用SYS_REFCURSOR执行存储过程的例子: CR…...

git修改某次commit(白痴版)

第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…...

设计模式:19、桥接模式

目录 0、定义 1、桥接模式的四种角色 2、桥接模式的UML类图 3、示例代码 0、定义 将抽象部门与实现部分分离,使它们都可以独立地变化。 1、桥接模式的四种角色 抽象(Abstraction):一个抽象类,包含实现者&#xf…...

闭包函数的基础知识

上期文章 1. 函数装饰器 2.闭包 2.1变量作用域 python有3种变量作用域 模块全局作用域:在类或函数外部分配定义的。函数局部作用域:通过参数或者在函数主体中定义的。第3种作用域:闭包中的变量环境 2.2全局变量和局部变量 def fun(a):print(a)print(b)fun(10)10---------…...

python3D圣诞树

import pygame import math from pygame.locals import *# 初始化Pygame pygame.init()# 设置屏幕尺寸和标题 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(3D 圣诞树)# 设置颜色 GREEN (34, 139, 34) BROWN (139,…...

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…...

[代码随想录09]字符串2的总结

前言 处理字符串主要是有思路,同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣(LeetCode) 55. 右旋字符串(第八期模拟笔试) 一、翻转字符串里的单词 这个题目的主要思路,代码采用从后往前遍历字…...

C语言程序设计P5-3【应用函数进行程序设计 | 第三节】——知识要点:函数的嵌套调用和递归调用

知识要点:函数的嵌套调用和递归调用 视频 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求用递归法求 n!。 我们知道n!n(n-1)(n-2)……1n(n-1)!递归公式为: 1.上面公式分解为n!n(n-1)!,即将求n!的问题变为…...

【Java】protobuf-maven-plugin主动下载protoc编译proto文件

背景: 我们hadoop的代码里,配置的是3.7.1的protocol buffer,但是编译环境上安装的是2.5.0。 能成功编译,且没有什么兼容性问题。这里非常好奇发生了什么,于是研究了一下protobuf-maven-plugin插件, 发现是他去下载的 在使用protobuf-maven-plugin插件时,我们一般会这么…...

Go学习:变量

目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息,变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中,变量名的命名规则 与其他编程语言一样,都是由字母、数…...

AllegroHand 四指灵巧手:机器人领域的创新力量

Allegro Hand 作为一款高性价比且适应性强的机器人四指灵巧手,凭借其四根手指和十六个独立的电流控制接头,成为机器人复杂抓握、柔性操作以及触觉传感器等研究领域的理想之选。 Allegrohand 四指灵巧手技术特点 机械结构 Allegro Hand的机械结构设计高…...

蓝桥杯准备训练(lesson3 ,c++)

变量与常量 4.1 变量的创建4.2 变量初始化4.3 变量的分类4.4 常量4.4.1 字⾯常量4.4.2 #define定义常量4.4.3 const定义常量4.5 练习练习1:买票练习2:AB问题练习3:鸡兔同笼 4.1 变量的创建 了解清楚了类型,我们使⽤类型做什么呢&…...

Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方面仍存在一些挑战。比如,在不同机器上复用相…...

小红薯x-s算法最新补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置,本篇文章就直接开始撸代码吧 如果没看过的话可以看:小红薯最新x-s算法分析12-06(x-s 56)(上)-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...

强化ASPICE合规与认可度:关键策略与实践路径

确保ASPICE(Automotive SPICE)标准的合规性和认可度,是一个涉及多方面努力和持续改进的过程。以下是一些关键步骤和建议,以帮助企业实现这一目标: 一、熟悉ASPICE标准 深入阅读和理解:首先,需要…...

没有合理使用线程池,引发的生产环境BUG

引言 随着多线程和并发处理需求的增加,线程池成为了提升系统性能的重要工具。Java 提供了强大的 ThreadPoolExecutor 类,能够高效地管理线程池,减少线程创建和销毁的开销。然而,当线程池达到其最大容量时,如何优雅地处…...

异步处理与后台任务管理:在 FastAPI 中实现高级特性

异步处理与后台任务管理:在 FastAPI 中实现高级特性 目录 ⚡ 背景任务与异步处理概述🛠️ 使用 BackgroundTasks 执行后台任务🚀 异步视图函数:使用 async 和 await🔄 处理并发任务:提升应用性能与响应能…...

ceph存储池

1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区,专门用来存储对象的 特点 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响,过多和过少…...

STM32基于HAL库的串口接收中断触发机制和适用场景

1. HAL_UART_Receive_DMA函数 基本功能 作用:启动一个固定长度的 DMA 数据接收。特点: 需要预先指定接收数据的长度(Size 参数)。DMA 会一直工作直到接收到指定数量的数据,接收完成后触发 HAL_UART_RxCpltCallback 回…...

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…...

Q3收入回退,盈利与商业化落地步履艰难,文远知行亟待背水一战

撰稿|行星 来源|贝多财经 12月2日,全球商业杂志《Fortune》(财富)揭晓了2024年“未来50强”(The Future 50)企业榜单,上市不久的全球Rbotaxi第一股文远知行(NASDAQ:WRD)位列第26名…...

如何利用Java爬虫获得商品类目

在当今数字化时代,数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场…...

Charts 教程:创建交互式图表的基础

ECharts 是一个开源的、基于 JavaScript 的数据可视化库,它可以帮助你快速创建交互式的图表。无论是简单的柱状图、折线图,还是复杂的地图和关系图,ECharts 都能够轻松应对。本文将带你了解如何在你的网页中使用 ECharts 创建图表&#xff0c…...

Jackson - JsonGenerator创建JSON、JsonParser解析JSON

以下是关于如何使用Jackson的JsonGenerator类来创建JSON内容以及如何使用JsonParser类来读取JSON内容的教程。 依赖项 首先&#xff0c;在pom.xml文件中添加以下依赖项以引入Jackson库&#xff1a; <dependency><groupId>com.fasterxml.jackson.core</groupI…...

数据结构与算法——1202—排序递归

1、选择排序 #include<iostream> #include<vector> using namespace std;void SelectSort(vector<int>& nums) {int i;int j;int minIndex;int length nums.size();if (length 0 || length 1) return;for (i 0; i < length-1; i)//遍历所有元素{…...

Lattice Radiant Software Lattice Propel Builder Lattice Propel 2024.1 安装

因项目需要&#xff0c;对Lattice 器件LIFCL-40 CrossLink进行评估 先从Lattice官网下载Radiant安装包&#xff1a; Lattice Radiant设计软件 新建工程环境...

【Linux系统】 Linux内核与UNIX设计哲学的结合

Linux 内核虽然不是 UNIX 的直接衍生物&#xff0c;但它深受 UNIX 设计哲学的影响。Linux 的开发者&#xff0c;尤其是 Linus Torvalds&#xff0c;在设计和实现 Linux 时&#xff0c;借鉴了 UNIX 的核心思想&#xff0c;使 Linux 成为一个类 UNIX 系统。 以下从 UNIX 设计哲学…...

MKS EDGE Series RF Generators Power Solution 软件

MKS EDGE Series RF Generators Power Solution 软件...

【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 去除缺失数据2.5 面积、价格、单价、楼层、建筑时间数据提取2.6 朝向数据处理 &#x1f3f3;️‍&#x1f308; 3. 特…...

MyBatis-Plus分页查询方式

分页查询基本方式 SpringBootTest(classes LearningApplication.class) public class MPTest {AutowiredILearningLessonService lessonService;Testpublic void test(){/*** Page<LearningLesson>&#xff1a;MyBatisPlus提供的分页对象* 1&#xff1a;当前页数* 2&am…...

分布式cap

P&#xff08;分区安全&#xff09;都能保证&#xff0c;就是在C&#xff08;强一致&#xff09;和A&#xff08;性能&#xff09;之间做取舍。 &#xff08;即立马做主从同步&#xff0c;还是先返回写入结果等会再做主从同步。类似的还有&#xff0c;缓存和db之间的同步。&am…...

【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。

文章目录 前言一、简单版Tabs代码实现&#xff1a; 二、下划线带动画的TabsAPI回顾&#xff1a;代码实现&#xff1a; 三、内容区域滑动切换切换动画代码实现&#xff1a;&#xff08;2&#xff09;禁用手势滑动切换&#xff08;3&#xff09;内容区域换为插槽 四、标签栏可滚动…...

AI在SEO中的应用与关键词优化探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术为搜索引擎优化&#xff08;SEO&#xff09;带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断&#xff0c;而AI则通过算法分析海量数据&#xff0c;提供更加精准和高效的方式优化关键词…...

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…...

如何使用锁实现多进程和多线程的并发执行的安全

多进程和多线程的并发&#xff1a; 多进程和多线程的并发意思是在同一段时间内&#xff0c;多个进程或者线程一起执行&#xff0c;但是这些进程或者线程的执行并不是真正意义上在同一时刻执行&#xff0c;而是在不同的时间里执行&#xff0c;因为每个CPU在同一时间只能处理同一…...

LabVIEW如何用运动控制卡实现伺服电机的转矩控制?

在LabVIEW中&#xff0c;使用运动控制卡实现伺服电机的转矩控制&#xff0c;通常通过以下几个步骤来完成。这里将结合LabVIEW的运动控制功能和伺服电机控制的基本原理进行详细介绍。 ​ 1. 选择合适的运动控制卡 要实现伺服电机的转矩控制&#xff0c;首先需要一张支持伺服电…...

SQL面试题——百度SQL面试题 无效搜索

百度SQL面试题 无效搜索 今天的题目是来自百度的SQL 面试题目 现有一份用户搜索日志,包含用户ID,时间,用户搜索内容。定义 无效搜索:如果用户下一次搜索内容中包含本次搜索内容,则认为本次搜索为无效搜索。请查询用户无效搜索记录 +---------+---------------------+--…...

媒体查询、浏览器一帧渲染过程

文章目录 媒体查询语法示例根据视口宽度应用不同的样式根据设备像素比应用不同的样式根据方向应用不同的样式 使用场景 浏览器一帧的渲染过程 媒体查询 媒体查询&#xff08;Media Query&#xff09;是CSS3中的一个重要特性&#xff0c;它允许开发者根据设备的特定条件&#x…...

实习工作日志

工作日志 遇到的bug 由于不熟悉Python&#xff0c;造成了这个bug python的浅拷贝与深拷贝&#xff0c;一定要创建新的变量&#xff0c;否则只是单纯拷贝地址...

JavaWeb学习--cookie和session

目录 &#xff08;一&#xff09;Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​&#xff08;Cookie的生命&#xff09; &#xff08;二&#xff09; Cookie的API 1.创建Cookie&#xff1a;new 构造方法 2.保存到客户端浏…...

ETCD的封装和测试

etcd是存储键值数据的服务器 客户端通过长连接watch实时更新数据 场景&#xff1a; 当主机A给服务器存储 name&#xff1a; 小王 主机B从服务器中查name ,得到name-小王 当主机A更改name 小李 服务器实时通知主机B name 已经被更改成小李了。 应用&#xff1a;服务注册与发…...

c++引用笔记

1 引用的基本使用 // 引用 // 作用&#xff1a;给变量起别名 // 语法&#xff1a;数据类型 &别名 原名int main(int argc, char const *argv[]) {int a 10;int &b a;cout << "a " << a << endl;cout << "b " <&l…...

macOS运行amd64的镜像

在macOS上运行amd64&#xff08;x86_64&#xff09;架构的镜像&#xff0c;通常通过虚拟化或仿真工具来实现。例如&#xff0c;如果你使用的是基于Apple Silicon&#xff08;M1或M2等&#xff09;芯片的Mac&#xff0c;那么你的处理器是ARM架构的&#xff0c;而amd64是x86架构&…...

Oracle查询优化:高效实现仅查询前10条记录的方法与实践

在 Oracle 中&#xff0c;实现仅查询前10条记录的四种方法 1. 使用 ROWNUM 查询 ROWNUM 是 Oracle 中的伪列&#xff0c;用于限制返回的行数。 SELECT * FROM table_name WHERE condition AND ROWNUM < 10;condition&#xff1a;查询条件。ROWNUM < 10&#xff1a;限制…...

【时时三省】(C语言基础)结构体内存对齐

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题&#xff1a;计算结构体的大小。 这也是一个特别热门的考点&#xff1a;结构体内存对齐 示例&#xff1a; 第一个s如果根据字…...

工业物联网关

工业物联网关的定义与功能 定义&#xff1a;工业物联网关是一种在工业物联网&#xff08;IIoT&#xff09;系统中起到关键连接作用的设备。它位于工业现场设备&#xff08;如传感器、执行器等&#xff09;和上层的工业网络&#xff08;如企业内部网络、云平台等&#xff09;之间…...