注意力机制学习(一)——通道注意力与pytorch案例
文章目录
- 一、通道注意力机制简介
- 二、通道注意力机制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案例相关推荐
- Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...
- 注意力机制学习 BAM
注意力机制学习-BAM 简介 思考 步骤 代码 实验 最后 简介 2018年BMVC,从通道和空间两方面去解释注意力机制,和CBAM为同一团队打造.论文连接:BAM BAM:Bottleneck At ...
- 第七周作业:注意力机制学习的part2
[BMVC2018]BAM: Bottleneck Attention Module PDF:1807.06514.pdf (arxiv.org) 为使神经网络获得更强的表征能力,在文中作者提出了一种 ...
- Attention注意力机制学习(二)------->一些注意力网络整理
SKNet--SENet孪生兄弟篇(2019) 论文 Selective Kernel Networks https://arxiv.org/abs/1903.06586 2019年 介绍 SKNe ...
- 【动手深度学习-笔记】注意力机制(一)注意力机制框架
生物学中的注意力提示 非自主性提示: 在没有主观意识的干预下,眼睛会不自觉地注意到环境中比较突出和显眼的物体. 比如我们自然会注意到一堆黑球中的一个白球,马路上最酷的跑车等. 自主性提示: 在主观意识 ...
- Transformer、多头注意力机制学习笔记:Attention is All You Need.
文章目录 相关参考连接: https://blog.csdn.net/hpulfc/article/details/80448570 https://blog.csdn.net/weixin_4239 ...
- 注意力机制学习(二)——空间注意力与pytorch案例
文章目录 一.空间注意力机制简介 二.空间注意力与pytorch代码 三.使用案例 一.空间注意力机制简介 空间注意力的示意图如下: 长条的是通道注意力机制,而平面则是空间注意力机制,可以发现: 通道 ...
- (C1-2)注意力机制学习(TBD)
注意力机制 图像处理注意力机制Attention汇总(附代码) ⭐ 暂时没有要深入学习,只是用到了SENet,不太明白为什么它是一种注意力机制方法,于是去检索学习了下,后续有必要再补充. 根据注意力权 ...
- 注意力机制的原理及实现(pytorch)
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 空间注意力机制(attention Unet) class Attentio ...
最新文章
- HDU 1574 RP问题
- android wheelview 字体颜色,百行代码实现Android WheelView
- android签名文件查看工具,ionic 发布android,并查看签名文件。
- CSDN之人人code,整数取反
- 巨量引擎2021食品饮料行业白皮书
- ASP.NET MVC 控制器激活(三)
- Visualize real-time data streams with Gnuplot
- 谈FTP服务器***技术及其展望 (下)
- mysql contain和like_mysql不带%的like 与等号之间的区别
- 创意欣赏:国外35个独特的露天广告牌设计
- Android 开发常见问题汇总
- winvnc3.3.3连接就关闭
- OP27运放在同相比例放大器中的应用
- SQL SERVER中的汉字转拼音-实现根据拼音搜索汉字
- 清华计算机全球第4!USNews计算机专业排名出炉,67所大陆高校上榜
- 【数值分析不挂科】第六章 | 线性方程组直接法 迭代法
- 字典转换成模型属性代码笔记
- 【音视频处理】H264/H265详解,为什么H264更常用?
- 如何用halcon实现模板匹配
- 人工智能+医疗与生命科学行业研究报告