python - 从 PyTorch 分割模型嵌入
问题描述
我试图从微调torchvision.models.segmentation.fcn_resnet50
模型中获得平均嵌入。我测试过的一种方法是将分类器与nn.Identity
层交换(返回形状的张量 [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()
模型的方法(如何?)或者可能有其他变体?
PS我知道使用分割模型作为嵌入器可能不是最好的想法,但目前正在尝试专门测试这种方法。
解决方案
推荐阅读
- python - 为什么我在第一个冒号上有语法错误,但仅在某些设备上(所有 Windows 10)
- sql - 使用 SQL 确定两个日期范围是否重叠
- javascript - React.js 以状态语法从数组中删除项目
- sql - PostgreSQL 正在更新所有行
- c# - 关于顺序攻击/提前完成顺序的问题
- perl - 从奇点配方问题构建
- java - 如何将变量从一个类传递到另一个类?
- spring-boot - Spring Boot & RabbitMQ:如何检测应用程序何时重新连接到代理
- python-3.x - 没有名为“cv2”的模块:环境问题?
- outlook - 如何从 Applescript 访问未发送的 Outlook 邮件的收件人列表