一、本周计划
学习如何缝合模块,跑代码InversionNet、想idea并实验,准备开题报告,学习python基础语法
二、完成情况
1 学习如何在代码中加入模块
可添加的模块如:
通道注意力CA
空间注意力SA
self attention变体
频域快速傅里叶FFT
卷积模块变体
特征融合
下采样
在你想要添加的网络模块进行添加,例如在InversionNet网络中的上采样的第一层添加CBAM。
CBAM(Convolutional Block Attention Module)结合了通道注意力和空间注意力。CBAM从通道和空间两个维度计算feature map的attention map,然后将attention map与输入的feature map相乘来进行特征的自适应学习。CBAM模块如下图所示。
图:CBAM模块
# 定义一个包含CBAM模块的卷积层
class CBAMBlock(nn.Module):
def __init__(self, in_channels, reduction=16):
super(CBAMBlock, self).__init__()
self.in_channels = in_channels
self.reduction = reduction
# 通道注意力计算
self.channel_attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(in_channels, in_channels // reduction, kernel_size=1, padding=0),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // reduction, in_channels, kernel_size=1, padding=0),
nn.Sigmoid()
)
# 空间注意力计算
self.spatial_attention = nn.Sequential(
nn.Conv2d(in_channels, in_channels // reduction, kernel_size=1, stride=1),
nn.BatchNorm2d(in_channels // reduction),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // reduction, in_channels // reduction, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(in_channels // reduction),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // reduction, 1, kernel_size=1, stride=1),
nn.Sigmoid()
)
def forward(self, x):
# 计算通道注意力系数
channel_att = self.channel_attention(x)
out = x * channel_att
# 计算空间注意力系数
spatial_att = self.spatial_attention(out)
out = out * spatial_att
return out
缝合模块时会出现的问题:输入参数、数据维度不匹配
在网络中加上CBAM不一定带来性能上的提升,影响因素可能有数据集、网络自身、注意力所在的位置等。
2. 跑代码——InversionNet
很久没看代码会生疏,重新去看了InversionNet并复现,结果如下。
InversionNet:epoch180,batchsize50,数据量1000
(未解决)当数据量过大时出现问题:_pickle.UnpicklingError: pickle data was truncated
对比试验(待修改):修改上采样部分,需要注意参数
- ConvTranspose2d:创建反卷积层进行上采样(U-Net使用的则是这一种);
- UpsamplingBilinear2d:传统的双线性插值上采样(FCN使用的是这一种);
图像上采样的主要目的是放大图像,主要包括:
(1)内插值法,即在原有图像像素的基础上,在像素点值之间采用合适的插值算法插入新的元素;
(2)反卷积方法(Deconvolution),又称转置卷积法(Transposed Convolution);
(3)反池化方法(Unpooling)。
在图像处理上面,插值是指利用已知邻近像素点的灰度值或RGB中的三色值产生未知像素点的灰度值或RGB三色值,也就是说用来填充图像变换时像素之间的空隙。目的是由原始图像再生出具有更高分辨率的图像。
线性插值法是指使用连接两个已知量的直线来确定在这个两个已知量之间的一个未知量的值的方法。他的几何意义为利用过A点和B点的直线(y=kx+b) 来近似表示原函数。
双线性插值是插值算法中的一种,是线性插值的扩展。利用原图像中目标点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,其核心思想是在两个方向分别进行一次线性插值。 「解析」双线性插值-CSDN博客
线性插值法利用原图像中两个点计算像素值进行插值,双线性插值法利用原图像中四个点计算目标像素值进行插值。
在 Pytorch 中实现,双线性插值处理即 'bilinear'
模式
import torch.nn.functional as F
F.interpolate(x, size=input_shape, mode='bilinear', align_corners=False)
mode (str) –
algorithm used for upsampling: 'nearest' | 'linear' | 'bilinear' |
'bicubic' | 'trilinear' | 'area' | 'nearest-exact'.
Default: 'nearest'
3 学python
代码能力比较薄弱,准备系统学习python语法,以便于之后跑实验修改代码等等。
Python入门学习——基础语法-CSDN博客
三、下周计划
1.学习师兄的论文DD-Net、
2.修改并跑代码 将注意力机制加入网络中,对比实验
3.完善开题报告,准备开题答辩等