InteractE: Improving Convolution-Based Knowledge Graph Embeddings by Increasing Feature Interactions

其它关于卷积知识图谱补全:
ConvR:Adaptive Convolution for Multi-Relational Learning
ConvE:Convolutional 2D Knowledge Graph Embeddings
ConvKB代码:A Novel Embedding Model for Knowledge Base Completion Based on Convolutional Neural Network

1 介绍

1.1 引言

本篇论文是对于论文ConvE的模型进行改进,与ConvR论文类似,其都发现ConvE在实现实体entity与relation之间,进行交互时,只是进行简单的进行entity和relation之间的向量进行简单的堆积,其交互能力很低(来源于ConvR论文),大于只有20%的交互,与ConvR相比,该论文InteractE采用另外一种策略,增加其交互能力。

1.2 提高交互方法

  • feature permutation(特征进行全排类)
  • a novel feature reshaping(新型的reshape方式)
  • circular convolution(循环神经网络)

2 模型

2.1 Feature Permutation

生成 e s e_s es e r e_r er的t-random排列, P t = [ ( e s 1 , e r 1 ) , . . . . , ( e s t , e r t ) ] \mathcal P_{t} = [(e_s^1, e_r^1), ....,(e_s^t, e_r^t)] Pt=[(es1,er1),....,(est,ert)]作为一组,进行随机打乱,进行t次,每次随机打乱产生一组数据,产生t次数据,其作为输入数据的int_channel则为t,但由于所有的数据本质上是一样的,对每层进行卷积的卷积核应该一致,应该在初始时是一致的,在具体实现时采用分组卷积的形式。

2.2 Reshaping Function

在这里插入图片描述

  • Stack

堆叠的形式,ConvE在实现时采用这种方式,其交互能力很低,只有20%,但其操作比较简单。

  • Alternate

交替形式,其采用实体的feature和关系的feature交替的方式,能有效的提高交互,交互能力有所提升。

  • Chequer

这种方式交互更加彻底,其在使用时,将其所有元组进行交替,能够更加充分。

2.3 循环卷积

常规的卷积,在使用时,边界与边界之间没有任何关系,因此提出循环卷积,在卷积的时候,使其边界之间的内容进行交互。其交互的方式是使边界 ⌊ k / 2 ⌋ \lfloor {k/2} \rfloor k/2,其中k为kernal_size。在实现时,将 ⌊ k / 2 ⌋ \lfloor {k/2} \rfloor k/2左侧内容放到右侧边界, ⌊ k / 2 ⌋ \lfloor {k/2} \rfloor k/2右侧内容放到左侧;同理下侧放到上侧,上侧放到下侧。
在这里插入图片描述
图解循环卷积:
在这里插入图片描述

2.4 整体模型图

在这里插入图片描述

  • 将头实体 e s 和 e r e_s和e_r eser进行全排列,进行t次全排列,产生t个通道
  • 进行reshape,采用Chequer方式进行reshape
  • 进行卷积,采用循环卷积
  • 进行全连接,映射维度为 e s e_s es的维度一致
  • 进行1-N评分,进行rank评分

2.5 评分函数

在这里插入图片描述

3 总结

在这里插入图片描述
在这里插入图片描述

4 代码

来源:在这

from helper import *

class InteractE(torch.nn.Module):
	"""
	Proposed method in the paper. Refer Section 6 of the paper for mode details 

	Parameters
	----------
	params:        	Hyperparameters of the model
	chequer_perm:   Reshaping to be used by the model
	
	Returns
	-------
	The InteractE model instance
		
	"""
	def __init__(self, params, chequer_perm):
		super(InteractE, self).__init__()

		self.p                  = params
		self.ent_embed		= torch.nn.Embedding(self.p.num_ent,   self.p.embed_dim, padding_idx=None); xavier_normal_(self.ent_embed.weight)
		self.rel_embed		= torch.nn.Embedding(self.p.num_rel*2, self.p.embed_dim, padding_idx=None); xavier_normal_(self.rel_embed.weight)
		self.bceloss		= torch.nn.BCELoss()

		self.inp_drop		= torch.nn.Dropout(self.p.inp_drop)
		self.hidden_drop	= torch.nn.Dropout(self.p.hid_drop)
		self.feature_map_drop	= torch.nn.Dropout2d(self.p.feat_drop)
		self.bn0		= torch.nn.BatchNorm2d(self.p.perm)

		flat_sz_h 		= self.p.k_h
		flat_sz_w 		= 2*self.p.k_w
		self.padding 		= 0

		self.bn1 		= torch.nn.BatchNorm2d(self.p.num_filt*self.p.perm)
		self.flat_sz 		= flat_sz_h * flat_sz_w * self.p.num_filt*self.p.perm

		self.bn2		= torch.nn.BatchNorm1d(self.p.embed_dim)
		self.fc 		= torch.nn.Linear(self.flat_sz, self.p.embed_dim)
		self.chequer_perm	= chequer_perm

		self.register_parameter('bias', Parameter(torch.zeros(self.p.num_ent)))
		self.register_parameter('conv_filt', Parameter(torch.zeros(self.p.num_filt, 1, self.p.ker_sz,  self.p.ker_sz))); xavier_normal_(self.conv_filt)
	#96
	def loss(self, pred, true_label=None, sub_samp=None):
		label_pos	= true_label[0]; 
		label_neg	= true_label[1:]
		loss 		= self.bceloss(pred, true_label)
		return loss

	def circular_padding_chw(self, batch, padding):
		upper_pad	= batch[..., -padding:, :]
		lower_pad	= batch[..., :padding, :]
		temp		= torch.cat([upper_pad, batch, lower_pad], dim=2)

		left_pad	= temp[..., -padding:]
		right_pad	= temp[..., :padding]
		padded		= torch.cat([left_pad, temp, right_pad], dim=3)
		return padded

	def forward(self, sub, rel, neg_ents, strategy='one_to_x'):
		sub_emb		= self.ent_embed(sub)
		rel_emb		= self.rel_embed(rel)
		comb_emb	= torch.cat([sub_emb, rel_emb], dim=1)
		chequer_perm	= comb_emb[:, self.chequer_perm]
		stack_inp	= chequer_perm.reshape((-1, self.p.perm, 2*self.p.k_w, self.p.k_h))
		stack_inp	= self.bn0(stack_inp)
		x		= self.inp_drop(stack_inp)
		x		= self.circular_padding_chw(x, self.p.ker_sz//2)
		x		= F.conv2d(x, self.conv_filt.repeat(self.p.perm, 1, 1, 1), padding=self.padding, groups=self.p.perm)
		x		= self.bn1(x)
		x		= F.relu(x)
		x		= self.feature_map_drop(x)
		x		= x.view(-1, self.flat_sz)
		x		= self.fc(x)
		x		= self.hidden_drop(x)
		x		= self.bn2(x)
		x		= F.relu(x)

		if strategy == 'one_to_n':
			x = torch.mm(x, self.ent_embed.weight.transpose(1,0))
			x += self.bias.expand_as(x)
		else:
			x = torch.mul(x.unsqueeze(1), self.ent_embed(neg_ents)).sum(dim=-1)
			x += self.bias[neg_ents]

		pred	= torch.sigmoid(x)

		return pred
在RGB-红外目标检测中,为了提升多模态信息的融合效果,采用从粗到细的融合方法(Coarse-to-Fine Fusion)是一种有效的策略。这一方法的核心思想是模拟人类大脑在处理多模态信息时的过滤与选择机制,即先去除干扰信息,再进行特征的精细选择,从而实现互补特征的有效融合[^1]。 ### 冗余光谱去除(RSR)模块 在“粗”阶段,设计了冗余光谱去除(Redundant Spectrum Removal, RSR)模块。该模块通过将图像转换到频域空间,并引入动态滤波器,以自适应地减少RGB和IR模态中不相关的频谱。这样可以初步过滤掉不必要的冗余信息,保留对目标检测有帮助的关键频谱[^1]。例如,在频域中应用动态滤波器时,可以通过以下代码实现频谱的自适应调整: ```python import numpy as np import cv2 def apply_dynamic_filter(image): # 将图像转换为频域 f = np.fft.fft2(image) fshift = np.fft.fftshift(f) # 动态滤波器设计 rows, cols = image.shape crow, ccol = rows // 2, cols // 2 mask = np.ones((rows, cols), np.uint8) mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0 # 动态调整滤波区域 # 应用滤波器 fshift_filtered = fshift * mask f_ishift = np.fft.ifftshift(fshift_filtered) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) return img_back ``` ### 动态特征选择(DFS)模块 在“细”阶段,设计了动态特征选择(Dynamic Feature Selection, DFS)模块,用于在RGB和IR模态之间精细选择所需的特征。该模块通过探索不同尺度特征的组合,权衡对象检测所需的不同尺度信息,从而进一步提升检测性能。DFS模块能够根据任务需求,自适应地选择最相关的特征,确保最终融合的特征具有更强的判别能力[^1]。 ### 去除与选择检测器(RSDet) 为了验证该融合策略的有效性,构建了一个新的目标检测框架——去除与选择检测器(Removal and Selection Detector, RSDet)。该框架嵌入了从粗到细的融合策略,能够在RGB-红外目标检测任务中实现更优的性能表现。在多个公开的RGB-红外检测数据集上的实验结果表明,RSDet能够有效促进互补融合,并达到了当前最先进的性能水平[^3]。 ### 改进方向 为了进一步提升RGB-红外目标检测的效果,可以从以下几个方面进行改进: - **更精细的频谱分析**:在RSR模块中引入更复杂的频谱分析方法,例如基于深度学习的频谱注意力机制,以提高频谱过滤的精度。 - **多尺度特征融合**:在DFS模块中引入多尺度特征金字塔网络(Feature Pyramid Network, FPN),以更好地捕捉不同尺度的目标特征。 - **端到端优化**:将整个融合过程设计为端到端可训练的结构,使RSR和DFS模块能够协同优化,提升整体检测性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值