tf.keras.layers.IntegerLookup
Слой предобработки, который отображает целочисленные признаки в непрерывные диапазоны.
Наследуется от: PreprocessingLayer, Layer, Module
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,
**kwargs
)
Этот слой отображает набор произвольных целочисленных входных токенов в индексированные целочисленные выходные данные с помощью поиска словаря на основе таблицы. Индексы вывода слоя будут расположены непрерывно до максимального размера словаря, даже если входные токены не являются непрерывными или неограниченными. Слой поддерживает несколько вариантов кодирования вывода с помощью output_mode, и имеет необязательную поддержку токенов вне словаря (OOV) и маскирования.
Словарь для слоя должен быть либо предоставлен при создании, либо обучен с помощью adapt(). Во время adapt(), слой проанализирует набор данных, определит частоту отдельных целочисленных токенов и создаст словарь из них. Если размер словаря ограничен, наиболее частые токены будут использованы для создания словаря, а все остальные будут обрабатываться как OOV.
Существуют два возможных режима вывода для слоя. Когда output_mode равен "int", целочисленные входные данные преобразуются в их индекс в словаре (целое число). Когда output_mode равен "multi_hot", "tf_idf", целочисленные входные данные кодируются в массив, где каждая размерность соответствует элементу в словаре.
Словарь может необязательно содержать токен маски и токен OOV (который может необязательно занимать несколько индексов в словаре, как установлено num_oov_indices). Позиция этих токенов в словаре фиксирована. Когда output_mode равен "int", словарь начнётся с токена маски с индексом 0, за ним последуют индексы OOV, а затем остальная часть словаря. Когда output_mode равен "multi_hot", "tf_idf", словарь начнётся с индексов OOV, а экземпляры токена маски будут пропущены.
Обзор и полный список слоёв предобработки см. в руководстве по предобработке руководстве.
| Аргументы | |
|---|---|
max_tokens | Максимальный размер словаря для этого слоя. Это должно быть указано только при адаптации словаря или при установке pad_to_max_tokens=True. Если None, размер словаря не ограничен. Обратите внимание, что этот размер включает токены OOV и маски. По умолчанию None. |
num_oov_indices | Количество токенов вне словаря (OOV). Если это значение больше 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 или одномерный тензор или такого же размера, что и словарь, содержащий весовые коэффициенты обратного частотного распределения (inverse document frequency), которые будут умножаться на подсчеты терминов на образец для окончательного tf_idf весового коэффициента. Если аргумент vocabulary задан, а output_mode равно "tf_idf", этот аргумент должен быть передан. |
invert | Действительно только когда output_mode равно "int". Если True, этот слой будет отображать индексы на элементы словаря вместо отображения элементов словаря на индексы. По умолчанию False. |
output_mode | Настройка вывода слоя. По умолчанию "int". Значения могут быть "int", "one_hot", "multi_hot", "count", или "tf_idf" конфигурируют слой следующим образом:
|
pad_to_max_tokens | Применимо только когда output_mode равно "multi_hot", "count", или "tf_idf". Если True, ось признака вывода будет дополнена до max_tokens, даже если количество уникальных токенов в словаре меньше, чем max_tokens, что приведет к тензору формы [размер_пакета, max_ток] независимо от размера словаря. По умолчанию False. |
sparse | Булево. Применимо только когда output_mode равно "multi_hot", "count", или "tf_idf". Если True, возвращает SparseTensor вместо плотного Tensor. По умолчанию False. |
Примеры:
Создание слоя поиска с известным словарем
В этом примере создается слой поиска со существующим словарем.
vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
[4, 0, 2]])>
Создание слоя поиска с адаптированным словарем
В этом примере создается слой поиска и генерируется словарь путём анализа набора данных.
data = tf.constant([[12, 1138, 42], [42, 1000, 36]]) layer = tf.keras.layers.IntegerLookup() layer.adapt(data) layer.get_vocabulary() [-1, 42, 1138, 1000, 36, 12]
Обратите внимание, что токен OOV -1 был добавлен в словарь. Остальные токены упорядочены по частоте (42, имеющий 2 вхождения, первый) затем по обратной сортировке.
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup()
layer.adapt(data)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[5, 2, 1],
[1, 3, 4]])>
Поиск с несколькими индексами OOV
В этом примере показано, как использовать слой поиска с несколькими индексами OOV. Когда слой создается с более чем одним индексом OOV, любые токены OOV хэшируются в количество ведер OOV, распределяя токены OOV детерминированным образом по набору.
vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [37, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
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 = tf.constant([12, 36, 1138, 42, 7]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
vocabulary=vocab, output_mode='one_hot')
layer(data)
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
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
Настройте слой с output_mode='multi_hot'. Обратите внимание, что первые num_oov_indices измерения в кодировании multi-hot представляют токены OOV
vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
vocabulary=vocab, output_mode='multi_hot')
layer(data)
<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
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 = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
vocabulary=vocab, output_mode='count')
layer(data)
<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
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 являются весовыми коэффициентами обратного частотного распределения (inverse document frequency) на токен. Они должны быть предоставлены вместе со словарем. Обратите внимание, что весовые коэффициенты idf_weight для токенов OOV будут по умолчанию равны среднему значению всех переданных весовых коэффициентов idf.
vocab = [12, 36, 1138, 42]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
layer(data)
<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
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 = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
output_mode='tf_idf', vocabulary=vocab, idf_weights=idf_weights)
layer(data)
<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
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 = tf.constant([[1, 3, 4], [4, 0, 2]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, invert=True)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[ 12, 1138, 42],
[ 42, -1, 36]])>
Обратите внимание, что первый индекс соответствует токену OOV по умолчанию.
Обратные и прямые пары поиска
В этом примере показано, как использовать словарь стандартного слоя поиска для создания обратного слоя поиска.
vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
i_layer = tf.keras.layers.IntegerLookup(
vocabulary=layer.get_vocabulary(), invert=True)
int_data = layer(data)
i_layer(int_data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[ 12, 1138, 42],
[ 42, -1, 36]])>
В этом примере входной токен 1000 дал вывод -1, так как 1000 не было в словаре - он был представлен как OOV, и все токены OOV возвращаются как -1 в обратном слое. Также обратите внимание, что для работы обратного поиска вы должны были предварительно установить словарь прямого слоя, либо напрямую, либо с помощью adapt() перед вызовом get_vocabulary().
| Атрибуты | |
|---|---|
is_adapted | Был ли слой уже подгоняем к данным. |
Методы
adapt
adapt(
data, batch_size=None, steps=None
)
Вычисляет словарь целочисленных терминов из токенов в наборе данных.
Вызов adapt() на слое IntegerLookup — это альтернатива передаче предварительно вычисленного словаря при создании через аргумент vocabulary. Слой IntegerLookup всегда должен быть адаптирован к набору данных или снабжён словарем.
Во время adapt(), слой будет строить словарь всех целочисленных токенов, увиденных в наборе данных, отсортированных по частоте появления, причём ничьи будут решаться по порядку сортировки токенов (с высоких к низким). В конце adapt(), если max_tokens задан, словарь будет усечён до размера max_tokens. Например, адаптация слоя с max_tokens=1000 вычислит 1000 наиболее часто встречающихся токенов в наборе данных.
Для повышения эффективности StringLookup в любом контексте распределения словарь поддерживается статичным по отношению к любым скомпилированным tf.Graph, которые вызывают слой. Вследствие этого, если слой адаптируется во второй раз, любые модели, использующие этот слой, следует перекомпилировать. Более подробную информацию см. в tf.keras.layers.experimental.preprocessing.PreprocessingLayer.adapt.
adapt() предназначен только для использования на одной машине для вычисления состояния слоя. Чтобы проанализировать набор данных, который не помещается на одной машине, см. Tensorflow Transform для многомашинного решения map-reduce.
| Аргументы | |
|---|---|
data | Данные для обучения. Они могут быть переданы как tf.data.Dataset, или как массив NumPy. |
batch_size | Целое число или None. Количество образцов на обновление состояния. Если не указано, batch_size будет по умолчанию равно 32. Не указывайте batch_size если ваши данные представлены в виде наборов данных, генераторов или экземпляров keras.utils.Sequence (поскольку они генерируют пакеты). |
steps | Целое число или None. Общее число шагов (пакетов образцов). При обучении с тензорными входными данными, такими как тензоры TensorFlow, по умолчанию None равно количеству образцов в вашем наборе данных, делённому на размер пакета, или 1, если это невозможно определить. Если x — это набор данных tf.data, а 'steps' — None, эпоха будет выполняться до тех пор, пока набор данных не будет исчерпан. При передаче бесконечно повторяющегося набора данных, вы должны указать аргумент steps . Этот аргумент не поддерживается для входных массивов. |
compile
compile(
run_eagerly=None, steps_per_execution=None
)
Настраивает слой для adapt.
| Аргументы | |
|---|---|
run_eagerly | Булево значение. По умолчанию False. Если True, логика этого Model не будет заключена в tf.function. Рекомендуется оставить это как None , если ваш Model не может быть запущен внутри tf.function. steps_per_execution: Целое число. По умолчанию 1. Количество пакетов, которые будут запущены во время каждого вызова tf.function. Запуск нескольких пакетов внутри одного вызова tf.function может значительно улучшить производительность на TPUs или малых моделях с большой накладными расходами Python. |
get_vocabulary
get_vocabulary(
include_special_tokens=True
)
Возвращает текущий словарь слоя.
| Args | |
|---|---|
include_special_tokens | Если True, возвращаемый словарь будет включать маски и токены OOV, и индекс термина в словаре будет равен индексу термина при вызове слоя. Если False, возвращаемый словарь не будет включать маски или токены OOV. |
reset_state
reset_state()
Сбрасывает статистику слоя предобработки.
set_vocabulary
set_vocabulary(
vocabulary, idf_weights=None
)
Устанавливает данные словаря (и, необязательно, частоты документов) для этого слоя.
Этот метод напрямую устанавливает словарь и веса idf для этого слоя вместо анализа набора данных через adapt. Его следует использовать всякий раз, когда информация о словаре (и, необязательно, частоте документов) уже известна. Если данные словаря уже присутствуют в слое, этот метод заменит их.
| Args | |
|---|---|
vocabulary | Массив или строковый путь к текстовому файлу. Если передаётся массив, можно передать кортеж, список, одномерный массив NumPy или одномерный тензор, содержащий термины словаря. Если передаётся путь к файлу, файл должен содержать по одной строке на каждый термин в словаре. |
idf_weights | Кортеж, список, одномерный массив NumPy или одномерный тензор весов обратной частоты документов той же длины, что и словарь. Должен быть установлен, если output_mode равен "tf_idf". В противном случае не должен быть установлен. |
| Исключения | |
|---|---|
ValueError | Если слишком много входов, входы не совпадают или отсутствуют входные данные. |
RuntimeError | Если словарь не может быть установлен, когда эта функция вызывается. Это происходит, когда "multi_hot", "count", и "tf_idf" режимы, если pad_to_max_tokens равно False, а сам слой уже вызван. |
RuntimeError | Если тензорный словарь передаётся вне выполнения eager. |
update_state
update_state(
data
)
Накапливает статистику для слоя предобработки.
| Аргументы | |
|---|---|
data | Мини-пакет входных данных для слоя. |
vocab_size
vocab_size()
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/versions/r2.9/api_docs/python/tf/keras/layers/IntegerLookup