因此,我使用这个剪辑模型来执行一些标记任务。但是当我使用剪辑模型的文本编码器时,它会出现以下错误:
<ipython-input-117-4c513cc2d787> in forward(self, batch)
34 print(y.size())
35 print(y.dim())
---> 36 y = self.text_encoder(y)
37 y = self.classifier(y)
38
/usr/local/lib/python3.10/dist-packages/clip/model.py in encode_text(self, text)
345 x = x + self.positional_embedding.type(self.dtype)
346 x = x.permute(1, 0, 2) # NLD -> LND
--> 347 x = self.transformer(x)
348 x = x.permute(1, 0, 2) # LND -> NLD
349 x = self.ln_final(x).type(self.dtype)
RuntimeError: permute(sparse_coo): number of dimensions in the tensor input does not match the length of the desired ordering of dimensions i.e. input.dim() = 4 is not equal to len(dims) = 3
问题是,一张图像的标签有多个,因此我在数据加载器中使用 collate_fn 和 pad_sequence,然后再输入模型。|| |我已经打印出
def pad_sequence(batch):
return torch.nn.utils.rnn.pad_sequence(batch, batch_first=True, padding_value=0)
def my_collate_fn(batch):
batch['i'] = torch.stack(batch['i'].float())
batch['l'] = pad_sequence(batch['l'].long())
return batch
class CustomCLIP(torch.nn.Module):
def __init__(self, num_classes: int = 10, bias=False):
super().__init__()
#model, _ = clip.load("RN50")
def forward(self, batch):
x = batch['i']
x = self.encoder(x)
x = self.classifier(x)
y = batch['l']
print(y)
print(y.size())
print(y.dim())
y = self.text_encoder(y) #error on this line
y = self.classifier(y)
x_similarity = x @ x.T
y_similarity = y @ y.T
targets = F.softmax(
(x_similarity + y_similarity) / 2 * temperature, dim=-1
)
outputs = (y @ x.T) / temperature
return outputs, targets
的尺寸。它的3与长度尺寸相匹配。那么为什么会出现输入张量维度为 4 的错误?
y
请有人指出问题是什么以及如何解决。提前致谢。
[[49406, 332, 49407, ..., 0, 0, 0],
[49406, 320, 49407, ..., 0, 0, 0],
[49406, 333, 49407, ..., 0, 0, 0],
...,
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0]]], device='cuda:0')
torch.Size([32, 392, 77])
3
Someone please point out whats the issue and how to solve it. Thanks in advance.
该错误“RuntimeError: permute(sparse_coo): 张量输入中的维度数与所需维度排序的长度不匹配,即 input.dim() = 4 不等于 len(dims) = 3”表明正在尝试对形状不兼容的 4 维张量执行
permute
操作。尽管打印出的
y
的尺寸表明它是一个 3 维张量,但进入
text_encoder
的张量实际上是 4 维的。
问题出在代码中未显示的位置。以下是对该问题的分解和可能的解决方案:
-
pad_sequence
的输出: 虽然pad_sequence
通常用于对序列进行批处理,为批处理中的所有序列创建统一的长度,但如果输入已经是填充张量,它可能会增加一个额外的维度。检查pad_sequence
之后的y
的形状。如果它已经是 3 维的(批大小、序列长度、嵌入维度),则不需要pad_sequence
。 -
文本编码器的输入: CLIP 模型的
text_encoder
要求输入为 3 维张量:(批大小、序列长度、嵌入维度)
。确保传递给text_encoder
的y
的形状正确。 -
调试形状: 在代码的以下位置添加打印语句以检查张量的形状:
-
在
pad_sequence
之后,但在将其分配回batch['l']
之前:python padded_y = pad_sequence(batch['l'].long()) print("Padded y shape:", padded_y.shape) batch['l'] = padded_y
-
在
forward
方法中,就在传递给text_encoder
之前:python print("y shape before text_encoder:", y.shape) y = self.text_encoder(y)
这将帮助查明哪个部分引入了额外的维度。
- 移除额外的维度: 一旦确定了添加额外维度的位置,就可以通过以下方式之一来移除它:
-
如果是
pad_sequence
导致了问题,并且的输入已经是填充张量,请移除对pad_sequence
的调用。 -
如果在其他地方添加了维度,请使用
squeeze
函数移除单例维度。例如,如果y
的形状为(32, 1, 392, 77)
,则可以使用y = y.squeeze(1)
将其重塑为(32, 392, 77)
。
通过仔细检查每个步骤中张量的形状并根据需要进行调整,可以解决此错误并确保的代码按预期工作。
标签:python,pytorch,computer-vision,tensor,clip From: 76338180