是因爲在構造模型是,使用了自定義的層,如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搜質量會高不少。