import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.nn.modules.linear import Linear
from layers.SelfAttention_Family import AttentionLayer, FullAttention
from layers.Embed import DataEmbedding
import math
#定义了一个函数来获取注意力掩码,这个掩码用于PAM-Naive(Pyramid Attention Mechanism)的注意力层。
def get_mask(input_size, window_size, inner_size):
"""Get the attention mask of PAM-Naive"""
# Get the size of all layers
#初始化一个列表,用于存放每一层的尺寸。
all_size = []
#将输入尺寸添加到列表中。
all_size.append(input_size)
#通过迭代,计算每个窗口尺寸的层尺寸。
for i in range(len(window_size)):
layer_size = math.floor(all_size[i] / window_size[i])
all_size.append(layer_size)
#初始化一个全0的注意力掩码。
seq_length = sum(all_size)
mask = torch.zeros(seq_length, seq_length)
# get intra-scale mask
#计算内部窗口的大小。
inner_window = inner_size // 2
#以下循环块填充掩码矩阵,设置内尺度和跨尺度的注意力范围。
for layer_idx in range(len(all_size)):
start = sum(all_size[:layer_idx])
for i in range(start, start + all_size[layer_idx]):
left_side = max(i - inner_window, start)
right_side = min(i + inner_window + 1, start + all_size[layer_idx])
mask[i, left_side:right_side] = 1
# get inter-scale mask
for layer_idx in range(1, len(all_size)):
start = sum(all_size[:layer_idx])
for i in range(start, start + all_size[layer_idx]):
left_side = (start - all_size[layer_idx - 1]) + \
(i - start) * window_size[layer_idx - 1]
if i == (start + all_size[layer_idx] - 1):
right_side = start
else:
right_side = (
&nbs

Pyraformer_EncDec.py代码解析&spm=1001.2101.3001.5002&articleId=136057373&d=1&t=3&u=9c392044a35646bda9b97c16d707ab70)
211

被折叠的 条评论
为什么被折叠?



