Мой вопрос о том, как использовать манхэттенское расстояние в Керасе.Я работаю над проектом классификации текста по метрикам подобия предложений.Поэтому я считаю, что нужно использовать манхэттенское расстояние для расчета сходства.Функция потерь выглядит следующим образом:
def exponent_neg_manhattan_distance(left, right):
''' Helper function for the similarity estimate of the LSTMs outputs'''
return K.exp(-K.sum(K.abs(left - right), axis=1, keepdims=True))
def manhattan_distance(left, right):
''' Helper function for the similarity estimate of the LSTMs outputs'''
return K.sum(K.abs(left - right), axis=1, keepdims=True)
# The visible layer
left_input = Input(shape=(max_seq_length,), dtype='int32')
right_input = Input(shape=(max_seq_length,), dtype='int32')
embedding_layer = Embedding(len(embeddings), embedding_dim, weights=[embeddings], input_length=max_seq_length, trainable=False)
# Embedded version of the inputs
encoded_left = embedding_layer(left_input)
encoded_right = embedding_layer(right_input)
# Since this is a siamese network, both sides share the same LSTM
shared_lstm = LSTM(n_hidden)
left_output = shared_lstm(encoded_left)
right_output = shared_lstm(encoded_right)
# Calculates the distance as defined by the MaLSTM model
malstm_distance = Lambda(function=lambda x:
exponent_neg_manhattan_distance(x[0], x[1]),output_shape=lambda x: (x[0]
[0], 1))([left_output, right_output])
# Pack it all up into a model
malstm = Model([left_input, right_input], [malstm_distance])
# Adadelta optimizer, with gradient clipping by norm
optimizer = Adadelta(clipnorm=gradient_clipping_norm)
malstm.compile(loss='mean_squared_error', optimizer=optimizer, metrics=
['accuracy'])
malstm_trained = malstm.fit([X_train['left'], X_train['right']], Y_train,
batch_size=batch_size, nb_epoch=n_epoch,
validation_data=([X_validation['left'],
X_validation['right']], Y_validation),
callbacks=[checkpointer])
Однако эта функция exponent_neg_manhattan_distance()
на самом деле не работает должным образом.Я искал в интернете и обнаружил, что оригинальная версия манхэттенского расстояния написана так: manhattan_distance
Тогда точность в моей модели будет отличной.До сих пор я не знаю, какой из них использовать, и как объяснить истину, чтобы разрушить прогноз для моей модели?
Пожалуйста, помогите по этому вопросу.