Как использовать манхэттенское расстояние в Керасе - PullRequest
0 голосов
/ 10 февраля 2019

Мой вопрос о том, как использовать манхэттенское расстояние в Керасе.Я работаю над проектом классификации текста по метрикам подобия предложений.Поэтому я считаю, что нужно использовать манхэттенское расстояние для расчета сходства.Функция потерь выглядит следующим образом:

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 Тогда точность в моей модели будет отличной.До сих пор я не знаю, какой из них использовать, и как объяснить истину, чтобы разрушить прогноз для моей модели?

Пожалуйста, помогите по этому вопросу.

1 Ответ

0 голосов
/ 12 февраля 2019

Хорошо, я, наверное, получил ответexp () - функция нормализации.Он нормализует расстояния в [0,1], а в случае нормализации может повысить конвергенцию, но это не обязательно.В моем случае это может быть какой-то сложной причиной того, что точность была изменена путем нормализации.Я продлил время тренировки и результат должен быть таким же.Но из-за потери вычислений с плавающей точкой в ​​данных нормализация приводит к ошибкам в точности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...