2016-05-16 2 views
5

Я использую операцию embedding_lookup для генерации плотных векторных представлений для каждого токена в моем документе, которые являются каналом сверточной нейронной сети (сетевая архитектура похожа на a WildML article).Встраивание таблицы поиска не маскирует значение заполнения

Все работает правильно, но когда я вставляю свой документ, вставляя в него добавочное значение, поиск встраивания также генерирует вектор для этого токена. Я думаю, что этот подход может изменить результаты в задаче классификации. То, что я хочу достичь, похоже на то, что делает факел LookupTableMaskZero.

1) Правильно, что я хочу делать?

2) Уже реализовано что-то вроде этого?

3) Если нет, как я могу замаскировать значение заполнения, чтобы предотвратить генерацию соответствующего вектора для него?

Спасибо заранее,

Алессандро

+0

Вы когда-нибудь находили решение? – Shatu

ответ

2

@Alessandro Suglia Я думаю, что эта функция полезна, к сожалению, ТФ не поддерживает прямо сейчас. Одним из способов обхода одного и того же результата, но медленнее, является поиск дважды. , как показано ниже

lookup_result = tf.nn.embedding_lookup(emb, index) 
    masked_emb = tf.concat(0, [tf.zeros([1, 1]), 
          tf.ones([emb.get_shape()[0] - 1, 1]) 
    mask_lookup_result = tf.nn.embedding_lookup(masked_emb, index) 
    lookup_result = tf.mul(lookup_result, mask_lookup_result) 
-1

Казалось, что в RNn модели, нам не нужно маскировать значение заполнени до тех пор, как мы маскирования потери (потери не так же независимо от того, маскирует ли мы входной отступы, я получаю результат, запустив тестовый код)!

Конечно, нулевое заполнение может ускорить вычисление для нулевого умножения, когда параметр sequence_len в tf.nn.dynamic_rnn не передается.

В конце, если модель будет взаимодействовать между последовательностью (например, CNN, свертка может повлиять на вложение дополнений), необходимо встраивание нулевого заполнения.