Spec-Zone.ru › TensorFlow

tf.keras.layers.StringLookup

Слой предварительной обработки, преобразующий строки в (возможно, закодированные) индексы.

Наследует: Layer, Operation

tf.keras.layers.StringLookup(
    max_tokens=None,
    num_oov_indices=1,
    mask_token=None,
    oov_token='[UNK]',
    vocabulary=None,
    idf_weights=None,
    invert=False,
    output_mode='int',
    pad_to_max_tokens=False,
    sparse=False,
    encoding='utf-8',
    name=None,
    **kwargs
)

Используется в блокнотах

Используется в руководстве Используется в учебных материалах
  • Перенос `tf.feature_column` в слои предварительной обработки Keras
  • Работа со слоями предварительной обработки
  • Обучение с сервером параметров с помощью ParameterServerStrategy
  • Загрузка DataFrame pandas
  • Распределенный ввод данных
  • Загрузка данных CSV
  • Классификация структурированных данных с помощью слоев предварительной обработки Keras

Этот слой преобразует произвольный набор строк в целочисленные выходные значения с помощью табличного поиска по словарю. Слой не выполняет разбиение или преобразование входных строк. Слой, который может разбивать и токенизировать естественный язык, см. в разделе keras.layers.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, а экземпляры токена маскирования удаляются.

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

Примеры:

Создание слоя поиска по известному словарю

В этом примере создается слой поиска с уже существующим словарем.

vocab = ["a", "b", "c", "d"]
data = [["a", "c", "d"], ["d", "z", "b"]]
layer = StringLookup(vocabulary=vocab)
layer(data)
array([[1, 3, 4],
       [4, 0, 2]])

Создание слоя поиска с адаптированным словарем

В этом примере создается слой поиска, а словарь формируется путем анализа набора данных.

data = [["a", "c", "d"], ["d", "z", "b"]]
layer = StringLookup()
layer.adapt(data)
layer.get_vocabulary()
['[UNK]', 'd', 'z', 'c', 'b', 'a']

Обратите внимание, что в словарь добавлен токен OOV "[UNK]". Остальные токены отсортированы по частоте (на первом месте "d", встречающийся 2 раза), а при равной частоте — в обратном алфавитном порядке.

data = [["a", "c", "d"], ["d", "z", "b"]]
layer = StringLookup()
layer.adapt(data)
layer(data)
array([[5, 3, 1],
       [1, 2, 4]])

Поиск с несколькими индексами OOV

В этом примере показано, как использовать слой поиска с несколькими индексами OOV. Если слой создан более чем с одним индексом OOV, все значения OOV хешируются в соответствии с количеством корзин OOV, детерминированно распределяясь по этому набору.

vocab = ["a", "b", "c", "d"]
data = [["a", "c", "d"], ["m", "z", "b"]]
layer = StringLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
array([[2, 4, 5],
       [0, 1, 3]])

Обратите внимание, что выходное значение для OOV-значения 'm' равно 0, а для OOV-значения "z" — 1. Выходные индексы терминов из словаря увеличены на 1 по сравнению с предыдущими примерами (a отображается в 2 и т. д.), чтобы освободить место для дополнительного значения OOV.

Унитарный вывод

Настройте слой с помощью output_mode='one_hot'. Обратите внимание, что первые num_oov_indices измерения унитарного кодирования соответствуют значениям OOV.

vocab = ["a", "b", "c", "d"]
data = ["a", "b", "c", "d", "z"]
layer = StringLookup(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 = ["a", "b", "c", "d"]
data = [["a", "c", "d", "d"], ["d", "z", "b", "z"]]
layer = StringLookup(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 = ["a", "b", "c", "d"]
data = [["a", "c", "d", "d"], ["d", "z", "b", "z"]]
layer = StringLookup(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 = ["a", "b", "c", "d"]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = [["a", "c", "d", "d"], ["d", "z", "b", "z"]]
layer = StringLookup(output_mode="tf_idf")
layer.set_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 = ["[UNK]", "a", "b", "c", "d"]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = [["a", "c", "d", "d"], ["d", "z", "b", "z"]]
layer = StringLookup(output_mode="tf_idf")
layer.set_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 = ["a", "b", "c", "d"]
data = [[1, 3, 4], [4, 0, 2]]
layer = StringLookup(vocabulary=vocab, invert=True)
layer(data)
array([[b'a', b'c', b'd'],
       [b'd', b'[UNK]', b'b']], dtype=object)

Обратите внимание, что по умолчанию первому индексу соответствует токен OOV.

Пары прямого и обратного поиска

В этом примере показано, как использовать словарь стандартного слоя поиска для создания слоя обратного поиска.

vocab = ["a", "b", "c", "d"]
data = [["a", "c", "d"], ["d", "z", "b"]]
layer = StringLookup(vocabulary=vocab)
i_layer = StringLookup(vocabulary=vocab, invert=True)
int_data = layer(data)
i_layer(int_data)
array([[b'a', b'c', b'd'],
       [b'd', b'[UNK]', b'b']], dtype=object)

В этом примере входное значение "z" привело к выходному значению "[UNK]", поскольку 1000 отсутствовало в словаре: оно было представлено как OOV, а все значения OOV в обратном слое возвращаются как "[UNK]". Также обратите внимание: чтобы обратное преобразование работало, необходимо сначала задать словарь прямого слоя напрямую или с помощью adapt(), прежде чем вызывать get_vocabulary().

Атрибуты
input Получает входной тензор (или тензоры) символьной операции.

Возвращает только тензор (или тензоры), соответствующий первому вызову операции.

output Получает выходной тензор (или тензоры) слоя.

Возвращает только тензор (или тензоры), соответствующий первому вызову операции.

Методы

adapt

Посмотреть исходный код

adapt(
    data, steps=None
)

Вычисляет словарь целочисленных терминов на основе токенов из набора данных.

Вызов adapt() для слоя StringLookup — это альтернатива передаче готового словаря при создании с помощью аргумента vocabulary. Для слоя StringLookup всегда необходимо либо выполнить адаптацию по набору данных, либо задать словарь.

Во время 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/StringLookup

Spec-Zone.ru

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