Python 如何解决pytorch中多头注意的尺寸不匹配问题?

Python 如何解决pytorch中多头注意的尺寸不匹配问题?,python,multidimensional-array,neural-network,pytorch,attention-model,Python,Multidimensional Array,Neural Network,Pytorch,Attention Model,现在学习如何在pytorch中编码多头注意力 当输入张量的维数为4维时,我无法解决尺寸不匹配的问题 我参考了中的def和class代码 很抱歉给您带来不便,您能给我一些建议吗 #全班注意 def克隆(模块,N): “生成N个相同的层。” 返回nn.ModuleList([copy.deepcopy(模块)用于范围(N)]) def注意事项(查询、键、值、掩码=无、退出=无): “计算‘缩放点产品注意事项’” d_k=query.size(-1) 分数=torch.matmul(查询、键、转置

现在学习如何在pytorch中编码多头注意力

当输入张量的维数为4维时,我无法解决尺寸不匹配的问题

我参考了中的def和class代码

很抱歉给您带来不便,您能给我一些建议吗


#全班注意
def克隆(模块,N):
“生成N个相同的层。”
返回nn.ModuleList([copy.deepcopy(模块)用于范围(N)])
def注意事项(查询、键、值、掩码=无、退出=无):
“计算‘缩放点产品注意事项’”
d_k=query.size(-1)
分数=torch.matmul(查询、键、转置(-2,-1))\
/数学sqrt(d_k)
如果掩码不是无:
分数=分数。蒙版填充(蒙版==0,-1e9)
p_attn=F.softmax(分数,dim=-1)
如果辍学者不是无:
p_attn=辍学(p_attn)
返回火炬。matmul(p_附件,值),p_附件
#多头注意班
班级多人头注意力(nn.模块):
def uu init uu(self,h,d_模型,dropout=0.1):
“考虑模型尺寸和头部数量。”
超级(多头注意力,自我)。\uuuu init\uuuuu()
断言d_模型%h==0
#我们假设d_v总是等于d_k
self.d_k=d_模型//h
self.h=h
self.linears=克隆(nn.Linear(d_模型,d_模型),4)
self.attn=无
self.dropout=nn.dropout(p=dropout)
def forward(自我、查询、键、值、掩码=无):
“实现图2”
如果掩码不是无:
#将相同的遮罩应用于所有h型头部。
掩码=掩码。取消查询(1)
nbatches=query.size(0)
#1)从d_模型=>h x d_k批量进行所有线性投影
查询,键,值=\
[l(x).视图(n批次,-1,self.h,self.dk).转置(1,2)
对于zip中的l、x(self.linears,(查询、键、值))]
#2)分批注意所有投影向量。
x、 self.attn=注意(查询、键、值、掩码=掩码、,
辍学=自我辍学)
#3)使用视图“Concat”并应用最终线性。
x=x.transpose(1,2).continuous()\
.view(nbatches,-1,self.h*self.dk)
返回自线性[-1](x)
#创建测试4维张量
X=火炬的随机数(10,5,64,64)
X=X.view(X.shape[0],X.shape[1],X.shape[2]*X.shape[3])
#X:火炬尺寸([10,54096])
query_ux=X.transpose(2,1)
键=X
值=X
打印(“查询:,查询大小())
打印(“键:,键大小())
打印(“值:”,值大小()
#查询:火炬大小([104096,5])
#键:火炬。尺寸([10,54096])
#值:火炬尺寸([10,54096])
多头测试模型=多头注意力(h=4,d_模型=4096,辍学=0.1)
#打印(多头_型)
输出=多头测试模型(查询=查询,键=键,值=值)
打印(“模型输出:”,output.size())
#大小不匹配,m1:[40960 x 5],m2:[4096 x 4096]位于#../aten/src/TH/generic/THTensorMath.cpp:197
对于tensor seze:torch.randn(5,64,64),此代码没有错误

X=torch.randn(5,64,64)
#X=X.view(X.shape[0],X.shape[1],X.shape[2]*X.shape[3])

query_=X.transpose(2,1)
key_=X
value_=X

print("query:",query_.size())
print("key:",key_.size())
print("value:",value_.size())

#query: torch.Size([5, 64, 64])
#key: torch.Size([5, 64, 64])
#value: torch.Size([5, 64, 64])

multihead_model= MultiHeadedAttention(h=4,d_model=64,dropout=0.1)
temp_output=multihead_model(query=query_,key=key_,value=value_)
print(temp_output.size())
#torch.Size([5, 64, 64])


看起来代码希望获得与
查询
相同的维度,因此,如果不转置,它将修复此问题:

query_ = X
key_ = X
value_ = X

您是对的,注意需要有一个转置来工作,但是代码已经通过在注意实现中调用
key.transpose(-2,-1)
来处理这个问题。

多亏了您,我可以实现这个代码处理转置方法来查询内部。非常感谢。