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. Однако при выполнении в eager-режиме его можно использовать с любым бэкендом. Его также всегда можно использовать в конвейере предварительной обработки входных данных с любым бэкендом (вне самой модели); именно так мы рекомендуем использовать этот слой.
Примечание: Этот слой безопасно использовать внутри конвейера 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.
Однократное кодирование
Настройте слой с помощью output_mode='one_hot'. Обратите внимание, что первые num_oov_indices измерения в однократном кодировании представляют значения 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)Многократное кодирование
Настройте слой с помощью output_mode='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='multi_hot')
layer(data)
array([[0., 1., 0., 1., 1.],
[1., 0., 1., 0., 1.]], dtype=float32)Вывод количества токенов
Настройте слой с помощью output_mode='count'. Как и при многократном кодировании, первые 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'. Как и при многократном кодировании, первые 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 и позволяет создать такой же слой из словаря конфигурации. Он не обрабатывает связи между слоями (это делает Network) и веса (это делает 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