我实现的文件Deep multiscale convolutional feature learning for weakly supervised localization of chest pathologies in X-ray images根据我的理解,层相关性权重属于每个密集块的最后一层.
我尝试实现如下所示的权重约束:
def weight_constraints(self):
weights= {'feat1': self.model.features.denseblock2.denselayer12.conv2.weight.data,
'feat2':self.model.features.denseblock3.denselayer24.conv2.weight.data,
'feat3':self.model.features.denseblock4.denselayer16.conv2.weight.data}
sum(weights.values()) == 1
for i in weights.keys():
w = weights[i]
w1 = w.clamp(min= 0)
weights[i] = w1
return weights
weights= self.weight_constraints()
for i in weights.keys():
w = weights[i]
l = logits[i]
p = torch.matmul(w , l[0])
sum = sum + p
其中,logits是一个字典,其中包含每个数据块的FC层外数据,如图所示。
logits ={"特征1 ":[Tensor(-0.0630,...确认0〉)],'特征2':[Tensor(-0.0323,...确认0〉)],'特征3':[Tensor([[-8.2897e -06...ackward0〉)]}
出现以下错误:
mat1和mat2形状不能相乘(12288x3和1x1)
这是正确的做法吗?
1条答案
按热度按时间mftmpeh81#
论文指出
来自所有层的logit响应具有相同的维度(等于分类的类别数),并且现在可以使用类别特定的convex combination来组合以获得类别pc的概率得分。
您使用的函数matmul执行矩阵乘法,它需要
mat1.shape[-1] == mat2.shape[-2]
。如果假设
sum(w)==1
和torch.all(w > 0)
,则可以将l
的凸组合计算为(w * l).sum(-1)
,它是w
和l
元素的乘积,在l
的批维度上广播,并且需要w.shape[-1] == l.shape[-1]
(假定为3)。如果你想继续使用matmul,你可以给
w
和l
增加一个维度,然后把向量积当作矩阵乘法来执行:一米一米一。