tf.keras.layers.IntegerLookup
Слой предобработки, который отображает целые числа в (возможно, закодированные) индексы.
Наследуется от: Layer, Operation
tf.keras.layers.IntegerLookup(
max_tokens=None,
num_oov_indices=1,
mask_token=None,
oov_token=-1,
vocabulary=None,
vocabulary_dtype='int64',
idf_weights=None,
invert=False,
output_mode='int',
sparse=False,
pad_to_max_tokens=False,
name=None,
**kwargs
)
Используется в блокнотах
| Используется в руководстве | Используется в учебниках |
|---|---|
Этот слой отображает набор произвольных целочисленных входных токенов в целочисленные индексированные выходные данные через табличный поиск словаря. Индексы выходных данных слоя будут расположены непрерывно до максимального размера словаря, даже если входные токены не являются непрерывными или неограниченными. Слой поддерживает несколько вариантов кодирования выходных данных через output_mode и имеет необязательную поддержку токенов вне словаря (OOV) и маскирования.
Словарь для слоя должен быть либо предоставлен при создании, либо выучен через adapt(). Во время adapt() слой проанализирует набор данных, определит частоту отдельных целочисленных токенов и создаст словарь из них. Если размер словаря ограничен, для создания словаря будут использоваться наиболее частые токены, а все остальные будут считаться OOV.
Существует два возможных режима выходных данных для слоя. Когда output_mode равен "int", целочисленные входные данные преобразуются в их индекс в словаре (целое число). Когда output_mode равен "multi_hot", "count" или "tf_idf", целочисленные входные данные кодируются в массив, где каждый размер соответствует элементу в словаре.
Словарь может необязательно содержать токен маскирования, а также токен OOV (который может необязательно занимать несколько индексов в словаре, как задано num_oov_indices). Положение этих токенов в словаре фиксировано. Когда output_mode равно "int", словарь начнется с маркера маскирования в индексе 0, за которым последуют индексы OOV, а затем остальная часть словаря. Когда output_mode равно "multi_hot", "count" или "tf_idf", словарь начнется с индексов OOV, а экземпляры маркера маскирования будут пропущены.
Примечание: Этот слой использует TensorFlow внутри. Он не может быть использован в качестве части скомпилированной вычислительной графа модели с любым бэкэндом, кроме TensorFlow. Однако он может использоваться с любым бэкэндом при выполнении в режиме eagerly. Он также всегда может использоваться в качестве части потока предобработки входных данных с любым бэкэндом (вне самой модели), как мы рекомендуем использовать этот слой.
Примечание: Этот слой безопасно использовать внутри потока tf.data (независимо от используемого бэкэнда).
| Аргументы | |
|---|---|
max_tokens | Максимальный размер словаря для этого слоя. Это следует указывать только при адаптации словаря или при настройке pad_to_max_tokens=True. Если None, ограничений на размер словаря нет. Обратите внимание, что этот размер включает токены OOV и маски. По умолчанию None. |
num_oov_indices | Количество токенов вне словаря для использования. Если это значение больше 1, входные данные OOV модулируются для определения их значения OOV. Если это значение равно 0, входные данные OOV вызовут ошибку при вызове слоя. По умолчанию 1. |
mask_token | Целочисленный токен, представляющий входные данные маски. Когда output_mode равен "int", токен включается в словарь и отображается в индексе 0. В других режимах вывода токен не будет отображаться в словаре, и экземпляры маркера маскирования во входных данных будут пропущены. Если установлено None, токен маски не будет добавлен. По умолчанию None. |
oov_token | Используется только тогда, когда invert равно True. Токен для возврата для индексов OOV. По умолчанию -1. |
vocabulary | Необязательно. Либо массив целых чисел, либо строковый путь к текстовому файлу. Если передаётся массив, можно передать кортеж, список, одномерный массив NumPy или одномерный тензор, содержащий целочисленные термины словаря. Если передаётся путь к файлу, файл должен содержать по одной строке на термин в словаре. Если этот аргумент задан, нет необходимости в adapt() слоя. |
vocabulary_dtype | Тип данных терминов словаря, например "int64" или "int32". По умолчанию "int64". |
idf_weights | Действительно только когда output_mode равно "tf_idf". Кортеж, список, одномерный массив NumPy или одномерный тензор или того же размера, что и словарь, содержащий взвешенные значения обратной частоты документа, которые будут умножаться на подсчёт терминов каждого образца для конечного значения TF-IDF. Если аргумент vocabulary установлен, и output_mode равно "tf_idf", этот аргумент должен быть предоставлен. |
invert | Действительно только когда output_mode равно "int". Если True, этот слой будет отображать индексы на элементы словаря вместо отображения элементов словаря на индексы. По умолчанию False. |
output_mode | Спецификация для выходных данных слоя. Значения могут быть "int", "one_hot", "multi_hot", "count" или "tf_idf", настраивая слой следующим образом:
|
pad_to_max_tokens | Применимо только когда output_mode равно "multi_hot", "count" или "tf_idf". Если True, выходные данные будут иметь заполненную ось признаков до max_tokens, даже если количество уникальных токенов в словаре меньше max_tokens, что приводит к тензору формы (batch_size, max_tokens) независимо от размера словаря. По умолчанию False. |
sparse | Булево. Применимо только к "multi_hot", "count" и "tf_idf" режимам вывода. Поддерживается только с бэкэндом TensorFlow. Если True, возвращает SparseTensor вместо плотного Tensor. По умолчанию False. |
Примеры:
Создание слоя поиска с известным словарем
В этом примере создаётся слой поиска со существующим словарем.
vocab = [12, 36, 1138, 42]
data = np.array([[12, 1138, 42], [42, 1000, 36]]) # Note OOV tokens
layer = IntegerLookup(vocabulary=vocab)
layer(data)
array([[1, 3, 4],
[4, 0, 2]])Создание слоя поиска со словарем, адаптированным к данным
В этом примере создаётся слой поиска, и словарь генерируется путем анализа набора данных.
data = np.array([[12, 1138, 42], [42, 1000, 36]]) layer = IntegerLookup() layer.adapt(data) layer.get_vocabulary() [-1, 42, 1138, 1000, 36, 12]
Обратите внимание, что токен OOV -1 был добавлен в словарь. Остальные токены отсортированы по частоте (42, у которого 2 появления, стоит первым), а затем по обратному порядку сортировки.
data = np.array([[12, 1138, 42], [42, 1000, 36]])
layer = IntegerLookup()
layer.adapt(data)
layer(data)
array([[5, 2, 1],
[1, 3, 4]])Поиск с несколькими индексами OOV
В этом примере показано, как использовать слой поиска с несколькими индексами OOV. Когда слой создаётся с более чем одним индексом OOV, любые токены OOV хешируются в число ведёр OOV, распределяя токены OOV детерминированным образом по набору.
vocab = [12, 36, 1138, 42]
data = np.array([[12, 1138, 42], [37, 1000, 36]])
layer = IntegerLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
array([[2, 4, 5],
[1, 0, 3]])Обратите внимание, что выход для токена OOV 37 равен 1, а для токена OOV 1000 равен 0. Термины внутри словаря имеют индекс выхода, увеличенный на 1 по сравнению с предыдущими примерами (12 отображается в 2 и т. д.), чтобы освободить место для дополнительного токена OOV.
Вывод one-hot
Настройте слой с output_mode='one_hot'. Обратите внимание, что первые num_oov_indices измерения в кодировании one-hot представляют значения OOV.
vocab = [12, 36, 1138, 42]
data = np.array([12, 36, 1138, 42, 7]) # Note OOV tokens
layer = IntegerLookup(vocabulary=vocab, output_mode='one_hot')
layer(data)
array([[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.],
[1., 0., 0., 0., 0.]], dtype=float32)Вывод multi-hot
END_OF_DOCUMENT_MARKERНастройте слой с помощью output_mode='multi_hot'. Обратите внимание, что первые num_oov_indices измерения в кодировании multi_hot представляют токены OOV
vocab = [12, 36, 1138, 42]
data = np.array([[12, 1138, 42, 42],
[42, 7, 36, 7]]) # Note OOV tokens
layer = IntegerLookup(vocabulary=vocab, output_mode='multi_hot')
layer(data)
array([[0., 1., 0., 1., 1.],
[1., 0., 1., 0., 1.]], dtype=float32)Вывод количества токенов
Настройте слой с помощью output_mode='count'. Как и в случае с выводом multi_hot, первые num_oov_indices измерения в выводе представляют токены OOV.
vocab = [12, 36, 1138, 42]
data = np.array([[12, 1138, 42, 42],
[42, 7, 36, 7]]) # Note OOV tokens
layer = IntegerLookup(vocabulary=vocab, output_mode='count')
layer(data)
array([[0., 1., 0., 1., 2.],
[2., 0., 1., 0., 1.]], dtype=float32)Вывод TF-IDF
Настройте слой с помощью output_mode='tf_idf'. Как и в случае с выводом multi_hot, первые num_oov_indices измерения в выводе представляют токены OOV.
Каждый токен-бин будет выводить token_count * idf_weight, где значения idf — это обратные веса частоты документов на токен. Эти значения должны быть предоставлены вместе со словарем. Обратите внимание, что idf_weight для токенов OOV по умолчанию будет равно среднему значению всех весов idf, переданных в качестве входных данных.
vocab = [12, 36, 1138, 42]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = np.array([[12, 1138, 42, 42],
[42, 7, 36, 7]]) # Note OOV tokens
layer = IntegerLookup(
output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
layer(data)
array([[0. , 0.25, 0. , 0.6 , 0.8 ],
[1.0 , 0. , 0.75, 0. , 0.4 ]], dtype=float32)Чтобы указать значения idf для токенов OOV, вам необходимо передать весь словарь, включая ведущий токен OOV.
vocab = [-1, 12, 36, 1138, 42]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = np.array([[12, 1138, 42, 42],
[42, 7, 36, 7]]) # Note OOV tokens
layer = IntegerLookup(
output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
layer(data)
array([[0. , 0.25, 0. , 0.6 , 0.8 ],
[1.8 , 0. , 0.75, 0. , 0.4 ]], dtype=float32)При адаптации слоя в режиме "tf_idf" каждый образец входных данных будет рассматриваться как документ, и вес idf на токен будет рассчитываться как: log(1 + num_documents / (1 + token_document_count)).
Обратный поиск
Этот пример демонстрирует, как сопоставить индексы с токенами с помощью этого слоя. (Вы также можете использовать adapt() с inverse=True, но для простоты мы передадим словарь в этом примере.)
vocab = [12, 36, 1138, 42]
data = np.array([[1, 3, 4], [4, 0, 2]])
layer = IntegerLookup(vocabulary=vocab, invert=True)
layer(data)
array([[ 12, 1138, 42],
[ 42, -1, 36]])Обратите внимание, что по умолчанию первый индекс соответствует токену OOV.
Пары прямого и обратного поиска
Этот пример демонстрирует, как использовать словарь стандартного слоя поиска для создания слоя обратного поиска.
vocab = [12, 36, 1138, 42]
data = np.array([[12, 1138, 42], [42, 1000, 36]])
layer = IntegerLookup(vocabulary=vocab)
i_layer = IntegerLookup(
vocabulary=layer.get_vocabulary(), invert=True)
int_data = layer(data)
i_layer(int_data)
array([[ 12, 1138, 42],
[ 42, -1, 36]])В этом примере входной токен 1000 привел к выводу -1, поскольку 1000 не было в словаре — он был представлен как OOV, и все токены OOV возвращаются как -1 в обратном слое. Также обратите внимание, что для работы обратного поиска вам необходимо предварительно установить словарь для слоя прямого поиска, либо напрямую, либо через adapt(), перед вызовом get_vocabulary().
| Атрибуты | |
|---|---|
input | Извлекает тензор(ы) входных данных символической операции. Возвращает только тензор(ы), соответствующие первому вызову операции. |
output | Извлекает тензор(ы) выходных данных слоя. Возвращает только тензор(ы), соответствующие первому вызову операции. |
Краткое описание методов
adapt
adapt(
data, steps=None
)
Вычисляет словарь целочисленных терминов из токенов в наборе данных.
Вызов adapt() для слоя IntegerLookup является альтернативой передаче предварительно вычисленного словаря при создании с помощью аргумента vocabulary. Слой IntegerLookup всегда должен быть либо адаптирован к набору данных, либо снабжен словарем.
Во время adapt() слой построит словарь всех целочисленных токенов, увиденных в наборе данных, отсортированных по частоте, а при равенстве частот — по порядку токенов (от высоких к низким). По завершении adapt(), если max_tokens установлено, словарь будет усечен до размера max_tokens. Например, адаптация слоя с max_tokens=1000 вычислит 1000 наиболее часто встречающихся токенов в наборе входных данных. Если output_mode='tf-idf', adapt() также выучит частоты документов каждого токена в наборе входных данных.
| Аргументы | |
|---|---|
data | Данные для обучения. Могут быть переданы либо как пакетный tf.data.Dataset, либо как список целых чисел, либо как массив NumPy. |
steps | Целое число или None. Общее количество шагов (пакетов образцов) для обработки. Если data — tf.data.Dataset, а steps — None, adapt() будет выполняться до тех пор, пока входной набор данных не будет исчерпан. При передаче бесконечно повторяющегося набора данных необходимо указать аргумент steps. Этот аргумент не поддерживается для входных данных типа массив или список. |
finalize_state
finalize_state()
from_config
@classmethod
from_config(
config
)
Создает слой из его конфигурации.
Этот метод является обратным get_config, способным создать тот же слой из словаря конфигурации. Он не обрабатывает соединение слоев (обрабатывается сетью) и не обрабатывает веса (обрабатывается set_weights).
| Аргументы | |
|---|---|
config | Словарь Python, обычно вывод метода get_config. |
| Возвращает | |
|---|---|
| Экземпляр слоя. |
get_vocabulary
get_vocabulary(
include_special_tokens=True
)
Возвращает текущий словарь слоя.
| Аргументы | |
|---|---|
include_special_tokens | Если True, возвращаемый словарь будет включать маскирующие и OOV-токены, а индекс термина в словаре будет равен индексу термина при вызове слоя. Если False, возвращаемый словарь не будет включать маскирующие и OOV-токены. |
load_assets
load_assets(
dir_path
)
reset_state
reset_state()
save_assets
save_assets(
dir_path
)
set_vocabulary
set_vocabulary(
vocabulary, idf_weights=None
)
Устанавливает словарь (и, по желанию, частоты документов) для этого слоя.
Этот метод устанавливает словарь и веса idf для этого слоя напрямую, вместо анализа набора данных с помощью adapt. Он должен использоваться всякий раз, когда информация о словаре (и, по желанию, частотах документов) уже известна. Если данные словаря уже присутствуют в слое, этот метод заменит их.
| Аргументы | |
|---|---|
vocabulary | Массив или строковый путь к текстовому файлу. Если передаётся массив, можно передать кортеж, список, одномерный массив NumPy или одномерный тензор, содержащий термины словаря. Если передаётся путь к файлу, файл должен содержать по одному термину на строку в словаре. |
idf_weights | Кортеж, список, одномерный массив NumPy или одномерный тензор весов обратной частоты документов с длиной, равной длине словаря. Должен быть установлен, если output_mode — "tf_idf". Не должен быть установлен в противном случае. |
symbolic_call
symbolic_call(
*args, **kwargs
)
update_state
update_state(
data
)
vocabulary_size
vocabulary_size()
Получает текущий размер словаря слоя.
| Возвращает | |
|---|---|
| Целочисленный размер словаря, включая дополнительные индексы маски и OOV. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/layers/IntegerLookup