地方性门户网站,公司网站维护费大概需要多少,wordpress如何修改html,网站的交互怎么做✨✨ 欢迎大家来访Srlua的博文#xff08;づ#xffe3;3#xffe3;#xff09;づ╭❤#xff5e;✨✨ #x1f31f;#x1f31f; 欢迎各位亲爱的读者#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢#xff0c;在这里我会分享我的知识和经验。づ3づ╭❤✨✨ 欢迎各位亲爱的读者感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢在这里我会分享我的知识和经验。 希望在这里我们能一起探索IT世界的奥妙提升我们的技能。 记得先点赞后阅读哦~ 所属专栏传知代码论文复现 欢迎访问我的主页Srlua小谢 获取更多信息和资源。✨✨
目录
概述
效果可视化
模型原理解读
动态卷积
多尺度特征融合网络
自适应损失函数
模型整体结构
数据集简介
实验结果
实现过程
参考文献 本文所有资源均可在该地址处获取。
概述
在计算机视觉领域图像分类是非常重要的任务之一。近年来深度学习的兴起极大提升了图像分类的精度和效率。本文将介绍一种基于动态卷积网络Dynamic Convolutional Networks、多尺度特征融合网络Multi-scale Feature Fusion Networks和自适应损失函数Adaptive Loss Functions的智能图像分类模型采用了PyTorch框架进行实现并通过PyQt构建了简洁的用户图像分类界面。该模型能够处理多分类任务并且提供了良好的可扩展性和轻量化设计使其适用于多种不同的图像分类场景。
效果可视化 模型原理解读
动态卷积
传统卷积网络通常使用固定的卷积核而动态卷积则是通过引入多个可学习的卷积核动态选择不同的卷积核进行操作。这样可以在不同的输入图像上实现不同的卷积操作从而提高模型的表达能力。通过加入Attention模块能对输入图像的不同特征进行加权处理进一步增强了网络对特征的自适应能力。
常规的卷积层使用单个静态卷积核应用于所有输入样本。而动态卷积层则通过注意力机制动态加权n个卷积核的线性组合使得卷积操作依赖于输入样本。动态卷积操作可以定义为: 其中动态卷积的线性组合可以用这个图表示 在 ODConv 中对于卷积核 WiWi:
αsiαsi 为 k ×× k 空间位置的每个卷积参数每个滤波器分配不同的注意力标量下图aαciαci 为每个卷积滤波器 WimWim 的 cincin 个通道分配不同的注意力标量下图bαfiαfi 为 coutcout 个卷积滤波器分配不同的注意力标量下图cαwiαwi 为整个卷积核分配一个注意力标量。下图d
在下图中展示了将这四种类型的注意力逐步乘以 nn 个卷积核的过程。原则上这四种类型的注意力是相互补充的通过按位置、通道、滤波器和卷积核的顺序逐步将它们乘以卷积核 WiWi使卷积操作在所有空间位置、所有输入通道、所有卷积核中都不同针对输入 xx 捕获丰富的上下文信息从而提供性能保证。 原则上来讲这四种类型的注意力是互补的通过渐进式对卷积沿位置、通道、滤波器以及核等维度乘以不同的注意力将使得卷积操作对于输入存在各个维度的差异性提供更好的性能以捕获丰富上下文信息。因此ODCOnv可以大幅提升卷积的特征提取能力更重要的是采用更少卷积核的ODConv可以取得更优的性能。代码实现
class ODConv2d(nn.Module):def __init__(self, in_planes, out_planes, kernel_size, stride1, padding0, dilation1, groups1,reduction0.0625, kernel_num4):super(ODConv2d, self).__init__()self.in_planes in_planesself.out_planes out_planesself.kernel_size kernel_sizeself.stride strideself.padding paddingself.dilation dilationself.groups groupsself.kernel_num kernel_numself.attention Attention(in_planes, out_planes, kernel_size, groupsgroups,reductionreduction, kernel_numkernel_num)self.weight nn.Parameter(torch.randn(kernel_num, out_planes, in_planes//groups, kernel_size, kernel_size),requires_gradTrue)self._initialize_weights()if self.kernel_size 1 and self.kernel_num 1:self._forward_impl self._forward_impl_pw1xelse:self._forward_impl self._forward_impl_commondef _initialize_weights(self):for i in range(self.kernel_num):nn.init.kaiming_normal_(self.weight[i], modefan_out, nonlinearityrelu)def update_temperature(self, temperature):self.attention.update_temperature(temperature)def _forward_impl_common(self, x):# Multiplying channel attention (or filter attention) to weights and feature maps are equivalent,# while we observe that when using the latter method the models will run faster with less gpu memory cost.channel_attention, filter_attention, spatial_attention, kernel_attention self.attention(x)batch_size, in_planes, height, width x.size()x x * channel_attentionx x.reshape(1, -1, height, width)aggregate_weight spatial_attention * kernel_attention * self.weight.unsqueeze(dim0)aggregate_weight torch.sum(aggregate_weight, dim1).view([-1, self.in_planes // self.groups, self.kernel_size, self.kernel_size])output F.conv2d(x, weightaggregate_weight, biasNone, strideself.stride, paddingself.padding,dilationself.dilation, groupsself.groups * batch_size)output output.view(batch_size, self.out_planes, output.size(-2), output.size(-1))output output * filter_attentionreturn outputdef _forward_impl_pw1x(self, x):channel_attention, filter_attention, spatial_attention, kernel_attention self.attention(x)x x * channel_attentionoutput F.conv2d(x, weightself.weight.squeeze(dim0), biasNone, strideself.stride, paddingself.padding,dilationself.dilation, groupsself.groups)output output * filter_attentionreturn outputdef forward(self, x):return self._forward_impl(x)多尺度特征融合网络
多尺度特征是指从图像中提取不同尺度、不同分辨率下的特征。这些特征可以捕捉图像中的局部细节信息如纹理、边缘等和全局结构信息如物体形状和轮廓。传统的卷积神经网络CNN一般通过逐层下采样提取深层特征但在这个过程中高层的语义信息虽然丰富却丢失了低层的细节信息。多尺度特征融合通过结合不同层次的特征弥补了这一不足。 如上图所示在本文的网络设计中多尺度特征融合通过以下几个步骤实现
特征提取模块模型通过不同的卷积核例如3x3、5x5、7x7对输入图像进行多层次的卷积操作提取出不同尺度的特征。
特征拼接与加权融合在融合阶段来自不同卷积层的特征图会进行拼接或加权求和确保网络能够根据不同的任务需求自适应地调整特征权重。例如在分类任务中局部信息可能对小物体的识别更有帮助而全局信息则适用于大物体的分类。代码实现
class MultiScaleFeatureFusion(nn.Module):def __init__(self, in_channels, out_channels):super(MultiScaleFeatureFusion, self).__init__()self.conv1x1 nn.Conv2d(in_channels, out_channels, kernel_size1)self.conv3x3 nn.Conv2d(in_channels, out_channels, kernel_size3, padding1)self.conv5x5 nn.Conv2d(in_channels, out_channels, kernel_size5, padding2)self.conv7x7 nn.Conv2d(in_channels, out_channels, kernel_size7, padding3)def forward(self, x):out1 self.conv1x1(x)out2 self.conv3x3(x)out3 self.conv5x5(x)out4 self.conv7x7(x)return out1 out2 out3 out4 # 多尺度特征融合自适应损失函数
在深度学习的图像分类任务中损失函数的选择直接影响模型的训练效果。本文所设计的网络引入了自适应损失函数Adaptive Loss Functions这是提升分类性能的重要创新之一。传统的损失函数通常具有固定的形式和权重不能根据数据分布和训练阶段的不同自动调整。而自适应损失函数通过动态调整损失权重和形式能够更有效地优化模型提升其对复杂问题的学习能力。代码实现
class AdaptiveLoss(nn.Module):def __init__(self, alpha0.25, gamma2.0, balance_factor0.999):super(AdaptiveLoss, self).__init__()self.alpha alphaself.gamma gammaself.balance_factor balance_factordef forward(self, logits, targets):# 计算交叉熵损失ce_loss F.cross_entropy(logits, targets, reductionnone)模型整体结构
本文使用的模型整体结构如下图所示 数据集简介
德国交通标志识别基准(GTSRB)包含43类交通标志分为39,209个训练图像和12,630个测试图像。图像具有不同的光线条件和丰富的背景。如下图所示 实验结果
在经过动态卷积和多尺度特征提取以及自适应损失函数后在验证集上能够取得0.944的准确率。 其loss曲线和准确率曲线如下图所示 并且本文与其他文章结果进行了比较
模型准确率差异ASSC[1]82.8%11.6%DAN[2]91.1%3.3%SRDA[3]93.6%0.8%OURS94.4%-
混淆矩阵结果 实现过程
版本
PyQt5 5.15.11
seaborn 0.13.2
torch 2.4.0
PyQt5-Qt5 5.15.2
numpy 1.26.4
pandas 1.5.0首先对模型进行训练,保存最佳模型
python main.py加载最佳模型进行可视化预测
python predict_gui.py参考文献
[1] Haeusser, Philip, et al. “Associative domain adaptation.” Proceedings of the IEEE international conference on computer vision. 2017. [2] Long, Mingsheng, et al. “Learning transferable features with deep adaptation networks.” International conference on machine learning. PMLR, 2015. [3] Cai, Guanyu, et al. “Learning smooth representation for unsupervised domain adaptation.” IEEE Transactions on Neural Networks and Learning Systems 34.8 (2021): 4181-4195. [4] Li, Chao, Aojun Zhou, and Anbang Yao. “Omni-dimensional dynamic convolution.” arXiv preprint arXiv:2209.07947 (2022).