三、计算机视觉_04AlexNet、VggNet、ResNet设计思想

1、AlexNet

1.1 基本介绍

AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet大规模视觉识别挑战赛(ILSVRC)中提出的,它不仅赢得了当届的比赛,还激发了后续许多创新的神经网络架构(如VGGNet、ResNet、GoogLeNet等)的开发

1.2 网络结构

AlexNet网络结构包括以下几个关键层:

  1. 卷积层(Convolutional Layer):使用多个卷积核提取图像特征
  2. 池化层(Pooling Layer):通常使用最大池化(Max Pooling)或平均池化(Average Pooling)来降低特征图的空间维度
  3. 全连接层(Fully Connected Layer):将特征展平铺并连接到输出层进行分类

AlexNet的具体网络结构如下:

  • 输入层:224x224像素的RGB三通道彩色图像

  • 第一层卷积:使用96个11x11的卷积核,步长为4,边缘填充数为2,输出96x55x55的特征图【(224 + 2*2 - 11) / 4 + 1 = 55】(备注:由于是两个GPU一起跑,所以图中显示的是两个48x55x55)

  • 第一层池化:3x3的最大池化,步长为2,边缘填充数为0,输出48x27x27的特征图【(55 + 2*0 - 3) / 2 + 1 = 27】(备注:同上,是两个48x27x27)

  • 第二层卷积:使用256个5x5的卷积核,步长为1,边缘填充数为2,输出128x27x27的特征图【(27 + 2*2 - 5) / 1 + 1 = 27】(备注:同上,是两个128x27x27)

  • 第二层池化:3x3的最大池化,步长为2,边缘填充数为0,输出128x13x13的特征图【(27 + 2*0 - 3) / 2 + 1 = 13】(备注:同上,是两个128x13x13)

  • 第三层卷积:使用384个3x3的卷积核,步长为1,边缘填充数为1,输出192x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个192x13x13)

  • 第四层卷积:使用384个3x3的卷积核,步长为1,边缘填充数为1,输出192x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个192x13x13)

  • 第五层卷积:使用256个3x3的卷积核,步长为1,边缘填充数为1,输出128x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个128x13x13)

  • 第五层池化:3x3的最大池化,步长为2,边缘填充数为0,输出128x6x6的特征图【(13 + 2*0 - 3) / 2 + 1 = 6】(备注:同上,是两个128x6x6)

  • 第一全连接层:将两个128x6x6的特征图展平,连接到两个2048维向量

  • 第二全连接层:两个2048维全连接到两个2048维向量(每个全连接层都可以看作是在进行特征组合,即使神经元的数量相同,第二个全连接层的每个神经元也都会是前一个全连接层所有神经元的加权和,这样的设计允许网络在更高层次上组合和抽象特征)

  • 第三全连接层:两个2048维全连接到1000维,代表1000个类别

1.3 创新点

  • ReLU激活函数:AlexNet是第一个在每一层卷积层之后使用ReLU激活函数的网络,与sigmoid激活函数不同,ReLU不会导致梯度消失问题,并且能加快训练速度
  • Dropout正则化:为了减少过拟合,AlexNet在全连接层之间引入了Dropout技术,随机丢弃一部分神经元,以减少神经元之间的依赖关系
  • 数据增强和多GPU训练:为了提高模型的鲁棒性和泛化能力,AlexNet使用了数据增强技术,并使用了两个GPU进行并行计算以加速训练

1.4 网络搭建

# 引入pytorch和nn神经网络
import torch
import torch.nn as nnclass AlexNet(nn.Module):"""自定义一个AlexNet神经网络"""def __init__(self, in_channels=3, n_classes=1000):"""初始化"""super().__init__()# 1. 特征抽取self.feature_extractor = nn.Sequential(# 第一层卷积nn.Conv2d(in_channels=in_channels,out_channels=96,kernel_size=11,stride=4,padding=2),nn.ReLU(inplace=True),# 第一层池化nn.MaxPool2d(kernel_size=3,stride=2,padding=0),# 第二层卷积nn.Conv2d(in_channels=96,out_channels=256,kernel_size=5,stride=1,padding=2),nn.ReLU(inplace=True),# 第二层池化nn.MaxPool2d(kernel_size=3,stride=2,padding=0),# 第三层卷积nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 第四层卷积nn.Conv2d(in_channels=384,out_channels=384,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 第五层卷积nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,stride=1,padding=1),# 第五层池化nn.MaxPool2d(kernel_size=3,stride=2,padding=0))# 2. 分类输出self.classifier = nn.Sequential(nn.Flatten(start_dim=1, end_dim=-1),nn.Linear(in_features=256, out_features=4096),nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(in_features=4096, out_features=4096),nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(in_features=4096, out_features=n_classes))def forward(self, x):"""前向传播"""# 1. 先做特征抽取x = self.feature_extractor(x)# 2. 再做分类回归x = self.classifier(x)return x

2、VggNet

2.1 基本介绍

VggNet是由牛津大学的视觉几何组(Visual Geometry Group)在2014年ImageNet大规模视觉识别挑战赛(ILSVRC)中提出的,在当届比赛中取得了第二名的成绩

2.2 网络结构

VggNet网络结构同样包括以下几个关键层:

  1. 卷积层(Convolutional Layer):使用多个卷积核提取图像特征
  2. 池化层(Pooling Layer):通常使用最大池化(Max Pooling)或平均池化(Average Pooling)来降低特征图的空间维度
  3. 全连接层(Fully Connected Layer):将特征展平铺并连接到输出层进行分类

以Vgg16(即:图中D列所对应的网络)为例,具体网络结构如下:

  • 输入层:224x224像素的RGB三通道彩色图像

  • 卷积层C1:使用64个3x3的卷积核,步长为1,边缘填充数为1,输出64x224x224的特征图【(224 + 2*1 - 3) / 1 + 1 = 224】

  • 卷积层C2:使用64个3x3的卷积核,步长为1,边缘填充数为1,输出64x224x224的特征图【(224 + 2*1 - 3) / 1 + 1 = 224】

  • 池化层S1:2x2的最大池化,步长为2,边缘填充数为0,输出64x112x112的特征图【(224 + 2*0 - 2) / 2 + 1 = 112】

  • 卷积层C3:使用128个3x3的卷积核,步长为1,边缘填充数为1,输出128x112x112的特征图【(112 + 2*1 - 3) / 1 + 1 = 112】

  • 卷积层C4:使用128个3x3的卷积核,步长为1,边缘填充数为1,输出128x112x112的特征图【(112 + 2*1 - 3) / 1 + 1 = 112】

  • 池化层S2:2x2的最大池化,步长为2,边缘填充数为0,输出128x56x56的特征图【(112 + 2*0 - 2) / 2 + 1 = 56】

  • 卷积层C5:使用256个3x3的卷积核,步长为1,边缘填充数为1,输出256x56x56的特征图【(56 + 2*1 - 3) / 1 + 1 = 56】

  • 卷积层C6:使用256个3x3的卷积核,步长为1,边缘填充数为1,输出256x56x56的特征图【(56 + 2*1 - 3) / 1 + 1 = 56】

  • 卷积层C7:使用256个3x3的卷积核,步长为1,边缘填充数为1,输出256x56x56的特征图【(56 + 2*1 - 3) / 1 + 1 = 56】

  • 池化层S3:2x2的最大池化,步长为2,边缘填充数为0,输出256x28x28的特征图【(56 + 2*0 - 2) / 2 + 1 = 28】

  • 卷积层C8:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x28x28的特征图【(28 + 2*1 - 3) / 1 + 1 = 28】

  • 卷积层C9:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x28x28的特征图【(28 + 2*1 - 3) / 1 + 1 = 28】

  • 卷积层C10:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x28x28的特征图【(28 + 2*1 - 3) / 1 + 1 = 28】

  • 池化层S4:2x2的最大池化,步长为2,边缘填充数为0,输出512x14x14的特征图【(28 + 2*0 - 2) / 2 + 1 = 14】

  • 卷积层C11:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x14x14的特征图【(14 + 2*1 - 3) / 1 + 1 = 14】

  • 卷积层C12:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x14x14的特征图【(14 + 2*1 - 3) / 1 + 1 = 14】

  • 卷积层C13:使用512个3x3的卷积核,步长为1,边缘填充数为1,输出512x14x14的特征图【(14 + 2*1 - 3) / 1 + 1 = 14】

  • 池化层S5:2x2的最大池化,步长为2,边缘填充数为0,输出512x7x7的特征图【(14 + 2*0 - 2) / 2 + 1 = 7】

  • 全连接层F14:将512x7x7的特征图展平,连接到4096维向量

  • 全连接层F15:4096维全连接到4096维向量(每个全连接层都可以看作是在进行特征组合,即使神经元的数量相同,第二个全连接层的每个神经元也都会是前一个全连接层所有神经元的加权和,这样的设计允许网络在更高层次上组合和抽象特征)

  • 全连接层F16:4096维全连接到1000维,代表1000个类别

2.3 创新点

  • 小尺寸卷积核:VGGNet使用了较小的3x3的卷积核和较小的步幅来进行卷积操作,这样可以增加网络的深度而不增加参数数量

  • 重复卷积层:VGGNet引入了多次重复使用相同配置的卷积层,这种方法简化了网络结构的设计,同时提高了特征的非线性表达能力

2.4 网络搭建

# 引入pytorch和nn神经网络
import torch
import torch.nn as nnclass Vgg16(nn.Module):"""自定义一个Vgg16神经网络"""def __init__(self, in_channels=3, n_classes=1000):"""初始化"""super().__init__()# 1. 特征抽取self.feature_extractor = nn.Sequential(# 卷积层C1nn.Conv2d(in_channels=in_channels,out_channels=64,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C2nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 池化层S1nn.MaxPool2d(kernel_size=2,stride=2,padding=0),# 卷积层C3nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C4nn.Conv2d(in_channels=128,out_channels=128,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 池化层S2nn.MaxPool2d(kernel_size=2,stride=2,padding=0),# 卷积层C5nn.Conv2d(in_channels=128,out_channels=256,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C6nn.Conv2d(in_channels=256,out_channels=256,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C7nn.Conv2d(in_channels=256,out_channels=256,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 池化层S3nn.MaxPool2d(kernel_size=2,stride=2,padding=0),# 卷积层C8nn.Conv2d(in_channels=256,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C9nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C10nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 池化层S4nn.MaxPool2d(kernel_size=2,stride=2,padding=0),# 卷积层C11nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C12nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 卷积层C13nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,stride=1,padding=1),nn.ReLU(inplace=True),# 池化层S5nn.MaxPool2d(kernel_size=2,stride=2,padding=0))# 2. 分类输出self.classifier = nn.Sequential(nn.Flatten(start_dim=1, end_dim=-1),nn.Linear(in_features=512, out_features=4096),nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(in_features=4096, out_features=4096),nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(in_features=4096, out_features=n_classes))def forward(self, x):"""前向传播"""# 1. 先做特征抽取x = self.feature_extractor(x)# 2. 再做分类回归x = self.classifier(x)return x

3、ResNet

3.1 基本介绍

ResNet(残差网络)是由微软研究院的Kaiming He等人在2015年提出的,它在当年的ImageNet大规模视觉识别挑战赛(ILSVRC)中获得了冠军

3.2 网络结构

ResNet网络结构同样包括以下几个关键层:

  1. 卷积层(Convolutional Layer):使用多个卷积核提取图像特征
  2. 池化层(Pooling Layer):通常使用最大池化(Max Pooling)或平均池化(Average Pooling)来降低特征图的空间维度
  3. 全连接层(Fully Connected Layer):将特征展平铺并连接到输出层进行分类

在ResNet网络结构中,最重要的就是残差结构,残差结构可分为虚线和实线这两种类型

以ResNet-34的conv3_x中的残差矩阵为例,其虚线和实线的残差结构图分别如下

3.3 创新点

  • ResNet的核心思想是残差学习,将y=F(X)调整为y=F(X)+X,这样一来,网络的目标变为学习输入和输出之间的差异,而不是直接学习映射关系,通过残差学习,可以训练非常深的网络(例如1000层)
  • ResNet在每个卷积层后都使用了批量归一化(丢弃dropout),这有助于加速训练过程并提高模型的稳定性

3.4 网络搭建

3.4.1 虚线残差结构

# 引入pytorch和nn神经网络
import torch
from torch import nnclass ConvBlock(nn.Module):"""ResNet-34中conv3_x的虚线残差结构实现逻辑:y = F(x) + Conv(x)"""def __init__(self, in_channels=64, out_channels=128):"""初始化"""super().__init__()# 1、主线路self.stage = nn.Sequential(nn.Conv2d(in_channels=in_channels,out_channels=128,kernel_size=3,stride=2,padding=1,bias=False),nn.BatchNorm2d(num_features=128),nn.ReLU(),nn.Conv2d(in_channels=128,out_channels=out_channels,kernel_size=3,padding=1,stride=1,bias=False),nn.BatchNorm2d(num_features=out_channels))  # 2、短路层self.shortcut = nn.Sequential(nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=1,stride=2,padding=0,bias=False),nn.BatchNorm2d(num_features=out_channels))# 3、主线路与短路层相加后的ReLUself.relu = nn.ReLU()def forward(self, x):# 1、主线路处理f = self.stage(x)# 2、短路层处理s = self.shortcut(x)# 3、两部分相加h = f + s# 4、输出o = self.relu(h)return o

3.4.2 实线残差结构

# 引入pytorch和nn神经网络
import torch
from torch import nnclass IdentityBlock(nn.Module):"""ResNet-34中conv3_x的实线残差结构实现逻辑:y = F(x) + x"""def __init__(self, in_channels=64, out_channels=128):"""初始化"""super().__init__()# 1、主线路self.stage = nn.Sequential(nn.Conv2d(in_channels=in_channels,out_channels=128,kernel_size=3,stride=2,padding=1,bias=False),nn.BatchNorm2d(num_features=128),nn.ReLU(),nn.Conv2d(in_channels=128,out_channels=out_channels,kernel_size=3,padding=1,stride=1,bias=False),nn.BatchNorm2d(num_features=out_channels))  # 2、短路层(实线结构短路层无卷积)# 3、主线路与短路层相加后的ReLUself.relu = nn.ReLU()def forward(self, x):# 1、主线路处理f = self.stage(x)# 2、短路层处理(实线结构短路层无卷积)# 3、两部分相加h = f + x# 4、输出o = self.relu(h)return o

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

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

相关文章

基于SpringBoot的在线考试系统的设计与实现+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作,实现了数据自动采集、处理及报告生成,大幅提高了校准精度与效率,并有效降低了人为操作误差。 一、项目背景…

群控系统服务端开发模式-应用开发-前端上传配置功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下system文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><el-tabs type"border-card"><el-tab-pane v-if"$store.getters.butts.includes(ParamSystemIndexDeta…

VAM本体整合包,本体人物卡

已更至2024年11月】全网人物卡最全&#xff01;所见即所得解压既玩。资源整合包较大&#xff0c;选择性下载想玩什么下什么&#xff01;&#xff01;&#xff01; 1.包含上千付费级精品场景&#xff0c;新增数位神佬合集&#xff0c;新增绝版素材。 2.没有场景是没有灵魂的&…

jmeter常用配置元件介绍总结之监听器

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

蓝绿色电影风格滑板运动自拍照Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 蓝绿色电影风格的滑板运动自拍照&#xff0c;通过 Lightroom 调色&#xff0c;将滑板运动的活力与电影般的质感相结合。这种风格以独特的蓝绿色调为主&#xff0c;营造出一种神秘、宁静又充满活力的氛围&#xff0c;仿佛将瞬间定格成电影画面中的一帧。 预设信息 调…

通用定时器---输入捕获功能

目录 一、概念 二、输入捕获的结构图 三、配置的基本步骤 一、概念 STM32的输入捕获功能是一种强大的特性&#xff0c;他允许处理器捕获外部输入信号&#xff0c;并基于定时器抓取输入信号指定触发方式&#xff08;上升沿/下降沿&#xff09;之间的长度。这对于测量信号的脉…

Comsol 大功率超声波清洗机

大功率超声波清洗机是利用超声波在清洗液中产生的空化作用来清洗物体表面的设备。这种清洗机通常用于清洗工业零部件、实验器皿、医疗器械等物体&#xff0c;能够高效去除表面附着的污垢、油脂、细菌等。 大功率超声波清洗机的工作原理是通过超声波换能器将电能转换成机械振动…

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…

模板——实现泛型编程的有力武器

模板——实现泛型编程的有力武器 我们为什么需要模板&#xff1f;模板 前言&#xff1a;关于模板&#xff0c;相信大家都有所而闻&#xff0c;以下是我对C模板的个人看法&#xff0c;希望能够帮助到你们呀&#xff01; 我们为什么需要模板&#xff1f; 请到大家看这一段代码&a…

Hugging_Face下载

能进huggingface的就能翻过去 不行的话可以去参考这个:mojie.app 1.直接原网下载 2.git(小白勿入) 如果是Linux&#xff0c;可以搜一个叫HFD&#xff08;HuggingFace_Download&#xff09; Windows的git安装参考如下&#xff1a;Git安装 建议先看看这个文档&#xff0c; 如果…

C++之内存管理

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、C/C内存分配 二、 malloc、calloc、realloc、free 三、C内存管理方式 3.1 new/delete 操作内置类型 3.2 new和detele操作自定义类型…

QT适配最新版Android SDK

从AndroidStudio的SDK管理下载最新版SDK 从https://www.androiddevtools.cn/下载国内安卓SKDTools 这里下载SKDTools后不需要使用SDK Manager.exe下载SDK&#xff08;SDK Manager.exe下载的SDK都是旧版&#xff0c;没法支持新版本&#xff09;&#xff0c;直接使用从AndroidS…

Ubuntu 环境下通过 Apt-get 安装软件

操作场景 为提升用户在云服务器上的软件安装效率&#xff0c;减少下载和安装软件的成本&#xff0c;腾讯云提供了 Apt-get 下载源。在 Ubuntu 环境下&#xff0c;用户可通过 Apt-get 快速安装软件。对于 Apt-get 下载源&#xff0c;不需要添加软件源&#xff0c;可以直接安装软…

反转链表、链表内指定区间反转

反转链表 给定一个单链表的头结点pHead&#xff08;该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1&#xff09;&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 如当输入链表{1,2,3}时&#xff0c;经反转后&#xff0c;原链表变…

SpringCloud篇(服务网关 - GateWay)

目录 一、简介 二、为什么需要网关 二、gateway快速入门 1. 创建gateway服务&#xff0c;引入依赖 2. 编写启动类 3. 编写基础配置和路由规则 4. 重启测试 5. 网关路由的流程图 6. 总结 三、断言工厂 四、过滤器工厂 1. 路由过滤器的种类 2. 请求头过滤器 3. 默认…

MATLAB实现历史模拟法计算VaR(Value at Risk)

MATLAB实现历史模拟法计算VaR(Value at Risk) 历史模拟法&#xff08;Historical Simulation Method&#xff09;是一种用于计算风险值&#xff08;Value at Risk, VaR&#xff09;的非参数方法。它基于过去的资产价格或收益数据来估计未来的潜在损失。 MATLAB代码如下: 完整…

数据结构——红黑树

目录 一.红黑树 二.红黑树的实现 1.红黑树节点的定义 2.红黑树的插入 3.红黑树的遍历 4.检测红黑树 5.红黑树的查找 6.红黑树的性能 三.整体代码 1.RBTree.h 2.RBTree.cpp 一.红黑树 1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上…

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

Java集合ConcurrentHashMap——针对实习面试

目录 Java集合ConcurrentHashMapConcurrentHashMap的特性是什么&#xff1f;HashMap和ConcurrentHashMap的区别&#xff1f;说说ConcurrentHashMap的底层实现 Java集合ConcurrentHashMap ConcurrentHashMap的特性是什么&#xff1f; 线程安全性 多线程并发读写安全&#xff1a…