文章目录

  • 一、通道注意力机制简介
  • 二、通道注意力机制pytorch代码
    • 1. 单独使用通道注意力机制的小案例
    • 2. 使用通道注意力机制的小案例

一、通道注意力机制简介

下面的图形象的说明了通道注意力机制

二、通道注意力机制pytorch代码

通道注意力机制的pytorch代码如下:

import torch
import torch.nn as nn
import torch.utils.data as Dataclass ChannelAttention(nn.Module):def __init__(self, in_planes, ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)self.relu1 = nn.ReLU()self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x): # x 的输入格式是:[batch_size, C, H, W]avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))out = avg_out + max_outreturn self.sigmoid(out)

1. 单独使用通道注意力机制的小案例

import torch
import torch.nn as nn
import torch.utils.data as Dataclass ChannelAttention(nn.Module):def __init__(self, in_planes, ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)self.relu1 = nn.ReLU()self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))out = avg_out + max_outreturn self.sigmoid(out)def get_total_train_data(H, W, C, class_count):"""得到全部的训练数据,这里需要替换成自己的数据"""import numpy as npx_train = torch.Tensor(np.random.random((1000, H, W, C)))  # 维度是 [ 数据量, 高H, 宽W, 长C]y_train = torch.Tensor(np.random.randint(0, class_count, size=(1000, 1))).long()  # [ 数据量, 句子的分类], 这里的class_count=4,就是四分类任务return x_train, y_trainif __name__ == '__main__':# ================训练参数=================epochs = 100batch_size = 30output_class = 14H = 40W = 50C = 30# ================准备数据=================x_train, y_train = get_total_train_data(H, W, C, class_count=output_class)train_loader = Data.DataLoader(dataset=Data.TensorDataset(x_train, y_train),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=batch_size,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=6,  # 多进程(multiprocess)来读数据drop_last=True,)# ================初始化模型=================model = ChannelAttention(in_planes=H)# ================开始训练=================for i in range(epochs):for seq, labels in train_loader:attention_out = model(seq)seq_attention_out = attention_out.squeeze()for i in range(seq_attention_out.size()[0]):print(seq_attention_out[i])

可以看到输出是:

tensor([0.4440, 0.5005, 0.5533, 0.4530, 0.5494, 0.5430, 0.4911, 0.5339, 0.4627,0.5182, 0.4940, 0.4497, 0.4544, 0.5337, 0.4663, 0.4333, 0.5343, 0.4335,0.4711, 0.4569, 0.4508, 0.4532, 0.5102, 0.4824, 0.5231, 0.5328, 0.5092,0.5567, 0.5075, 0.5520, 0.5588, 0.4344, 0.5577, 0.4408, 0.4539, 0.4891,0.4513, 0.4472, 0.4983, 0.4991], grad_fn=<SelectBackward>)
tensor([0.4444, 0.5005, 0.5530, 0.4533, 0.5491, 0.5427, 0.4911, 0.5337, 0.4630,0.5181, 0.4940, 0.4500, 0.4546, 0.5335, 0.4665, 0.4337, 0.5341, 0.4339,0.4713, 0.4572, 0.4511, 0.4535, 0.5101, 0.4825, 0.5229, 0.5326, 0.5092,0.5564, 0.5074, 0.5516, 0.5584, 0.4348, 0.5574, 0.4412, 0.4541, 0.4892,0.4516, 0.4475, 0.4983, 0.4991], grad_fn=<SelectBackward>)
.......

这个就是每个batch中,每层的权重,其中输入模型的size是[30, 40, 50, 30],输出的attention_out的size是[30, 40, 1, 1]

2. 使用通道注意力机制的小案例

import torch
import torch.nn as nn
import torch.utils.data as Dataclass ChannelAttention(nn.Module):def __init__(self, in_planes, ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)self.relu1 = nn.ReLU()self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))out = avg_out + max_outreturn self.sigmoid(out)class UseAttentionModel(nn.Module): # 这里可以随便定义自己的模型def __init__(self, H):super(UseAttentionModel, self).__init__()self.channel_attention = ChannelAttention(H)def forward(self, x):  # 反向传播attention_value = self.channel_attention(x)out = x.mul(attention_value) # 得到借助注意力机制后的输出return outdef get_total_train_data(H, W, C, class_count):"""得到全部的训练数据,这里需要替换成自己的数据"""import numpy as npx_train = torch.Tensor(np.random.random((1000, H, W, C)))  # 维度是 [ 数据量, 高H, 宽W, 长C]y_train = torch.Tensor(np.random.randint(0, class_count, size=(1000, 1))).long()  # [ 数据量, 句子的分类], 这里的class_count=4,就是四分类任务return x_train, y_trainif __name__ == '__main__':# ================训练参数=================epochs = 100batch_size = 30output_class = 14H = 40W = 50C = 30# ================准备数据=================x_train, y_train = get_total_train_data(H, W, C, class_count=output_class)train_loader = Data.DataLoader(dataset=Data.TensorDataset(x_train, y_train),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=batch_size,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=6,  # 多进程(multiprocess)来读数据drop_last=True,)# ================初始化模型=================model = UseAttentionModel(H)cross_loss = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器model.train()# ================开始训练=================for i in range(epochs):for seq, labels in train_loader:attention_out = model(seq)print(attention_out.size())print(attention_out)

注意力机制学习(一)——通道注意力与pytorch案例相关推荐

  1. Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  2. 注意力机制学习 BAM

    注意力机制学习-BAM 简介 思考 步骤 代码 实验 最后 简介 2018年BMVC,从通道和空间两方面去解释注意力机制,和CBAM为同一团队打造.论文连接:BAM BAM:Bottleneck At ...

  3. 第七周作业:注意力机制学习的part2

    [BMVC2018]BAM: Bottleneck Attention Module PDF:1807.06514.pdf (arxiv.org) 为使神经网络获得更强的表征能力,在文中作者提出了一种 ...

  4. Attention注意力机制学习(二)------->一些注意力网络整理

    SKNet--SENet孪生兄弟篇(2019) 论文 Selective Kernel Networks https://arxiv.org/abs/1903.06586  2019年 介绍 SKNe ...

  5. 【动手深度学习-笔记】注意力机制(一)注意力机制框架

    生物学中的注意力提示 非自主性提示: 在没有主观意识的干预下,眼睛会不自觉地注意到环境中比较突出和显眼的物体. 比如我们自然会注意到一堆黑球中的一个白球,马路上最酷的跑车等. 自主性提示: 在主观意识 ...

  6. Transformer、多头注意力机制学习笔记:Attention is All You Need.

    文章目录 相关参考连接: https://blog.csdn.net/hpulfc/article/details/80448570 https://blog.csdn.net/weixin_4239 ...

  7. 注意力机制学习(二)——空间注意力与pytorch案例

    文章目录 一.空间注意力机制简介 二.空间注意力与pytorch代码 三.使用案例 一.空间注意力机制简介 空间注意力的示意图如下: 长条的是通道注意力机制,而平面则是空间注意力机制,可以发现: 通道 ...

  8. (C1-2)注意力机制学习(TBD)

    注意力机制 图像处理注意力机制Attention汇总(附代码) ⭐ 暂时没有要深入学习,只是用到了SENet,不太明白为什么它是一种注意力机制方法,于是去检索学习了下,后续有必要再补充. 根据注意力权 ...

  9. 注意力机制的原理及实现(pytorch)

    本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 空间注意力机制(attention Unet) class Attentio ...

最新文章

  1. HDU 1574 RP问题
  2. android wheelview 字体颜色,百行代码实现Android WheelView
  3. android签名文件查看工具,ionic 发布android,并查看签名文件。
  4. CSDN之人人code,整数取反
  5. 巨量引擎2021食品饮料行业白皮书
  6. ASP.NET MVC 控制器激活(三)
  7. Visualize real-time data streams with Gnuplot
  8. 谈FTP服务器***技术及其展望 (下)
  9. mysql contain和like_mysql不带%的like 与等号之间的区别
  10. 创意欣赏:国外35个独特的露天广告牌设计
  11. Android 开发常见问题汇总
  12. winvnc3.3.3连接就关闭
  13. OP27运放在同相比例放大器中的应用
  14. SQL SERVER中的汉字转拼音-实现根据拼音搜索汉字
  15. 清华计算机全球第4!USNews计算机专业排名出炉,67所大陆高校上榜
  16. 【数值分析不挂科】第六章 | 线性方程组直接法 迭代法
  17. 字典转换成模型属性代码笔记
  18. 【音视频处理】H264/H265详解,为什么H264更常用?
  19. 如何用halcon实现模板匹配
  20. 人工智能+医疗与生命科学行业研究报告

热门文章

  1. Unreal Engine 4 的 光和影
  2. UE4 iOS设备的兼容性
  3. plsql developer如何创建新用户(users)
  4. Spring @Async 注解
  5. 基于Python的HTTP接口测试
  6. 新一代企业级大数据应用方案
  7. (多重背包+记录路径)Charlie's Change (poj 1787)
  8. 在 Docker Machine 中使用 Mirror 服务
  9. iPhone判断是否已插入SIM卡
  10. [资料]PHP中的__set __get使用