我正试图从Finetened中获得平均嵌入 torchvision.models.segmentation.fcn_resnet50
模型我测试过的一种方法是用 nn.Identity
层(返回形状的Tensor[batch_size,feature_num,h,w]),并使用 torch.mean
论推理
model_embedder.classifier = Identity()
outputs = torch.mean(model_embedder(inputs), dim=[2, 3])
但我注意到了 forward()
torchvision分割模型的方法如下:
# ...
x = features["out"]
x = self.classifier(x)
x = F.interpolate(x, size=input_shape, mode='bilinear', align_corners=False)
result["out"] = x
# ...
和使用 F.interpolate()
on功能可能会导致意外结果(特别是内存泄漏和分段错误)。我也试着补充一下 AvgPooling
层直接建模
class EmbeddingAvgPooling(nn.Module):
def __init__(self):
super(EmbeddingAvgPooling, self).__init__()
def forward(self, x):
return torch.mean(x, dim=[2, 3])
model_embedder.classifier = EmbeddingAvgPooling()
但当然,这与 F.interpolate()
任何方面的应用程序问题(在此设置中,错误不是分段错误,而是 size mismatch
从…起 F.interpolate()
,这是可以预期的)。我能做些什么来解决这个问题?我需要覆盖吗 forward()
模型的方法(如何?)或其他变体是否可行?
p、 我知道使用分割模型作为嵌入器可能不是最好的想法,但目前正在尝试具体测试这种方法。
暂无答案!
目前还没有任何答案,快来回答吧!