使用keras,在load_model()时,出现NameError: name '***' is not defined

是因为在构造模型是,使用了自定义的层,如Lambda()

# 文本相似度评估方式
def exponent_neg_manhattan_distance(sent_left, sent_middle, sent_right):
    '''基于曼哈顿空间距离计算两个字符串语义空间表示相似度计算'''
    return ((K.exp(-K.sum(K.abs(sent_left - sent_middle), axis=1, keepdims=True)) - K.exp(-K.sum(K.abs(sent_left - sent_right), axis=1, keepdims=True))) + 1) / 2


def bilstm_siamese_model():
    '''搭建孪生网络'''
    #可以在这里调参
    embedding_layer = Embedding(VOCAB_SIZE + 1,
                                EMBEDDING_DIM,
                                weights=[embedding_matrix],
                                input_length=MAX_LENGTH,
                                trainable=True,  #原本为False
                                mask_zero=True)
    #输入层
    left_input = Input(shape=(MAX_LENGTH,), dtype='float32', name="left_x")  #(?, 25)
    middle_input = Input(shape=(MAX_LENGTH,), dtype='float32', name="middle_x")  #(?, 25)
    right_input = Input(shape=(MAX_LENGTH,), dtype='float32', name='right_x')
    #嵌入层
    encoded_left = embedding_layer(left_input)  #(?, 25, 300)
    encoded_middle = embedding_layer(middle_input)  #(?, 25, 300)
    encoded_right = embedding_layer(right_input)
    # print(encoded_left)
    #孪生网络
    shared_lstm = create_base_network(input_shape=(MAX_LENGTH, EMBEDDING_DIM))
    left_output = shared_lstm(encoded_left)
    middle_output = shared_lstm(encoded_middle)
    right_output = shared_lstm(encoded_right)

    # 文本相似度评估方式
    distance = Lambda(lambda x: exponent_neg_manhattan_distance(x[0], x[1], x[2]),output_shape=lambda x: (x[0][0], 1))([left_output, middle_output, right_output])  #第二个lambda函数的输入参数不清楚,x[0][0]
    print('distance',distance)
    model = Model([left_input, middle_input, right_input], distance)
    model.compile(loss='binary_crossentropy',
                  optimizer='nadam',
                  metrics=['accuracy'])
    model.summary()
    return model

虽然之前已经定义好了exponent_neg_manhattan_distance(),但是在load_model()依然会报NameError: name 'exponent_neg_manhattan_distance' is not defined

解决办法:

load_model的时候,加一个custom_objects参数就可以了,即

model = load_model(model_path,custom_objects={'exponent_neg_manhattan_distance': exponent_neg_manhattan_distance})  #对自定义层一定要说明

注:用Google搜bug比用baidu搜质量会高不少。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值