看来我没有正确设计编码器,这就是为什么我需要专家的意见,因为我是变压器和深度学习模型设计的初学者。
我在编码器中有两种不同类型的 Transformers 网络,如下所示:
每个分支的嵌入维数为256,它们通过线性层融合
self.fusion_head = nn.Linear(2*self.num_features, self.num_features) #self_num_features = 256
我的编码器中有一个前向特征函数
def transformer_forward(self,x):
"""
:param x: The embeddings + pos_embed
:return:
"""
x_t1 = self.transformer_type1(x) # torch.Size([1, 1280, 256])
x_t2 = self.transformer_type2.forward(x) # torch.Size([1, 1280, 256])
# x = x_t1 + x_t2
x = torch.cat([x_t1,x_t2],dim=2)
x = self.fusion_head(x)
return x
但是,在训练模型并加载检查点后,我意识到
self.fusion_head
位于transformer_type1
模块之后
。 ... 3.0.fn.to_qkv.weight','module.encoder.transformer_type1.3.layers.3.0.fn.to_out.0.weight','module.encoder.transformer_type1.3.layers.3.0.fn.to_out .0.bias', 'module.encoder.transformer_type1.3.layers.3.1.norm.weight', 'module.encoder.transformer_type1.3.layers.3.1.norm.bias', 'module.encoder.transformer_type1.3 .layers.3.1.fn.net.0.weight','module.encoder.transformer_type1.3.layers.3.1.fn.net.0.bias','module.encoder.transformer_type1.3.layers.3.1.fn .net.3.weight'、'module.encoder.transformer_type1.3.layers.3.1.fn.net.3.bias'、'module.encoder.mlp_head.0.weight'、'module.encoder.mlp_head.0 .bias', 'module.encoder.mlp_head.1.weight', 'module.encoder.mlp_head.1.bias', 'module.encoder.fusion_head.weight', 'module.encoder.fusion_head.bias', 'module.encoder.transformer_type2.pos_embed','module.encoder.transformer_type2.patch_embed.proj.weight','module.encoder.transformer_type2.patch_embed.proj.bias','module.encoder.transformer_type2.patch_embed.norm.weight ', 'module.encoder.transformer_type2.patch_embed.norm.bias', 'module.encoder.transformer_type2.blocks.0.norm1.weight', 'module.encoder.transformer_type2.blocks.0.norm1.bias', '模块.encoder.transformer_type2.blocks.0.filter.complex_weight', 'module.encoder.transformer_type2.blocks.0.norm2.weight', 'module.encoder.transformer_type2.blocks.0.norm2.bias', 'module.encoder .transformer_type2.blocks.0.mlp.fc1.weight',...
这个串联层(即
fusion_head
)在前向函数中的放置是否正确?为什么它被放置在transformet_type1
之后?就顺序而言,fusion_head
层不应该位于transformet_type1
和transformer_type2
之后吗?
__repr__
的实现。它会打印您在网络的 __init__
方法中注册的模块。 forward
方法没有定义顺序,这是有道理的,因为您可以在 forward
内多次调用模块,也可以根本不调用模块。
import torch
from torch import nn
class Bla(nn.Module):
def __init__(self):
super().__init__()
self.b1 = nn.Linear(256, 128)
self.b2 = nn.GELU()
self.b3 = nn.Linear(128,5)
self.b0 = nn.Embedding(100,256)
def forward(self, x):
emb = self.b0(x)
emb = self.b1(emb)
emb = self.b2(emb)
emb = self.b3(emb)
return emb
net = Bla()
print(net)
输出:
Bla(
(b1): Linear(in_features=256, out_features=128, bias=True)
(b2): GELU(approximate='none')
(b3): Linear(in_features=128, out_features=5, bias=True)
(b0): Embedding(100, 256)
)