本项目使用Paddle2.0复现了改进的non-local网络架构GCNet和BAT,并在动物分类数据集上进行了训练和验证。同时还比较了与传统non-local网络的训练和验证效果区别。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

Non-local是2018年CVPR上的一篇论文Non-local neural networks中提出的一种获取远距离注意力的网络架构,由于non-local是在时域和空域两个维度进行计算的,作者将其用在视频分类中。如果只是在空域进行计算,就可以将其用于图片分类了,这也是本项目的实验任务。
GCNet(Global Context Networks)最初是2019年arxiv上的一篇论文GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond中提出的一种结合SE注意力模块架构和Non local算法原理对non-local进行改进的网络结构。GCNet还获得了ICCV2019 Neural Architects Workshop的最佳论文奖并且最近发表在了期刊TPAMI上。
BAT(Bilinear Attentional Transforms)是2020年CVPR上的一篇论文Non-Local Neural Networks with Grouped Bilinear Attentional Transforms中提出的一种针对non-local网络改进的网络结构。
Non-local可以建模时间和空间维度上的关联性;GCNet结合了基于通道的注意力机制SE和能够捕获全局空间信息的Non-local网络;BAT是在传统的non-local模块上改进的可进行变形操作的新型模块,并且在图片分类和视频分类的性能上已经超过了传统的non-local网络结构。本项目复现GCNet和BAT并和non-local网络进行动物图像分类的实验比较。
本项目首次使用paddle2.0复现了non-local网络的改进网络GCNet和BAT,并在动物分类数据集上进行了训练和验证。
动物数据集的划分是按8:2的的划分方法进行训练集与验证集划分的。
一张图片中各个像素点间的关系,特别是长距离像素点间的关系对各种视觉任务非常重要。这种关系可以通过传统的堆叠卷积层的方法获得,但是往往效率低下。Non-local网络通过自注意力机制解决了这个问题。但是对于图片来说,作者通过实验发现,每个像素点的全局特征图基本都是一样的,如图1所示,其中红点是要计算的目标点。基于此,就没有必要计算每个点的全局特征图了。所以,作者就提出了一种比non-local的方法效果好但是计算量小的多的简化的注意力机制模块。

图1 non-local方法计算的红色点的注意力特征图
Non-local的计算方法有多种,包括高斯、嵌入式高斯、点积和拼接。GCNet采用了嵌入式高斯的方法,这也是通常使用的方法。GCNet模块的实现细节示意图如图2所示。其中,图2中的a表示GCNet模块的流程图,图2中的b表示简化版的non-local模块示意图,图2中的c表示GCNet模块示意图。可以看出,GCNet模块是简化版的non-local和SE模块机制的结合。

图2 GCNet模块实现细节示意图
具体实现可以fork后见代码细节。
论文原文:Global Context Networks
参考代码:
PyTorch的实现
既然是对non-local网络进行改进,我们先来看下non-local的网络架构是什么样的。如图3所示。当然,图3所示的是在时间和空间两个维度上的non-local架构,和纯空间上的没有太大区别,只需要把T去掉然后将三维卷积换成二维卷积即可。

图3 Non-local网络架构示意图
跟non-local网络相比,BAT可以对图片的局部信息进行各种变换,如缩放、平移、旋转等。如图4所示。图4的a显示的是传统non-local网络的示意图,图4的b显示的是BAT模块的示意图。

图4 BAT和non-local的比较示意图
BAT的实现细节如图5所示。

图5 BAT实现细节示意图
具体实现可以fork后见代码细节。
non-local论文原文:Non-local Neural Networks
BAT论文原文:Non-Local Neural Networks with Grouped Bilinear Attentional Transforms
参考代码:
PyTorch的实现
本项目使用10分类的动物数据集进行训练和验证.
该十分类动物数据集,包含dog,horse,elephant,butterfly,chicken,cat,cow,sheep,spider和squirrel。每一分类的图片数量为2k-5k。
| 文件名或文件夹名 | 功能 |
|---|---|
| non_local.py | non_local和BAT模块定义文件 |
| context_block.py | GCNet模块定义文件 |
| nlnet.py | 网络定义文件 |
| animal_dataset.py | 数据集定义文件 |
| config.py | 配置文件 |
| train_val_split.py | 训练集验证集划分文件 |
| train.py | 模型训练 |
| eval.py | 模型验证 |
!unzip -q data/data70196/animals.zip -d work/dataset
import osimport randomfrom matplotlib import pyplot as pltfrom PIL import Image
imgs = []
paths = os.listdir('work/dataset')for path in paths:
img_path = os.path.join('work/dataset', path) if os.path.isdir(img_path):
img_paths = os.listdir(img_path)
img = Image.open(os.path.join(img_path, random.choice(img_paths)))
imgs.append((img, path))
f, ax = plt.subplots(3, 3, figsize=(12,12))for i, img in enumerate(imgs[:9]):
ax[i//3, i%3].imshow(img[0])
ax[i//3, i%3].axis('off')
ax[i//3, i%3].set_title('label: %s' % img[1])
plt.show()<Figure size 864x864 with 9 Axes>
!python code/train_val_split.py
finished train val split!
!python code/train.py --net 'nl'
!python code/eval.py --net 'nl'
W0303 17:08:47.355185 7686 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0303 17:08:47.359616 7686 device_context.cc:372] device: 0, cuDNN Version: 7.6.
add nl after block 1 with 512 planes.
add nl after block 3 with 512 planes.
add nl after block 1 with 1024 planes.
add nl after block 3 with 1024 planes.
add nl after block 5 with 1024 planes.
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 103/103 [==============================] - loss: 1.0642 - acc: 0.7976 - 228ms/step
Eval samples: 3276
{'loss': [1.0642079], 'acc': 0.7976190476190477}
图6. 使用non-local的训练验证图示
!python code/train.py --net 'gc'
!python code/eval.py --net 'gc'
W0303 17:13:22.231034 8017 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0303 17:13:22.235092 8017 device_context.cc:372] device: 0, cuDNN Version: 7.6.
add gc after block 1 with 512 planes.
add gc after block 3 with 512 planes.
add gc after block 1 with 1024 planes.
add gc after block 3 with 1024 planes.
add gc after block 5 with 1024 planes.
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 103/103 [==============================] - loss: 0.6511 - acc: 0.8040 - 217ms/step
Eval samples: 3276
{'loss': [0.6511191], 'acc': 0.8040293040293041}
图7. 使用GCNet的训练验证图示
!python code/train.py --net 'bat'
!python code/eval.py --net 'bat'
W0303 17:11:59.910156 7866 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0303 17:11:59.914266 7866 device_context.cc:372] device: 0, cuDNN Version: 7.6.
add bat after block 1 with 512 planes.
add bat after block 3 with 512 planes.
add bat after block 1 with 1024 planes.
add bat after block 3 with 1024 planes.
add bat after block 5 with 1024 planes.
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 103/103 [==============================] - loss: 0.7981 - acc: 0.8159 - 236ms/step
Eval samples: 3276
{'loss': [0.7981112], 'acc': 0.8159340659340659}
图8. 使用BAT的训练验证图示
在本次项目中,可以看出,BAT表现最好,GCNet其次,这两个针对non-local的改进型网络在性能上都超过了原始的non-local网络。

图9. Non-local、GCNet和BAT的验证比较图示
以上就是比non-local更好,基于Paddle2.0的GCNet和BAT的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号