学途智助
首页
分类
标签
关于网站
登录
eeettt123
2025-03-07
42
作者编辑
八股 算法
# 1. 了解哪些检测算法 detr yolo detr 待补充 # 2.单阶段和双阶段g检测算法对比 yolo d单 maskrcnn 双 # detr 1. DETR (DEtection TRansformer) 结构概览 DETR 是一种基于 Transformer 的目标检测模型,它通过序列到序列的框架来直接预测目标的边界框和类别。其结构主要分为以下几个部分: ** backbone **: 通常是一个卷积神经网络(CNN),如 ResNet,用于提取输入图像的特征。 输出的特征图将用于后续的 Transformer 处理。 ** Transformer **: 包括编码器(Encoder)和解码器(Decoder)。 编码器从 backbone 提取的特征中学习上下文信息。 解码器生成一组目标查询(object queries),每个查询对应一个可能的目标。 ** 头部网络 **: 边界框预测头(Box Prediction Head):预测目标的边界框坐标。 分类头(Classification Head):预测目标的类别。 ** 匈牙利匹配 **: 通过匈牙利算法将预测的目标与真实目标进行匹配,计算损失函数。 # 2.maskrcnn Mask R-CNN 是一种用于实例分割的模型,它在 Faster R-CNN 的基础上增加了掩码预测分支。其结构主要分为以下几个部分: ** backbone **: 通常是一个 CNN,如 ResNet,用于提取输入图像的特征。 输出的特征图将用于后续的区域提议网络(RPN)和掩码预测。 ** 区域提议网络(RPN)**: 生成可能的目标区域(region proposals)。 每个提议区域对应一个可能的目标位置。 ** ROIAlign **: 将每个提议区域映射到特征图上,对齐特征。 解决 ROI 池化中坐标不精确的问题。 ** 头部网络 **: 边界框回归头(Box Regression Head):预测目标的边界框坐标。 分类头(Classification Head):预测目标的类别。 掩码预测头(Mask Prediction Head):预测目标的分割掩码。 # RPN ROI Pooling ROI Align 作用 # RPN (Region Proposal Network) RPN是深度学习中用于生成区域提议的网络,是Faster R-CNN的重要组成部分。 - **作用**:生成一系列可能包含目标的候选区域(Region Proposals),并预测每个候选区域属于目标的概率。 - **工作原理**: - **卷积层**:通过卷积层提取输入图像的特征图。这个特征图包含了图像的高级语义信息。 - **滑动窗口**:在特征图上滑动窗口,生成不同尺度和宽高比的锚框(anchor boxes)。 - **分类与回归**:对每个锚框进行分类和回归。分类用于判断锚框是否包含目标,回归用于调整锚框的位置和大小,使其更准确地包围目标。 # ROI Pooling (Region of Interest Pooling) ROI Pooling用于从不同大小的感兴趣区域(ROI)中提取固定大小的特征向量。 - **作用**:在目标检测任务中,将不同大小和形状的ROI映射到特征图上,并提取出统一大小的特征向量,以便后续网络处理。 - **工作原理**: - **映射ROI到特征图**:将原图中的ROI坐标映射到特征图上。这一步通常需要考虑特征图与原图的比例关系。 - **划分区域**:将映射后的ROI划分为相同大小的子区域。例如,如果目标输出大小为 \( k \times k \),则将ROI划分为 \( k \times k \) 个子区域。 - **池化操作**:在每个子区域内进行最大池化(Max Pooling)或平均池化(Average Pooling),提取每个子区域的特征值。 # ROI Align (Region of Interest Align) ROI Align是为了解决ROI Pooling中的量化问题而提出的改进方法。 - **作用**:在将原图中的ROI映射到特征图上时,避免了ROI Pooling中的两次量化取整操作,从而减少了候选区域的偏差。 - **工作原理**: - **映射ROI到特征图**:将原图中的ROI坐标映射到特征图上,保留映射回特征图的ROI的原始状态,不做取整操作。 - **划分区域**:将映射后的ROI划分为相同大小的子区域,每个子区域的边界也不做量化。 - **采样与插值**:在每个子区域内,计算固定数量(通常为4个)的采样点。对于每个采样点,使用双线性插值(Bilinear Interpolation)计算其特征值。 - **池化操作**:在每个子区域内对采样点的特征值进行最大池化或平均池化,提取每个子区域的特征值。 # ROI Pooling与ROI Align的区别 ROI Pooling与ROI Align的主要区别在于,ROI Pooling在映射和划分区域时会进行取整操作,而ROI Align通过双线性插值和非量化操作,能够更精确地提取ROI中的特征,减少信息丢失和偏差。因此,ROI Align在处理小目标或需要更精确特征提取的任务时,表现出更好的性能。 # 4.yolo系列介绍 检测为主。 不弄了 # 5.anchor的概念 # 6.anchor和 anchor free 概念 # 7.anchor free 的方法以及优势 7. Anchor-Free 方法及优势 主流 Anchor-Free 方法 基于中心点预测: CenterNet(2019): 直接预测物体的中心点热图(Heatmap),并回归尺寸和偏移量。 优势:简单高效,支持多种任务(检测、姿态估计等)。 FCOS(2019): 将特征图上的每个点视为“锚点”,预测该点到物体边界框的距离(上、下、左、右)。 优势:无需设计锚框参数,减少超参数依赖。 基于角点或关键点: CornerNet(2018): 预测物体的左上角和右下角点,通过嵌入向量(Embedding)匹配角点对。 优势:避免锚框的尺寸限制,适合不规则物体。 RepPoints(2019): 用一组可学习的点表示物体,通过点集回归生成边界框。 优势:更精细的物体表征能力。 基于密集预测: DenseBox(2015): 直接在特征图上预测每个像素的类别和边界框偏移量。 优势:适用于小物体检测(如人脸)。 Anchor-Free 的优势 简化设计: 无需手动设计锚框尺寸和比例,减少调参成本。 降低计算开销: 避免锚框与真实框的复杂匹配过程(如 IoU 计算),提升训练效率。 更好的灵活性: 直接建模物体位置分布,适应极端尺寸或长宽比的物体(如电线杆、书本)。 减少内存占用: 省去存储大量锚框参数的开销,适合移动端部署。 挑战与局限性 小物体检测:部分方法在密集小物体场景中性能较差(如人群检测)。 后处理复杂度:某些方法依赖复杂的后处理(如角点匹配)。 总结 Anchor-Based:依赖预定义框,适合需要高召回率的场景(如通用目标检测)。 Anchor-Free:简化流程,更适合资源受限或物体尺寸多变的场景(如无人机、移动端应用)。 趋势:现代模型(如 YOLOv8、DETR)逐渐转向 Anchor-Free,结合 Transformer 或动态预测进一步提升性能。 # 8.Focal loss 讲一下 **Focal Loss 的公式在交叉熵损失的基础上引入了一个动态调节因子,以降低易分类样本的权重,使模型更加关注难分类的样本** Focal Loss 公式 FL(p_t) = -alpha_t * (1 - p_t)^gamma * log(p_t) 其中: p_t 是模型对样本的预测概率(对于正样本,p_t 是预测为正的概率;对于负样本,p_t 是预测为负的概率的补集)。 alpha_t 是调节正负样本权重的参数。 gamma 是调节难易样本权重的参数(也称为聚焦参数)。 详细解释 预测概率: 对于正样本,p_t = p(预测为正的概率)。 对于负样本,p_t = 1 - p(预测为负的概率的补集)。 动态调节因子: (1 - p_t)^gamma 是动态调节因子,用于降低易分类样本的权重。 当 p_t 接近 1 时(即样本易分类),(1 - p_t)^gamma 趋近于 0,从而降低了该样本的损失贡献。 当 p_t 较小时(即样本难分类),(1 - p_t)^gamma 接近 1,损失贡献相对较大。 正负样本权重调节: alpha_t 用于调节正负样本之间的权重比例,以缓解正负样本不平衡的问题。 # 9.1OU GIOU CIOU 区别 IOU_Loss:主要考虑检测框和目标框重叠面积。\n\nGIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。\n\nDIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。\n\nCIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。\n\nYolov5中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些 # 10.NMS soft NMS 讲一下 NMS 的本质是搜索局部极大值,抑制非极大值元素。\n\n非极大值抑制,主要就是用来抑制检测时冗余的框。因为在目标检测中,在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,所以我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框 # # 11.卷积和可形变卷积 可形变的 有点像膨胀卷积,但是膨胀卷积是自动设定好的,可形变是根据参数自动变化的 # 12.ResNet MobileNet v1-v3网络 https://blog.csdn.net/weixin_43702653/article/details/123766769 mobilenet V1 **核心思想:提出Depthwise卷积和Pointwise卷积的组合,即Depthwise Separable卷积。Depthwise卷积对每个输入通道单独进行卷积,不改变通道数;Pointwise卷积通过1×1卷积扩展通道数。** 可见经典卷积所需计算量巨大,所以Mobilenet_v1提出了Depthwise卷积概念,每一个filler只对一层channel卷积计算,所以说input的通道数等于output的通道数,如下图所示: 那么输出和输入是对应的,怎么能扩展通道数呢,这里Mobilenet_v1又提出了Pointwise卷积概念,实际上就是通过Conv 1*1卷积,扩大了通道数,没什么特殊的,如下图所示: 综上所述,Mobilenet_v1实际上就是depthwise卷积 + Pointwise卷积 的组合,作者又将他们整合成一个叫Depthwise Seperable卷积,整个Mobilenet_v1的核心步骤可用下图表示出: 优势:大幅减少参数量和计算量,降低模型复杂度,提高模型的移植性。 激励函数:引入ReLU6,增加非线性与泛化能力,降低梯度爆炸风险。 Mobilenet V2 网络架构:延续V1的可分离卷积,借鉴Resnet思想,设计反残差网络(Shortcut模块),先用1×1卷积扩展通道数,再进行Depthwise卷积。 激活函数:用线性函数替代ReLU,避免ReLU对低维数据的影响。 优势:相比V1,模型效果有所提升,参数量和计算量进一步减少。 Mobilenet V3 **结构改进:借鉴V2的Shotcut结构,引入Squeeze-Excitation(SE)结构,通过注意力机制对特征图通道进行加权。 激活函数:用hard-swish替代swish,保持非线性变换的同时简化计算。 优势:在保持模型轻量级的同时,进一步提升模型性能,参数量和计算量得到更优化。** # 13.常见的优化器 1. 随机梯度下降(SGD) 原理:通过在每次迭代中使用一个随机选择的样本或小批量样本计算梯度,来更新模型的参数。SGD的更新规则为:θ = θ - η∇J(θ;x(i),y(i)),其中θ是模型参数,η是学习率,∇J(θ;x(i),y(i))是损失函数在样本(x(i),y(i))处的梯度。 特点:计算效率高,适合处理大规模数据集。但是,SGD的更新方向具有较高的方差,可能导致收敛速度较慢,且容易陷入局部最优。 适用场景:适用于数据规模较大,对收敛速度要求不是特别高的场景。 2. 动量(Momentum) 原理:在SGD的基础上,引入动量项来加速收敛。动量项通过累积历史梯度信息,使得模型参数在相关方向上能够更快地更新。动量优化器的更新规则为:v = γv + η∇J(θ),θ = θ - v,其中v是速度向量,γ是动量系数(通常取0.9左右)。 特点:能够加速SGD的收敛,减少参数震荡,提高模型的训练速度和稳定性。 适用场景:适用于需要加速收敛和减少参数震荡的场景。 3. Adagrad 原理:通过针对每个参数计算其历史梯度的平方和,并利用该值对学习率进行动态调整。Adagrad的更新规则为:Gt = Gt−1 + (∇θJ(θ))^2,θt+1 = θt - η∇θJ(θ) ./ (δ + √Gt),其中Gt是对角矩阵,δ是防止分母为零的小常数。 特点:能够根据参数的历史梯度自动调整学习率,对于稀疏数据和非平稳数据具有较好的适应性。但是,Adagrad的学习率会随着训练的进行而不断减小,可能导致最终的学习率过小。 适用场景:适用于处理稀疏数据和对学习率自适应调整有需求的场景。 4. RMSprop 原理:在Adagrad的基础上,对梯度的平方和进行指数加权平均,以减少学习率的剧烈变化。RMSprop的更新规则为:E[g2]t = ρE[g2]t−1 + (1 − ρ)(∇θJ(θ))^2,θt+1 = θt - η∇θJ(θ) ./ (√E[g2]t + ε),其中ρ是衰减率(通常取0.9左右),ε是防止分母为零的小常数。 特点:能够更稳定地调整学习率,避免学习率过快下降,提高模型的训练效果。 适用场景:适用于需要稳定学习率调整的场景,尤其是深度学习中的训练过程。 5**. Adam 原理:结合了动量和RMSprop的优点,通过计算梯度的一阶矩和二阶矩的指数加权平均,对参数进行更新。Adam可以看作是动量优化器和RMSprop优化器的结合版。Adam的更新规则为: 计算梯度的一阶矩和二阶矩的指数加权平均:mt = β1mt−1 + (1 − β1)∇θJ(θ),vt = β2vt−1 + (1 − β2)(∇θJ(θ))^2 对mt和vt进行偏差校正:mt = mt/(1 − β1^t),vt = vt/(1 − β2^t) 更新参数:θt+1 = θt - ηmt ./ (√vt + ε),其中β1和β2是超参数(通常取0.9和0.999),ε是防止分母为零的小常数。 特点:能够自适应地调整学习率,结合了动量和RMSprop的优点,具有较好的收敛速度和稳定性,是目前深度学习中最常用的优化器之一。 适用场景:适用于大多数深度学习任务,尤其是对收敛速度和稳定性要求较高的场景。** # 14.BN LN GN 区别 batch 神经元 可以在一个batch内部 gn 安祖分配 BN、LN、GN都是深度学习中的归一化方法。具体介绍如下: Batch Normalization(BN) 定义:在2015年提出,对每个batch内的数据进行归一化处理,使每个batch的数据具有相同的分布来加速训练过程. 原理:通**过计算每个batch中每个神经元的均值和方差,然后利用这些均值和方差对数据进行归一化处理,之后引入缩放和平移参数γ和β进行调整.** 计算方式:计算每个batch(即N方向)的均值和方差,对每个神经元的输入进行归一化。 优点:允许较大的学习率,减弱对初始化的强依赖性,保持隐藏层数值稳定,加速训练过程,还具有轻微的正则化作用. 缺点:当batch size较小时,计算的均值和方差不足以代表整个数据分布,效果会变差;当batch size过大时,会增加显存占用,导致训练时间增长,且可能固定梯度下降方向,难以更新. 适用场景:适用于固定深度的前向神经网络,如CNN,却不适用于RNN. Layer Normalization(LN) 定义:在2016年提出,对每个样本的所有神经元输入进行归一化处理. 原理:通过计算每个样本的均值和方差,对每个样本的所有神经元输入进行归一化处理. 计算方式:**对每个样本的通道(C方向)、高度(H方向)和宽度(W方向)的所有数据进行归一化。 优点:不需要批训练,在单条数据内部就能归一化,不依赖batch size和输入序列的长度,适用于batch size为1和RNN.** 缺点:在CNN上,效果不如BN。 适用场景:对深度网络的某一层的所有神经元的输入进行归一化,适用于RNN效果明显。 Group Normalization(GN) 定义:在2018年提出,是一种独立于batch的归一化方法. **原理:将通道数C分成G组,每组包含C/G个通道,然后在每组内进行归一化处理.** 计算方式:将每个样本的每个通道的特征图分成G组,对每组内的数据计算均值和方差,利用这些均值和方差对数据进行归一化。 优点:GN适用于占用显存较大的任务,如图像分割,且其效果在小batch size下较好,解决了BN在小batch size下效果差的问题. 缺点:需要人为指定分组数G,当G过大或过小时,可能会影响模型性能. 适用场景:适用图像分割、目标检测等需要小batch size训练的任务。 ## 按照通道 # 15.zero- shot 的检测算法 不认识 # 16.基于 clip 如何去做检测或者分割任务 不认识 好有趣的多模态,但是我没涉及 https://blog.csdn.net/weixin_44791964/article/details/129941386?ops_request_misc=%257B%2522request%255Fid%2522%253A%252259be6cd0477cadc6a74efe55488659e7%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=59be6cd0477cadc6a74efe55488659e7&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129941386-null-null.142^v102^pc_search_result_base8&utm_term=CLIP&spm=1018.2226.3001.4187 # 17.常见的分割网络有哪些 deeplab unet swin unet # 18.deeplab UNet 网络 空洞卷积(Atrous Convolution / Dilated Convolution) 这使得 DeepLab 能够在保持较高空间分辨率的同时,利用较大的感受野来获取丰富的上下文信息,这对语义分割非常有用。 多尺度推理(Multi-scale Context Aggregation) DeepLab 采用多种方法来聚合不同尺度的信息。例如,在早期版本中使用了多尺度输入图像进行推理;而在后来的版本中,则引入了空洞空间金字塔池化(ASPP, Atrous Spatial Pyramid Pooling),即在同一层应用多个不同膨胀率的空洞卷积核,以覆盖不同的尺度。 ASPP 可以看作是一种特殊的池化层,它通过组合来自不同尺度的感受野输出,增强了对多尺度物体的理解能力。 感觉这个模型非常的一般 **空洞卷积,aspp 空洞空间金字塔池化(ASPP, Atrous Spatial Pyramid Pooling g感觉一般 baseline模型** DeepLab 常常基于已有的大规模数据集(如 ImageNet)上预训练好的 CNN 模型(如 ResNet、Xception)作为骨干网络,然后针对特定的语义分割任务进行微调。这种迁移学习策略不仅提高了模型的初始表现,还减少了训练时间和计算资源需求。 # 19.CTC原理 根本没涉及 2. 算法知识:对 AI 算法(包括监督学习、无监督学习、强化学习、生成式模型等)有深入理解,熟悉博弈论相关算法,掌握其基本原理与应用场景。 2. 交叉熵的数学推导 交叉熵的数学推导 定义 交叉熵是衡量两个概率分布差异的指标。给定真实分布 p 和预测分布 q,交叉熵定义为: **H(p, q) = -sum(p(i) * log(q(i)))** # 3. 交叉熵的代码手写 ``` import numpy as np def cross_entropy(y_true, y_pred): """ 计算交叉熵损失 :param y_true: 真实标签 (one-hot 编码) :param y_pred: 预测概率 :return: 交叉熵损失 """ epsilon = 1e-12 # 防止 log(0) y_pred = np.clip(y_pred, epsilon, 1. - epsilon) return -np.sum(y_true * np.log(y_pred)) # 示例 y_true = np.array([1, 0, 0]) # one-hot 编码 y_pred = np.array([0.9, 0.05, 0.05]) loss = cross_entropy(y_true, y_pred) print(f"交叉熵损失: {loss}") ``` # 4. sigmoid的代码手写 ``` def sigmoid(x): """ 计算 sigmoid 函数 :param x: 输入值 :return: sigmoid 函数值 """ return 1 / (1 + np.exp(-x)) # 示例 x = 0.5 print(f"Sigmoid({x}): {sigmoid(x)}") ``` # 5. 手撕多头注意力 ``` import numpy as np def scaled_dot_product_attention(query, key, value, mask=None): """ 缩放点积注意力机制。 :param query: 查询矩阵,形状为 (batch_size, num_heads, seq_len, d_k) :param key: 键矩阵,形状为 (batch_size, num_heads, seq_len, d_k) :param value: 值矩阵,形状为 (batch_size, num_heads, seq_len, d_v) :param mask: 掩码矩阵,形状为 (batch_size, 1, seq_len, seq_len) :return: 输出注意力权重和加权后的值矩阵 """ # 计算 Q 和 K 的点积 attention_scores = np.matmul(query, key.transpose(-2, -1)) # (batch_size, num_heads, seq_len, seq_len) # 缩放分数 attention_scores = attention_scores / np.sqrt(query.shape[-1]) # 应用掩码(如果有的话) if mask is not None: attention_scores += (mask * -1e9) # 将掩码位置的分数设置为负无穷 # 计算注意力权重 attention_weights = np.softmax(attention_scores, axis=-1) # 应用权重到值矩阵 output = np.matmul(attention_weights, value) # (batch_size, num_heads, seq_len, d_v) return output, attention_weights def split_heads(x, num_heads): """ 将输入张量分割成多个头。 :param x: 输入张量,形状为 (batch_size, seq_len, d_model) :param num_heads: 头的数量 :return: 分割后的张量,形状为 (batch_size, num_heads, seq_len, d_k) """ batch_size, seq_len, d_model = x.shape d_k = d_model // num_heads x = x.reshape(batch_size, seq_len, num_heads, d_k) return x.transpose(0, 2, 1, 3) # 调整维度顺序 def combine_heads(x): """ 将多头的输出合并。 :param x: 输入张量,形状为 (batch_size, num_heads, seq_len, d_k) :return: 合并后的张量,形状为 (batch_size, seq_len, d_model) """ batch_size, num_heads, seq_len, d_k = x.shape d_model = num_heads * d_k x = x.transpose(0, 2, 1, 3) # 调整维度顺序 return x.reshape(batch_size, seq_len, d_model) def multi_head_attention(query, key, value, d_model, num_heads, mask=None): """ 多头注意力机制。 :param query: 查询矩阵,形状为 (batch_size, seq_len, d_model) :param key: 键矩阵,形状为 (batch_size, seq_len, d_model) :param value: 值矩阵,形状为 (batch_size, seq_len, d_model) :param d_model: 模型维度 :param num_heads: 头的数量 :param mask: 掩码矩阵,形状为 (batch_size, 1, seq_len, seq_len) :return: 多头注意力的输出 """ assert d_model % num_heads == 0, "d_model 必须能被 num_heads 整除" d_k = d_model // num_heads # 线性变换 W_Q = np.random.randn(d_model, d_model) W_K = np.random.randn(d_model, d_model) W_V = np.random.randn(d_model, d_model) Q = np.dot(query, W_Q) K = np.dot(key, W_K) V = np.dot(value, W_V) # 分头 Q = split_heads(Q, num_heads) K = split_heads(K, num_heads) V = split_heads(V, num_heads) # 缩放点积注意力 attention_output, attention_weights = scaled_dot_product_attention(Q, K, V, mask) # 合并头 output = combine_heads(attention_output) # 最后的线性变换 W_O = np.random.randn(d_model, d_model) output = np.dot(output, W_O) return output, attention_weights # 示例用法 if __name__ == "__main__": batch_size = 2 seq_len = 5 d_model = 16 num_heads = 4 query = np.random.randn(batch_size, seq_len, d_model) key = np.random.randn(batch_size, seq_len, d_model) value = np.random.randn(batch_size, seq_len, d_model) output, attention_weights = multi_head_attention(query, key, value, d_model, num_heads) print("多头注意力输出的形状:", output.shape) print("注意力权重的形状:", attention_weights.shape) ``` # 6. ReLU为什么能缓解梯度消失 ReLU 的定义 ReLU 函数定义为: f(x) = max(0, x) 其导数为: f'(x) = 1 if x > 0 else 0 缓解梯度消失的原因 传统激活函数(如 sigmoid 和 tanh)在输入绝对值较大时,导数趋近于零,导致梯度下降过程中梯度消失。ReLU 在正区间导数为 1,可以有效传递梯度,从而缓解梯度消失问题 # 8. AUC计算方法1 ``` def calculate_auc(fpr, tpr): """ 计算 AUC :param fpr: 假正例率 :param tpr: 真正例率 :return: AUC """ auc = 0 for i in range(1, len(fpr)): auc += (fpr[i] - fpr[i-1]) * (tpr[i] + tpr[i-1]) return auc / 2 # 示例 fpr = [0, 0.2, 0.4, 0.6, 0.8, 1] tpr = [0, 0.4, 0.8, 0.9, 0.95, 1] auc = calculate_auc(fpr, tpr) print(f"AUC: {auc}") ``` Python 装饰器作用 装饰器是一个函数,用于修改其他函数或方法的行为。装饰器的定义和使用如下: Python 复制 ``` def decorator(func): def wrapper(*args, **kwargs): print("调用函数前") result = func(*args, **kwargs) print("调用函数后") return result return wrapper ``` 10. KL散度 Softmax 函数将输入向量转换为概率分布,公式为: S(y_i) = exp(y_i) / sum(exp(y_j)) ``` def softmax(x): """ 计算 softmax :param x: 输入向量 :return: 概率分布 """ e_x = np.exp(x - np.max(x)) # 防止溢出 return e_x / e_x.sum() # 示例 x = np.array([1.0, 2.0, 3.0]) prob = softmax(x) print(f"Softmax 输出: {prob}") ``` # 11. softmax公式 **对于输入向量 x = [x1, x2, ..., xn],Softmax 函数的输出为: Softmax(x_i) = exp(x_i) / sum(exp(x_j))** ``` import numpy as np def softmax(x): """ 计算 Softmax 函数 :param x: 输入向量,形状为 (n,) 或二维矩阵 (batch_size, n) :return: Softmax 输出,形状与输入相同 """ # 防止数值溢出:减去每个样本的最大值 x = x - np.max(x, axis=-1, keepdims=True) exp_x = np.exp(x) return exp_x / np.sum(exp_x, axis=-1, keepdims=True) # 示例 x = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) # 二维输入 prob = softmax(x) print("Softmax 输出:") print(prob) ``` # 12. 梯度消失和梯度爆炸如何缓解 归一化, resnet 残差机制 ReLU 合适的激活函数 # 手撕NMS过程 一句话概括:NMS(非极大值抑制)通过按置信度排序并逐个保留最高置信度框,计算其与其他框的IoU,删除IoU高于阈值的重叠框,直到所有候选框处理完毕,从而去除冗余检测框,保留最优结果 ``` import numpy as np def calculate_iou(box1, box2): x1, y1, x2, y2 = box1 x1_p, y1_p, x2_p, y2_p = box2 xi1 = max(x1, x1_p) yi1 = max(y1, y1_p) xi2 = min(x2, x2_p) yi2 = min(y2, y2_p) inter_area = max(xi2 - xi1, 0) * max(yi2 - yi1, 0) box1_area = (x2 - x1) * (y2 - y1) box2_area = (x2_p - x1_p) * (y2_p - y1_p) union_area = box1_area + box2_area - inter_area iou = inter_area / union_area return iou def nms(boxes, scores, threshold): boxes = sorted(boxes, key=lambda x: scores[boxes.index(x)], reverse=True) result = [] while boxes: chosen_box = boxes.pop(0) result.append(chosen_box) boxes = [box for box in boxes if calculate_iou(chosen_box, box) < threshold] return result # 示例检测框的坐标和置信度分数 boxes = np.array([[10, 10, 40, 40], [11, 12, 43, 43], [9, 9, 39, 38]]) scores = np.array([0.9, 0.8, 0.7]) iou_thresh = 0.1 indices_to_keep = nms(boxes, scores, iou_thresh) print("保留的边界框索引:", indices_to_keep) ``` Avatar # 1. L1和L2正则的区别 L1和L2正则都是用于防止模型过拟合的正则化技术,但它们在实现方式和效果上有显著区别: 特性 L1正则化 L2正则化 定义 在损失函数中加入参数绝对值之和作为惩罚项。 在损失函数中加入参数平方和的平方根作为惩罚项。 稀疏性 产生稀疏解,使部分参数变为零。 不会使参数变为零,但会缩小参数的绝对值。 优化难度 惩罚项在零处不可微,优化较复杂。 惩罚项平滑可微,优化更高效。 应用场景 适用于特征选择和高维数据。 适用于防止过拟合,处理强相关性特征。 优点 自动选择重要特征,模型更简单。 防止过拟合,模型更稳定。 缺点 计算成本高,可能过于稀疏。 不进行特征选择,模型可能仍包含许多小权重。 # 2. BN(Batch Normalization)中可学习参数的获取 Batch Normalization(BN)是一种用于加速训练和提高模型稳定性的技术。它通过标准化每一层的输入,使网络的梯度传播更加稳定。BN层中有两个可学习参数:缩放因子(gamma)和偏移量(beta)。 获取方式:在训练过程中,BN层会计算输入数据的均值和方差,并使用这些统计量对输入进行标准化。然后,通过学习gamma和beta,将标准化后的数据重新调整到合适的范围。 作用:gamma和beta的引入使得BN层不仅可以标准化输入,还可以恢复数据的分布,从而允许网络学习到更有效的特征。 # 3. 缓解过拟合的方法 过拟合是指模型在训练集上表现良好,但在测试集上表现不佳的现象。以下是一些缓解过拟合的常用方法: **增加数据集**:更多的数据可以减少模型对训练集的过度拟合。 **数据增强**:通过对训练数据进行随机变换(如旋转、翻转、缩放等),增加数据的多样性。 **正则化**:如L1和L2正则化,通过在损失函数中加入惩罚项来限制模型复杂度。 **Dropout**:在训练过程中随机丢弃部分神经元,减少神经元之间的依赖。 提前停止:在验证集性能不再提升时停止训练。 减少模型复杂度:通过减少网络层数或神经元数量来降低模型复杂度。 # 4. Dropout介绍 Dropout是一种正则化技术,用于减少神经网络中的过拟合。 原理:在训练过程中,随机地将一部分神经元的输出设置为零,迫使网络学习更独立的特征。 作用:通过减少神经元之间的依赖,Dropout可以防止神经元共同适应训练数据,从而提高模型的泛化能力。 实现:Dropout通常应用于隐藏层,而不是输出层。在训练时,随机丢弃部分神经元;在测试时,所有神经元都参与计算,但输出会乘以一个缩放因子。 Dropout是一种简单而有效的正则化方法,广泛应用于深度学习模型中。 # mamba 以下是关于 Mamba模型 的原理速通解析(纯Markdown格式,无LaTeX): 1. 背景:状态空间模型(SSM) Mamba 基于 状态空间模型(State Space Model, SSM),传统 SSM 将序列数据建模为线性时不变(LTI)系统,通过隐状态传递信息。核心公式: 状态方程:h_t = A * h_{t-1} + B * x_t 输出方程:y_t = C * h_t + D * x_t A, B, C, D 是可学习参数。 传统 SSM 在长序列上计算效率低,且对输入不敏感。 2. Mamba 的核心改进 (1) 选择性状态空间(Selective SSM) 动态参数化:参数 B, C 和步长 Δ 随输入变化(传统 SSM 固定),使模型能选择性关注重要信息。 效果:类似注意力机制,但保持线性复杂度 O(L)(Transformer 是 O(L^2))。 (2) 硬件感知算法 并行化扫描:将递归计算转换为并行扫描(Parallel Scan),利用 GPU 并行加速。 内核融合:避免中间状态存储,减少内存读写(传统 SSM 的瓶颈)。 3. Mamba 架构 替代注意力机制:用 Mamba 块(SSM + 卷积) 替换 Transformer 中的自注意力层。 扫描操作(Scan Operation):替代自注意力,捕捉长期依赖。 残差结构:保留跳跃连接,稳定训练。 激活函数:使用 SiLU(Swish)等非线性函数增强表达能力。 4. 关键优势 长序列高效:线性复杂度,适合处理数万长度的序列(如 DNA、音频)。 上下文感知:选择性机制动态过滤无关信息(类似门控)。 硬件友好:优化 GPU 内存和计算,比传统 SSM 快 10+ 倍。 5. 应用场景 长文本建模:替代 Transformer 的 Decoder。 基因组学:处理超长 DNA 序列。 语音/视频:建模毫秒级时序依赖。 6. 与 Transformer 对比 特性 Mamba Transformer 复杂度 O(L)(线性) O(L^2)(平方) 长序列支持 极优(10k+ tokens) 一般(1k~4k tokens) 动态感知 选择性关注输入 全局注意力 硬件效率 高(并行扫描) 低(显存瓶颈) 7. 总结 Mamba 通过 选择性状态空间 + 硬件优化,在长序列任务中实现了接近 Transformer 的性能,同时显著提升效率,成为当前最受关注的序列建模架构之一。 如果需要进一步解释某个部分,欢迎提问! 🚀 #基础计算 F1 MIOU MAP # 1. 准确率(Accuracy) 定义: 准确率是正确分类的样本数占总样本数的比例。 公式: Accuracy = (TP + TN) / (TP + TN + FP + FN) 其中: TP(True Positive):正确预测为正的样本数 TN(True Negative):正确预测为负的样本数 FP(False Positive):错误预测为正的样本数 FN(False Negative):错误预测为负的样本数 代码实现: ``` 复制 def calculate_accuracy(y_true, y_pred): correct = sum(y_true == y_pred) total = len(y_true) return correct / total # 示例 y_true = [0, 1, 1, 0, 1] y_pred = [0, 1, 0, 0, 1] accuracy = calculate_accuracy(y_true, y_pred) print(f"准确率: {accuracy}") ``` # 2. 召回率(Recall) 定义: 召回率表示模型能够正确识别出所有正样本的能力。 公式: Recall = TP / (TP + FN) 代码实现: Python ``` def calculate_recall(y_true, y_pred): tp = sum((y_true == 1) & (y_pred == 1)) fn = sum((y_true == 1) & (y_pred == 0)) return tp / (tp + fn) # 示例 y_true = [0, 1, 1, 0, 1] y_pred = [0, 1, 0, 0, 1] recall = calculate_recall(y_true, y_pred) print(f"召回率: {recall}") ``` # 3. F1 分数(F1 Score) 定义: F1 分数是精确率(Precision)和召回率的调和平均。 公式: F1 Score = 2 * (Precision * Recall) / (Precision + Recall) 其中: Precision = TP / (TP + FP) 代码实现: ``` 复制 def calculate_f1_score(y_true, y_pred): tp = sum((y_true == 1) & (y_pred == 1)) fp = sum((y_true == 0) & (y_pred == 1)) fn = sum((y_true == 1) & (y_pred == 0)) precision = tp / (tp + fp) recall = tp / (tp + fn) return 2 * (precision * recall) / (precision + recall) # 示例 y_true = [0, 1, 1, 0, 1] y_pred = [0, 1, 0, 0, 1] f1 = calculate_f1_score(y_true, y_pred) print(f"F1 分数: {f1}") 11 ``` # 4. 平均精度均值(mAP) 定义: mAP 是目标检测中常用的指标,表示所有类别平均精度(AP)的均值。 公式: 对于每个类别,计算其 AP,然后取所有类别的平均值。 AP = sum(Precision) / 11(使用 11 个召回率阈值) mAP = mean(AP) 代码实现: Python ``` def calculate_ap(precisions, recalls): ap = 0.0 for t in np.arange(0, 1.1, 0.1): p = max(precisions[recalls >= t]) ap += p / 11.0 return ap def calculate_map(ap_list): return np.mean(ap_list) # 示例 ap_list = [0.7, 0.8, 0.9] map_value = calculate_map(ap_list) print(f"平均精度均值 (mAP): {map_value}") ``` # 5. 平均交并比(mIoU) 定义: mIoU 是语义分割中常用的指标,表示所有类别交并比的均值。 公式: IoU = Intersection / Union mIoU = mean(IoU) 代码实现: ``` def calculate_iou(y_true, y_pred): intersection = np.logical_and(y_true, y_pred) union = np.logical_or(y_true, y_pred) return np.sum(intersection) / np.sum(union) def calculate_miou(y_true, y_pred, num_classes): iou_list = [] for i in range(num_classes): iou = calculate_iou(y_true == i, y_pred == i) iou_list.append(iou) return np.mean(iou_list) # 示例 y_true = np.array([[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]) y_pred = np.array([[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]]) num_classes = 2 miou = calculate_miou(y_true, y_pred, num_classes) print(f"平均交并比 (mIoU): {miou}") ```
Python
赞
博客信息
作者
eeettt123
发布日期
2025-03-07
其他信息 : 其他三字母的人名首字母都是其他同学发布的哦