编码器设计中如何进行两个并行分支的融合?

问题描述 投票:0回答:1

看来我没有正确设计编码器,这就是为什么我需要专家的意见,因为我是变压器和深度学习模型设计的初学者。

我在编码器中有两种不同类型的 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
之后吗?

deep-learning pytorch neural-network huggingface-transformers transformer-model
1个回答
0
投票

您看到的是 nn.Module 的

__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)
)
© www.soinside.com 2019 - 2024. All rights reserved.