Tenorflow tf.edit_distance требуется объяснение?

Как работает функция tensorflow tf.edit_distance? Как он сравнивает строку, хранящуюся в двух разных разреженных матрицах, эквивалентных 2-мерной или трехмерной плотной матрице.

Пример, приведенный на веб-странице тензорного потока https://www.tensorflow.org/api_docs/python/tf/edit_distance, не так очевиден. Пожалуйста, дайте объяснение, используя некоторые другие примеры.

Также этот пример непонятен.

#'hypothesis' is a tensor of shape [2, 1] with variable-length values:
#(0,0) = ["a"] and (1,0) = ["b"]

hypothesis = tf.SparseTensor([[0, 0, 0],[1, 0, 0]],["a", "b"],(2, 1, 1))

#'truth' is a tensor of shape `[2, 2]` with variable-length values:
#(0,0) = [], (0,1) = ["a"], (1,0) = ["b", "c"],(1,1) = ["a"]

truth = tf.SparseTensor([[0, 1, 0],[1, 0, 0],[1, 0, 1],[1, 1, 0]],["a", "b", 
"c", "a"],(2, 2, 2))

normalize = True

#'output' is a tensor of shape [2, 2] with edit distances normalized by 
#'truth' lengths.

output ==> [[inf, 1.0],[0.5, 1.0]],

(0,0): no truth, (0,1): no hypothesis, (1,0): addition, (1,1): no hypothesis

Каким образом выпуск имеет размер [2,2]?

Что здесь делает нормализация?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 318
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

гипотеза в плотной форме выглядит так

[[['a']],
 [['b']]] # (2, 1, 1)

правда это

[[[],['a']],
 [['b', 'c'], ['a']]] # (2, 2, 2)

Мы пытаемся найти Расстояние Левенштейна между гипотезой и значением истинности. Итак, вот что происходит:

at (0,0,0) - насколько далеко ['a'] в гипотезе от [] - в этой позиции нет истины, поэтому невозможно вычислить расстояние

at (0,0,1) - поскольку в этой позиции нет ничего в гипотезе, мы возвращаем 1. В отличие от случая выше, расстояние равно 1, потому что теоретически гипотеза может быть сделана такой же, как истина, вставив один символ (см. расстояние Левенштейна расчеты)

at (1,0,0) - насколько далеко ['b'] в hyp от ['b', 'c'] в действительности. Это снова 1, так как мы можем вставить символ, чтобы гипс был таким же, как истина. Но мы выбрали нормализацию выходного расстояния. Итак, мы делим на длину отрезка истинности, который равен 2. Итак, вы получаете 0,5.

at (1,0,1) - насколько далеко [] в hyp от ['a'], поскольку в этой позиции в hyp нет ничего, мы возвращаем 1

Результатом будет (2,2), потому что ранг гипотезы и истины равен 3. Функция возвращает тензор с рангом (ранг-1).

Помогает представление о том, что мы пытаемся здесь сделать. У вас есть 2 последовательности в гипотезе и 2 последовательности в истине. Таким образом, ваш результат будет таким, чтобы вы получали баллы за каждую позицию в каждой последовательности.

Вот пример, в котором мы пытаемся сопоставить 4 гипотезы со значением истинности. Я думаю, вам нужно сделать это для каждой последовательности истинности для варианта использования, который вы описываете в своем комментарии - дайте мне знать, если вы найдете что-то более эффективное :-)

import tensorflow as tf

hypothesis = tf.SparseTensor(
            [[0, 0, 0],
             [1, 0, 0],
             [2, 0, 0],
             [3, 0, 0]],
             ["a", "b", "c", "d"],
            (4, 1, 1))

truth = tf.SparseTensor([[0, 0, 0], [0, 0, 1], [0, 1, 0]], ["b", "c", "a"], (1,2,2))
num_hyp = 4
truth = tf.sparse_concat(0, [truth] * num_hyp)

d = tf.edit_distance(hypothesis, truth)

with tf.Session() as sess:
    print(sess.run(d))

Выход:

[[1.  1. ]
 [0.5 1. ]
 [0.5 1. ]
 [1.  1. ]]

Спасибо @dgumo за ваш ответ. Итак, я вижу, что последнее измерение всегда предполагается для представления последовательности, поэтому функция возвращает тензор с рангом меньше исходного ранга. Также предположим, что если у меня есть 2 последовательности, представляющие истину, и я хочу найти расстояние редактирования от последовательностей, сгенерированных из RNN (гипотезы), скажем, 40 последовательностей. Тогда как представить истину и гипотезы так, чтобы я получил 80 расстояний (40 гипо по сравнению с 1-й последовательностью истины, а затем 40 гипо по сравнению со 2-й последовательностью истины)?

abhi 31.07.2018 20:16

Обновленный ответ, соответствующий вашему случаю выше.

dgumo 31.07.2018 23:21

Другие вопросы по теме