Как использовать таблицы tf.lookup с кэрами TensorFlow 2.0 - PullRequest
0 голосов
/ 22 октября 2019

Я провожу последние 5 часов или около того, пытаясь заставить TF 2.0 keras API работать с API tf.lookup. Вопрос в том, как использовать таблицы tf.lookup с TensorFlow 2.0 Keras Model API.

У меня возникали проблемы с keras при сериализации, когда я пытался использовать функциональный API Keras с table.lookup напрямую:

table = tf.lookup.StaticVocabularyTable(tf.lookup.TextFileInitializer(vocab_path, tf.string, 0, tf.int64, 1, delimiter=","), 1)
categorical_indices = table.lookup(categorical_input)

Заключение вышеуказанного вызова в слой tf.keras.layers.Lambda не помогло. Я получал ошибки, связанные с дескрипторами ресурса или отсутствующей переменной tf ...

1 Ответ

0 голосов
/ 22 октября 2019

Обмен решением здесь, чтобы спасти кого-то еще от боли. Вот решение, которое я нашел работающим:

vocab_path = os.path.join(mount_point, 'category_vocab.csv')

class VocabLookup(layers.Layer):
  def __init__(self, vocab_path, num_oov_buckets, **kwargs):
    self.vocab_path = vocab_path
    self.num_oov_buckets = num_oov_buckets
    super(VocabLookup, self).__init__(**kwargs)

  def build(self, input_shape):

    vocab_initializer = tf.lookup.TextFileInitializer(
      self.vocab_path, tf.string, 0, tf.int64, 1, delimiter=",")
    self.table = tf.lookup.StaticVocabularyTable(vocab_initializer, self.num_oov_buckets)

    self.built = True

  def call(self, inputs):
    return self.table.lookup(inputs)

  def get_config(self):
    return {'vocab_path': self.vocab_path, 'num_oov_buckets': self.num_oov_buckets}

lookup_table = VocabLookup(vocab_path, 1)

categorical_indices = lookup_table(categorical_input)

По сути, не используйте слои. Лямбда, если вы ссылаетесь на какие-либо внешние переменные (включая модуль tf или tenorflow). Например, это не работает для меня:

def reduce_sum(x):
  return tf.reduce_sum(x, axis=1)

embedding_sum = layers.Lambda(reduce_sum)

categorical_features = embedding_sum(categorical_embeddings)

Но это работает:

class ReduceSum(layers.Layer):
  def call(self, inputs):
    return tf.reduce_sum(inputs, axis=1)

embedding_sum = ReduceSum()
categorical_features = embedding_sum(categorical_embeddings)

Кажется, что layers.Lambda не имеет значения вверх.

...