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