Обмен решением здесь, чтобы спасти кого-то еще от боли. Вот решение, которое я нашел работающим:
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
не имеет значения вверх.