输入 ViT 的较大图像的位置嵌入

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

预训练的 ViT(Vision Transformer)模型通常在 224x224 图像或 384x384 图像上进行训练。但我必须在 640x640 图像上微调自定义 ViT 模型(ViT 的所有层加上一些附加层)。在这种情况下如何处理位置嵌入?当我使用

ViT-base-patch16-384
将预先训练的权重从
load_state_dict()
(在 Huggingface 上可用)加载到我的模型时,出现以下错误:

pos_embed 的大小不匹配:复制形状为 torch.Size([1, 577, 768]) 从检查点开始,当前模型的形状是 火炬.Size([1, 1601, 768]).

这个错误是预料之中的,因为原始模型有 24x24=576 个位置嵌入,而我的模型有 40x40=1600 个位置嵌入(因为现在图像的大小是 640x640)。

据我研究,研究人员使用插值法来解决这个问题。我的问题是,如果我使用双三次插值,以下代码是否可以解决我面临的问题?它会正确插入位置嵌入吗?

import torch
a = torch.rand(1, 577, 768)  # say it is the original pos_embed
a_temp = a.unsqueeze(0)  # shape of a_temp is (1,1,577,768)
# making it 4D because bicubic interpolation of torch works for only 4D and 5D

b = torch.nn.functional.interpolate(a_temp, [1601,768], mode='bicubic')
# shape of b is now (1,1,1601,768)

b = torch.squeeze(b,0)  # transferring b from 4D to 3D again
# shape of b is now (1,1601,768)

注意我按照video实现了原始的ViT,然后我添加了一些额外的层。

pytorch tensor huggingface-transformers bicubic vision-transformer
1个回答
0
投票

将其下采样为 224x224 或 384x384 是一种选择,但由于双三次(或其他方法)插值,您会降低图像质量。

另一种选择是自定义编写 ViT 模型,它将能够处理全 640x640 分辨率的图像。您只需更改模型的补丁嵌入部分,其他块将保持不变。 例如,如果您的输入分辨率为 640x640,则可以将其嵌入到每个 40x40 像素的 16x16 块中。然后你将得到 [256+1cls, 768] 序列(你也可以将其嵌入到更短的序列 [257,384] 中,这进一步降低了模型的复杂性)。

© www.soinside.com 2019 - 2024. All rights reserved.