[Введение в GiantPandaCV] В последние годы методы, основанные на внимании, приветствовались как академическими кругами, так и промышленностью из-за их интерпретируемости и эффективности. Однако, поскольку структура сети, предложенная в статье, обычно встроена в рамки кода, такие как классификация, обнаружение и сегментация, код относительно избыточен и будет труден для понимания. Поэтому я организовал и воспроизвел основные коды статей Attention, MLP и Re-parameter, которые я недавно прочитал, для удобства читателей. В этой статье в основном дается краткое введение в часть проекта «Внимание». Проект будет продолжать обновлять последнюю дипломную работу.Вы можете подписаться и отметить эту работу.Если у проекта возникнут какие-либо проблемы в процессе воспроизведения и сортировки, вы можете поднять это в вопросе, и я отвечу вовремя ~
Информация об авторе
Вы аспирант первого курса, специализирующийся на компьютерных науках в Сямэньском университете, можете обратить внимание на Github: xmu-xiaoma666, Zhihu: много работать и работать.
адрес проекта
1. External Attention
1.1 Цитаты
Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks.---arXiv 2021.05.05
Адрес бумаги:АР Вест V.org/ABS/2105.02…
1.2 Структура модели
1.3 Введение
Это майская статья на arXiv, которая в основном решает две болевые точки Самовнимания (СА): (1) вычислительная сложность O(n^2); (2) СА находится в той же выборке. разные позиции, игнорируя связь между разными выборками. Поэтому в данной работе в качестве единиц памяти используются две конкатенированные структуры MLP, что снижает вычислительную сложность до O(n), кроме того, эти две единицы памяти обучаются на основе всех обучающих данных, поэтому неявно учитываются различия связей между выборками.
1.4 Как пользоваться
from attention.ExternalAttention import ExternalAttention
import torch
input=torch.randn(50,49,512)
ea = ExternalAttention(d_model=512,S=8)
output=ea(input)
print(output.shape)
2. Self Attention
2.1 Цитаты
Attention Is All You Need---NeurIPS2017
Адрес бумаги:АР Вест V.org/ABS/1706.03…
2.2 Структура модели
2.3 Введение
Это статья, опубликованная Google на NeurIPS 2017. Она имеет большое влияние в различных областях, таких как резюме, НЛП и мультимодальность. Текущий объем цитирования достиг 2,2w+. Самостоятельное внимание, предложенное в Transformer, является своего рода вниманием, которое используется для расчета веса между различными позициями в функции, чтобы достичь эффекта обновления функции. Сначала входной признак преобразуется в три признака Q, K и V через FC, затем Q и K умножаются на точки для получения карты внимания, а затем карта внимания умножается на V для получения взвешенного признака. . Наконец, отображение функций выполняется через FC для получения новой функции. (В Интернете есть много очень хороших объяснений о Трансформере и Самовнимании, поэтому я не буду здесь вдаваться в подробности.)
2.4 Как пользоваться
from attention.SelfAttention import ScaledDotProductAttention
import torch
input=torch.randn(50,49,512)
sa = ScaledDotProductAttention(d_model=512, d_k=512, d_v=512, h=8)
output=sa(input,input,input)
print(output.shape)
3. Squeeze-and-Excitation(SE) Attention
3.1 Цитаты
Squeeze-and-Excitation Networks---CVPR2018
Адрес бумаги:АР Вест V.org/ABS/1709.01…
3.2 Структура модели
3.3. Введение
Это статья CVPR2018, которая также очень влиятельна и на данный момент имеет более 7 тысяч цитирований. Эта статья о привлечении внимания к каналам. Благодаря своей простой структуре и эффективности она вызвала небольшую волну внимания к каналам. От пути к простоте можно сказать, что идея этой статьи очень проста: сначала применить пространственное измерение к AdaptiveAvgPool, затем узнать внимание канала через два FC и нормализовать его с помощью Sigmoid, чтобы получить карту внимания канала. Наконец, карта внимания канала сравнивается с исходной, функции умножаются, чтобы получить взвешенные функции.
3.4 Как пользоваться
from attention.SEAttention import SEAttention
import torch
input=torch.randn(50,512,7,7)
se = SEAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)
4. Selective Kernel(SK) Attention
4.1 Цитаты
Selective Kernel Networks---CVPR2019
Адрес бумаги:АР Вест V.org/PDF/1903.06…
4.2 Структура модели
4.3 Введение
Это статья из CVPR2019, которая отдает дань уважения идее SENet. В традиционной CNN каждый сверточный слой использует один и тот же размер ядра свертки, что ограничивает выразительные возможности модели; также была проверена «более широкая» структура модели Inception с использованием нескольких различных ядер свертки. Обучение действительно улучшает выразительность модели. модель. Автор опирается на идею SENet, получает вес канала путем динамического вычисления каждого ядра свертки и динамически объединяет результаты каждого ядра свертки.
Лично я думаю, что причина, по которой эту статью также можно назвать легковесной, заключается в том, что параметры являются общими, когда внимание канала выполняется для функций разных ядер (т. ядра имеют общий параметр модуля SE).
Метод этой статьи разделен на три части: Split, Fuse, Select. Разделение — это многоветвевая операция, свертка с разными ядрами свертки для получения разных функций; часть Fuse — это использование структуры SE для получения матрицы внимания канала (N ядер свертки могут получить N матриц внимания, этот шаг является общим для все параметры функций), чтобы можно было получить функции разных ядер после SE; операция Select предназначена для добавления этих функций.
4.4 Как пользоваться
from attention.SKAttention import SKAttention
import torch
input=torch.randn(50,512,7,7)
se = SKAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)
5. CBAM Attention
5.1 Цитаты
CBAM: Convolutional Block Attention Module---ECCV2018
Адрес бумаги:открытый доступ. Город Тяньхэ VF.com/content\_EC…
5.2 Структура модели
5.3 Введение
Это документ из ECCV 2018. В этой статье используются как канальное внимание, так и пространственное внимание, чтобы соединить их последовательно (в статье также проводятся параллельные и двухпоследовательные эксперименты по абляции).
С точки зрения Channel Attention общая структура по-прежнему похожа на SE, но автор предполагает, что AvgPool и MaxPool имеют разные эффекты представления, поэтому автор выполняет AvgPool и MaxPool соответственно для исходных объектов в пространственном измерении, а затем использует структуру SE для извлечения внимания канала, обратите внимание здесь. Параметры являются общими, а затем две функции добавляются и нормализуются для получения матрицы внимания.
Пространственное внимание похоже на внимание канала.После того, как два пула выполнены в измерении канала, две функции соединяются, а затем используется свертка 7x7 для извлечения пространственного внимания (причина, по которой используется 7x7, заключается в том, что пространственное внимание извлекается, поэтому используйте ядро свертки должно быть достаточно большим). Затем выполните нормализацию, чтобы получить матрицу пространственного внимания.
5.4 Как использовать
from attention.CBAM import CBAMBlock
import torch
input=torch.randn(50,512,7,7)
kernel_size=input.shape[2]
cbam = CBAMBlock(channel=512,reduction=16,kernel_size=kernel_size)
output=cbam(input)
print(output.shape)
6. BAM Attention
6.1. Ссылки
BAM: Bottleneck Attention Module---BMCV2018
Адрес бумаги:АР Вест V.org/PDF/1807.06…
6.2 Структура модели
6.3 Введение
Это работа КБАМ того же периода, что и автор.Работа очень похожа на КБАМ, и это тоже двойное Внимание. Разница в том, что КБАМ последовательно соединяет результаты двух вниманий, а БАМ напрямую добавляет два внимания матрицы.
Что касается Channel Attention, структура в основном такая же, как и у SE. С точки зрения пространственного внимания, пул по-прежнему выполняется в измерении канала, затем используются две свертки отверстий 3x3, и, наконец, используется свертка 1x1 для получения матрицы пространственного внимания.
Наконец, матрицы Channel Attention и Spatial Attention добавляются (здесь используется широковещательный механизм) и нормализуются, так что получается матрица внимания, объединенная с пространством и каналом.
6.4 Как использовать
from attention.BAM import BAMBlock
import torch
input=torch.randn(50,512,7,7)
bam = BAMBlock(channel=512,reduction=16,dia_val=2)
output=bam(input)
print(output.shape)
7. ECA Attention
7.1. Ссылки
ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks---CVPR2020
Адрес бумаги:АР Вест V.org/PDF/1910.03…
7.2 Структура модели
7.3 Введение
Это статья из CVPR2020.
Как показано на рисунке выше, SE реализует внимание к каналу, используя два полносвязных слоя, в то время как ECA требует одной свертки. Причина этого в том, что, с одной стороны, нет необходимости рассчитывать внимание между всеми каналами, а с другой стороны, использование двух полносвязных слоев вводит слишком много параметров и вычислений.
Поэтому после выполнения AvgPool автор просто использует одномерную свертку с рецептивным полем k (эквивалентно только вычислению внимания с соседними k каналами), что значительно сокращает параметры и объем вычислений. (т.е. эквивалентно SE — глобальное внимание, а ECA — локальное внимание).
7.4. Как использовать:
from attention.ECAAttention import ECAAttention
import torch
input=torch.randn(50,512,7,7)
eca = ECAAttention(kernel_size=3)
output=eca(input)
print(output.shape)
8. DANet Attention
8.1. Ссылки
Dual Attention Network for Scene Segmentation---CVPR2019
Адрес бумаги:АР Вест V.org/PDF/1809.02…
8.2 Структура модели
иллюстрация, схема Описание генерируется автоматически
8.3 Введение
Это статья CVPR 2019. Идея очень проста. Это использование собственного внимания в задаче сегментации сцены. Разница в том, что собственное внимание обращает внимание на внимание между каждой позицией, а эта статья делает внутреннее внимание а В расширении также делается ветвь внимания канала.Операция такая же, как и у внимания к себе.Три линейных, которые порождают Q, K и V, удаляются из другого канала внимания. Наконец, признаки после двух вниманий суммируются по элементам.
8.4 Как использовать
from attention.DANet import DAModule
import torch
input=torch.randn(50,512,7,7)
danet=DAModule(d_model=512,kernel_size=3,H=7,W=7)
print(danet(input).shape)
9. Pyramid Split Attention(PSA)
9.1 Цитаты
EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network---arXiv 2021.05.30
Адрес бумаги:АР Вест V.org/PDF/2105.14…
9.2 Структура модели
9.3 Введение
Это статья, загруженная Шэньчжэньским университетом на arXiv 30 мая. Цель этой статьи — получить и изучить пространственную информацию в разных масштабах, чтобы обогатить пространство признаков. Структура сети относительно проста и в основном делится на четыре этапа: на первом этапе исходный признак делится на n групп в соответствии с каналом, а затем различные группы свертываются в разных масштабах для получения нового признака W1; второй шаг, с SE выполняет SE на исходных функциях, чтобы получить различные Ahead Tonis; третий шаг заключается в выполнении SOFTMAX на разных группах; четвертый шаг, полученное внимание умножается на исходную функцию W1.
9.4 Как пользоваться
from attention.PSA import PSAimport torchinput=torch.randn(50,512,7,7)psa = PSA(channel=512,reduction=8)output=psa(input)print(output.shape)
10. Efficient Multi-Head Self-Attention(EMSA)
10.1 Ссылки
ResT: An Efficient Transformer for Visual Recognition---arXiv 2021.05.28
Адрес бумаги:АР Вест V.org/ABS/2105.13…
10.2 Структура модели
10.3 Введение
Это статья, загруженная NTU на arXiv 28 мая. В этой статье в основном решаются две болевые точки SA: (1) вычислительная сложность Самовнимания находится в квадратной зависимости от n (n — размер пространственного измерения); (2) каждая голова имеет только частичную информацию о q, k и v. Если размеры q, k и v слишком малы, это приведет к невозможности получения непрерывной информации, что приведет к снижению производительности. Идея, изложенная в этой статье, также очень проста: в SA, до FC, используется свертка для уменьшения размерности пространства, чтобы получить меньшие K и V в размерности пространства.
10.4 Как использовать
from attention.EMSA import EMSAimport torchfrom torch import nnfrom torch.nn import functional as Finput=torch.randn(50,64,512)emsa = EMSA(d_model=512, d_k=512, d_v=512, h=8,H=8,W=8,ratio=2,apply_transform=True)output=emsa(input,input,input)print(output.shape)
[Написано в конце]
В настоящее время работа над вниманием, организованная этим проектом, действительно недостаточно всеобъемлюща. С увеличением объема чтения этот проект будет продолжать улучшаться. Добро пожаловать в звездную поддержку. Если в статье есть какие-либо неуместные выражения или ошибки реализации кода, вы можете указать на них~
В этой статье используетсяПомощник по синхронизации статейСинхронизировать