Ошибка при преобразовании модели быстрого текста в тензорный центр - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь преобразовать быструю текстовую модель фейсбука в формат tenorflow-hub. Для этого я приложил два основных файла.

def _compute_ngrams(word, min_n=1, max_n=3):
    BOW, EOW = ('<', '>')  # Used by FastText to attach to all words as prefix and suffix
    ngrams = [] # batch_size, n_words, maxlen
    shape = word.shape # batch_size, n_sentenes, n_words
    maxlen = 0
    for b in range(shape[0]): # batch
        ngram_b = []
        for w in word[b]: 
            ngram = []
            extended_word = BOW + "".join( chr(x) for x in bytearray(w)) + EOW
            if w.decode("utf-8") not in global_vocab:
                for ngram_length in range(min_n, min(len(extended_word), max_n) + 1):
                    for i in range(0, len(extended_word) - ngram_length + 1):
                        ngram.append(extended_word[i:i + ngram_length])
            else:
                ngram.append(w.decode("utf-8") )
            ngram_b.append(ngram)
            maxlen = max(maxlen, len(ngram))
        ngrams.append(ngram_b)
    for batches in ngrams:
        for words in batches:
            temp = maxlen
            r = []
            while temp > len(words):
                r.append("UNK")
                temp = temp - 1
            words.extend(r)
    return ngrams

def make_module_spec(vocabulary_file, vocab_size, embeddings_dim=300,
                     num_oov_buckets=1):



     def module_fn():
        """Spec function for a token embedding module."""
        words = tf.placeholder(shape=[None, None], dtype=tf.string, name="tokens")
        tokens = tf.py_func(_compute_ngrams, [words], tf.string)
        embeddings_var = tf.get_variable(
            initializer=tf.zeros([vocab_size + num_oov_buckets, embeddings_dim]),
            name=EMBEDDINGS_VAR_NAME,
            dtype=tf.float32
        )

        lookup_table = tf.contrib.lookup.index_table_from_file(
            vocabulary_file=vocabulary_file,
            num_oov_buckets=num_oov_buckets,
        )
        ids = lookup_table.lookup(tokens)
        #combined_embedding = tf.reduce_mean(tf.nn.embedding_lookup(params=embeddings_var, ids=ids), axis=2)
        combined_embedding = tf.nn.embedding_lookup(params=embeddings_var, ids=ids)
        hub.add_signature("default", {"tokens": words},
                          {"default": combined_embedding})
    return hub.create_module_spec(module_fn)

Модель создана, как и ожидалось, в формате tf-hub.

Но когда я пытаюсь использовать созданную выше модель, я получаю эту ошибку.

Пример кода тестирования для использования созданной выше модели tf-hub прилагается ниже.

with tf.Graph().as_default():
  module_url = "/home/sahil_wadhwa/tf-hub/tf_sent"
  embed = hub.Module(module_url)
  embeddings = embed([["Indian", "American"], ["Hello", "World"]])

  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.tables_initializer())
    result = sess.run(embeddings)
    print(result)
    print(result.shape)

Я получаю ошибку здесь.

Traceback (most recent call last):

  File "/home/sahil_wadhwa/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 195, in __call__
    raise ValueError("callback %s is not found" % token)

ValueError: callback pyfunc_0 is not found


         [[{{node module_apply_default/PyFunc}} = PyFunc[Tin=[DT_STRING], Tout=[DT_STRING], token="pyfunc_0", _device="/job:localhost/replica:0/task:0/device:CPU:0"](Const)]]

Застрявший в этом надолго, любая помощь здесь будет полезна.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Отвечено на https://github.com/tensorflow/hub/issues/222:

Привет, Сахил,

Проблема здесь в том, что tf.py_func не может быть сериализован.Сериализация произвольных функций Python не поддерживается (по нескольким причинам).

Я вижу, что вы создаете нграммы из токена, если их нет в словаре (кстати, нужно ли искать нграммы в словаре FastText илион содержит только полные слова?).

Один из способов решения этой проблемы - переписать функцию _compute_ngrams в TensorFlow (возможно, вы могли бы использовать это напрямую или хотя бы получить вдохновение: https://www.tensorflow.org/tfx/transform/api_docs/python/tft/ngrams).

...