почему позиционная кодировка имеет размер (1,patch,emb), в целом она должна быть (batch_size,patch,emb)
даже в коде GitHub pytorch https://github.com/pytorch/vision/blob/main/torchvision/models/vision_transformer.py они определяют
self.pos_embedding = nn.Parameter(torch.empty(1, seq_length, Hidden_dim).normal_(std=0.02)) # из BERT
может ли кто-нибудь мне помочь, что мне следует использовать в качестве pos_encoding в моем коде?
self.pos_embedding = nn.Parameter(torch.empty(batch_size, seq_length, Hidden_dim).normal_(std=0.02))
это правильно?
Поскольку вы не знаете размер пакета при инициализации self.pos_embedding, вам следует инициализировать этот тензор следующим образом:
self.pos_embedding = nn.Parameter(
torch.empty(1, num_patches + 1, hidden_dim).normal_(std=0.02)
)
# (dont forget about the cls token)
PyTorch позаботится о трансляции тензоров в прямом проходе:
x = x + self.pos_embedding
# (batch_size, num_patches + 1, embedding_dim) + (1, num_patches + 1, embedding_dim) is ok
Но это не будет работать с токеном cls. Вам следует расширить этот тензор вперед:
cls_token = self.cls_token.expand(
batch_size, -1, -1
)