BR-IDL / PaddleViT

:robot: PaddleViT: State-of-the-art Visual Transformer and MLP Models for PaddlePaddle 2.0+
https://github.com/BR-IDL/PaddleViT
Apache License 2.0
1.22k stars 318 forks source link

关于 ViT Transformer VisualTransformer 模型输出的疑问 #77

Closed libertatis closed 2 years ago

libertatis commented 2 years ago

PaddleViT/image_classification/ViT/transformer.py VisualTransformer 模型的输出是不是少了一个 attn:

class VisualTransformer(nn.Layer):
    ……
    def forward(self, x):
        x = self.patch_embedding(x)
        x, attn = self.encoder(x)
        logits = self.classifier(x[:, 0]) # take only cls_token as classifier
        return logits

我个人认为,模型的输出应该同时返回 attn的:

class VisualTransformer(nn.Layer):
    ……
    def forward(self, x):
        x = self.patch_embedding(x)
        x, attn = self.encoder(x)
        logits = self.classifier(x[:, 0]) # take only cls_token as classifier
        return logits, attn

理由如下:

综上,建议模型输出同时返回每层的注意力权重 attn~

xperzy commented 2 years ago

Hello, 感谢留Issue,这一部分其实在大部分的模型中没有返回这个attn(其实是attn_weights), 这部分在ViT中保留的原因是给用户展示一下如果需要可视化或者别的用途的时候可以用该方式返回attn weights,但是模型本身的训练和测试不需要这个参数。 目前PaddleViT还没有任何可视化的工具和功能提供,后期可以列入计划。

综上,在ViT模型中完全可以返回attn,目前为了保证主程序和其他模型统一,我建议暂时保留目前的接口,后期再做统一调整。

This issue has been explained above, so I close this issue.