tf.keras.layers.StringLookup
Слой предобработки, который сопоставляет строковые признаки целочисленным индексам.
Наследуется от: PreprocessingLayer, Layer, Module
tf.keras.layers.StringLookup(
max_tokens=None,
num_oov_indices=1,
mask_token=None,
oov_token='[UNK]',
vocabulary=None,
idf_weights=None,
encoding=None,
invert=False,
output_mode='int',
sparse=False,
pad_to_max_tokens=False,
**kwargs
)
Этот слой преобразует набор произвольных строк в целочисленные значения через табличный поиск словаря. Этот слой не будет производить разбиение или преобразование входных строк. Для слоя, который может разбивать и токенизировать естественный язык, см. слой TextVectorization.
Словарь для слоя должен быть либо задан при создании, либо обучен с помощью adapt(). Во время adapt(), слой проанализирует набор данных, определит частоту отдельных токенов строк и создаст словарь из них. Если размер словаря ограничен, для создания словаря будут использоваться наиболее частые токены, а все остальные будут обрабатываться как слова вне словаря (OOV).
Существует два возможных режима вывода для слоя. Когда output_mode равен "int", входные строки преобразуются в их индекс в словаре (целое число). Когда output_mode равен "multi_hot", "count", или "tf_idf", входные строки кодируются в массив, где каждый размер соответствует элементу в словаре.
Словарь может необязательно содержать токен маски и токен OOV (который может занимать несколько индексов в словаре, как задано параметром num_oov_indices). Позиция этих токенов в словаре фиксирована. Когда output_mode равен "int", словарь будет начинаться с токена маски (если он задан), затем с индексов OOV и остальной частью словаря. Когда output_mode равен "multi_hot", "count", или "tf_idf", словарь будет начинаться с индексов OOV, а экземпляры токена маски будут удалены.
Обзор и полный список слоев предобработки см. в руководстве по предобработке руководстве.
| Args | |
|---|---|
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. По умолчанию "[UNK]". |
vocabulary | Необязательно. Массив строк или строковый путь к текстовому файлу. Если передается массив, можно передать кортеж, список, одномерный массив numpy или одномерный тензор, содержащий строковые термины словаря. Если передается путь к файлу, файл должен содержать по одной строке на термин в словаре. Если этот аргумент задан, нет необходимости adapt() слоя. |
idf_weights | Действительно только когда output_mode равно "tf_idf". Кортеж, список, одномерный массив numpy или одномерный тензор или того же размера, что и словарь, содержащий весовые коэффициенты обратной частоты документов, которые будут умножены на количество терминов для каждого образца для окончательного 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_tokens] независимо от размера словаря. По умолчанию False. |
sparse | Булево. Применимо только при output_mode равно "multi_hot", "count", или "tf_idf". Если True, возвращает SparseTensor вместо плотного Tensor. По умолчанию False. |
Примеры:
Создание слоя поиска со известным словарем
В этом примере создается слой поиска со предварительно существующим словарем.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
[4, 0, 2]])>
Создание слоя поиска с адаптированным словарем
В этом примере создается слой поиска и генерируется словарь, анализируя набор данных.
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]]) layer = tf.keras.layers.StringLookup() layer.adapt(data) layer.get_vocabulary() ['[UNK]', 'd', 'z', 'c', 'b', 'a']
Обратите внимание, что токен OOV "[UNK]" был добавлен в словарь. Остальные токены отсортированы по частоте ("d", который имеет 2 вхождения, стоит первым), затем по обратной сортировке.
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup()
layer.adapt(data)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[5, 3, 1],
[1, 2, 4]])>
Поиск с несколькими индексами OOV
Этот пример демонстрирует, как использовать слой поиска с несколькими индексами OOV. Когда слой создается с более чем одним индексом OOV, любые значения OOV хешируются в количество ведер OOV, распределяя значения OOV детерминированным образом по множеству.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["m", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[2, 4, 5],
[0, 1, 3]])>
Обратите внимание, что выходное значение для OOV значения 'm' равно 0, а для OOV значения 'z' равно 1. Внутри словаря значения имеют увеличенный индекс вывода на 1 по сравнению с предыдущими примерами (a отображается в 2 и т.д.), чтобы освободить место для дополнительного значения OOV.
Одноканальный вывод
Настройте слой с output_mode='one_hot'. Обратите внимание, что первые num_oov_indices размеры в кодировании one-hot представляют OOV значения.
vocab = ["a", "b", "c", "d"]
data = tf.constant(["a", "b", "c", "d", "z"])
layer = tf.keras.layers.StringLookup(
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)>
Многоканальный вывод
Настройте слой с output_mode='multi_hot'. Обратите внимание, что первые num_oov_indices размеры в многоканальном кодировании представляют OOV значения.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(
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'. Как и в случае с многоканальным выводом, первые num_oov_indices размеры вывода представляют значения OOV.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(
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". Как и в случае с многоканальным выводом, первые num_oov_indices размеры вывода представляют значения OOV.
Каждый бинарный токен выведет token_count * idf_weight, где весовые коэффициенты idf являются обратными весовыми коэффициентами частоты документов на токен. Они должны быть предоставлены вместе со словарем. Обратите внимание, что idf_weight для значений OOV будет по умолчанию равен среднему значению всех весовых коэффициентов idf, переданных в.
vocab = ["a", "b", "c", "d"]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(output_mode="tf_idf")
layer.set_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 = ["[UNK]", "a", "b", "c", "d"]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = tf.constant([["a", "c", "d", "d"], ["d", "z", "b", "z"]])
layer = tf.keras.layers.StringLookup(output_mode="tf_idf")
layer.set_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 = ["a", "b", "c", "d"]
data = tf.constant([[1, 3, 4], [4, 0, 2]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab, invert=True)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=string, numpy=
array([[b'a', b'c', b'd'],
[b'd', b'[UNK]', b'b']], dtype=object)>
Обратите внимание, что первый индекс соответствует токену OOV по умолчанию.
Обратные пары поиска и вывода
Этот пример демонстрирует, как использовать словарь стандартного слоя поиска для создания обратного слоя поиска.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab)
i_layer = tf.keras.layers.StringLookup(vocabulary=vocab, invert=True)
int_data = layer(data)
i_layer(int_data)
<tf.Tensor: shape=(2, 3), dtype=string, numpy=
array([[b'a', b'c', b'd'],
[b'd', b'[UNK]', b'b']], dtype=object)>
В этом примере входное значение "z" привело к выводу "[UNK]", поскольку 1000 не было в словаре - оно было представлено как OOV, а все значения OOV возвращаются как "[UNK]" в обратном слое. Также обратите внимание, что для работы обратного поиска вам необходимо предварительно установить словарь слоя прямой связи либо непосредственно, либо с помощью adapt() перед вызовом get_vocabulary().
| Атрибуты | |
|---|---|
is_adapted | Имел ли слой уже подгонку под данные. |
Методы
adapt
adapt(
data, batch_size=None, steps=None
)
Вычисляет словарь строковых терминов из токенов в наборе данных.
Вызов adapt() на слое StringLookup — это альтернатива передаче предопределённого словаря при создании через аргумент vocabulary. Слой StringLookup всегда должен быть адаптирован к набору данных или снабжён словарем.
Во время adapt(), слой создаст словарь всех строковых токенов, увиденных в наборе данных, отсортированных по количеству вхождений, при этом ничьи будут разрываться по порядку сортировки токенов (с высокой к низкой). По окончании adapt(), если max_tokens установлено, словарь будет усечён до размера max_tokens. Например, адаптация слоя с max_tokens=1000 вычислит 1000 наиболее часто встречающихся токенов в наборе входных данных. Если output_mode='tf-idf', adapt() также выучит частоты документов каждого токена в наборе входных данных.
Для повышения эффективности 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
)
Возвращает текущий словарь слоя.
| Аргументы | |
|---|---|
include_special_tokens | Если True, возвращаемый словарь будет включать токены маски и OOV, а индекс термина в словаре будет равен индексу термина при вызове слоя. Если False, возвращаемый словарь не будет включать токены маски или OOV. |
reset_state
reset_state()
Сбрасывает статистику слоя предобработки.
set_vocabulary
set_vocabulary(
vocabulary, idf_weights=None
)
Устанавливает данные словаря (и необязательно частоты документов) для данного слоя.
Этот метод устанавливает словарь и веса idf для данного слоя напрямую, вместо анализа набора данных через adapt. Он должен использоваться всякий раз, когда информация о словаре (и необязательно о частотах документов) уже известна. Если данные словаря уже присутствуют в слое, этот метод заменит их.
| Аргументы | |
|---|---|
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/StringLookup