问题代码
# 创建 ConvE 模型实例
args = {
"entity_dim": 200,
"relation_dim": 200,
"time_dim": 200,
"emb_2D_d1": 10,
"emb_2D_d2": 20,
"num_out_channels": 32,
"kernel_size": 3,
"hidden_dropout_rate": 0.3,
"feat_dropout_rate": 0.3
}
num_entities = 1000 # 假设实体数量为1000
model = ConvE(args, num_entities)
print(model)
问题:
AttributeError: ‘dict’ object has no attribute ‘entity_dim’
解决方案:
问题可能是因为传递的参数 args 是一个字典,但模型的初始化方法期望的第一个参数是一个自定义的对象,而不是字典。
为了解决这个问题,可以创建一个包含所有参数的自定义类,并将其传递给模型的初始化方法。这样可以确保模型能够正确地访问各个参数。
代码
class Args:
def __init__(self, entity_dim, relation_dim, time_dim, emb_2D_d1, emb_2D_d2,
num_out_channels, kernel_size, hidden_dropout_rate, feat_dropout_rate):
self.entity_dim = entity_dim
self.relation_dim = relation_dim
self.time_dim = time_dim
self.emb_2D_d1 = emb_2D_d1
self.emb_2D_d2 = emb_2D_d2
self.num_out_channels = num_out_channels
self.kernel_size = kernel_size
self.hidden_dropout_rate = hidden_dropout_rate
self.feat_dropout_rate = feat_dropout_rate
# 创建 Args 实例
args = Args(entity_dim=200, relation_dim=200, time_dim=200, emb_2D_d1=10, emb_2D_d2=20,
num_out_channels=32, kernel_size=3, hidden_dropout_rate=0.3, feat_dropout_rate=0.3)
# 创建 ConvE 模型实例
model = ConvE(args, num_entities)
print(model)
模型结构
ConvE(
(HiddenDropout): Dropout(p=0.3, inplace=False)
(FeatureDropout): Dropout(p=0.3, inplace=False)
(conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))
(bn0): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(bn2): BatchNorm1d(200, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(fc): Linear(in_features=16128, out_features=200, bias=True)
)