深度学习论文: NAM: Normalization-based Attention Module及其PyTorch实现

深度学习论文: NAM: Normalization-based Attention Module及其PyTorch实现
NAM: Normalization-based Attention Module
PDF: https://arxiv.org/pdf/2111.12419.pdf
PyTorch代码: https://github.com/shanglianlm0525/CvPytorch
PyTorch代码: https://github.com/shanglianlm0525/PyTorch-Networks

1 概述

NAM作为一种高效、轻量级的注意力机制。

  • NAM采用CBAM的模块整合,重新设计了通道和空间注意力子模块。
  • 在每个网络块的末端嵌入一个NAM模块。对于残差网络,它嵌入在残差结构的末端。
  • 利用权重的贡献因子来改善注意力机制。使用批归一化的比例因子,它使用标准差来表示权重的重要性。这可以避免添加SE、BAM和CBAM中使用的全连接层和卷积层。

2 NAM

### 如何用Pytorch实现神经网络模型 #### 导入必要的库 为了使用 PyTorch 实现神经网络,首先需要导入一些基本的库。这些库提供了张量操作、自动微分等功能,这些都是构建和训练神经网络所必需的基础工具[^2]。 ```python import torch import torch.nn as nn ``` #### 继承 `nn.Module` 类并定义初始化方法 创建自定义神经网络的关键在于让模型继承 `nn.Module` 类,并重写其构造函数 (`__init__`) 和前向传播函数 (`forward`) 方法。通过这种方式可以灵活地设计各种类型的神经网络架构[^1]。 ```python class SimpleNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleNN, self).__init__() # 定义各层参数 self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out ``` 上述代码片段展示了一个简单的两层全连接神经网络(`SimpleNN`) 的定义过程。该网络接收输入尺寸为 `input_size` 的数据,在经过一层线性变换后应用 ReLU 激活函数处理中间表示,最后再经由另一层线性映射得到最终输出结果[^4]。 #### 设置损失函数与优化器 除了建立好模型本身外,还需要指定合适的损失计算方式(Loss Function)以及更新权重的方法即优化算法(Optimizer),以便能够有效地调整模型参数来最小化预测误差[^3]。 ```python criterion = nn.CrossEntropyLoss() # 对于多类别分类问题常用交叉熵作为loss function optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # Adam是一种常用的梯度下降法变种 ``` #### 训练循环 有了前面准备好的组件之后就可以进入实际的学习阶段——迭代整个数据集多次执行反向传播从而不断改进模型性能了;每一次完整的遍历称为一个 epoch 。在此期间会持续监控验证集上的表现以防止过拟合现象发生。 ```python for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.view(-1, 28*28).to(device) labels = labels.to(device) outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) ``` 这段伪代码展示了典型的训练流程框架,其中包含了获取批次样本、正向传递获得预测值、依据真实标签计算当前 batch 上平均错误程度(loss value)、清零累积梯度、基于新产生的 error 反馈调节内部参数等一系列核心步骤。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mingo_敏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值