Spec-Zone.ru › TensorFlow 2.9

tf.keras.layers.StringLookup

Слой предобработки, который сопоставляет строковые признаки целочисленным индексам.

Наследуется от: PreprocessingLayer, Layer, Module

Просмотр псевдонимов

Основные псевдонимы

tf.keras.layers.experimental.preprocessing.StringLookup

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", настраивая слой следующим образом:
  • "int": Возвращает исходные целочисленные индексы входных токенов.
  • "one_hot": Кодирует каждый отдельный элемент входных данных в массив такого же размера, как словарь, содержащий 1 в индексе элемента. Если последний размер равен 1, кодирует по этому размеру. Если последний размер не равен 1, добавляет новый размер для кодированного вывода.
  • "multi_hot": Кодирует каждый образец во входных данных в один массив такого же размера, как словарь, содержащий 1 для каждого термина словаря, присутствующего в образце. Обрабатывает последний размер как размер образца, если форма входных данных (..., length_sample), форма вывода будет (..., num_tokens).
  • "count": Как "multi_hot", но целочисленный массив содержит количество раз, которое токен в этом индексе появился в образце.
  • "tf_idf": Как "multi_hot", но применяется алгоритм TF-IDF для определения значения в каждом слоте токена. Для "int" вывода поддерживаются любые формы входных и выходных данных. Для всех других режимов вывода в настоящее время поддерживается вывод только до ранга 2.
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API