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
)
Используется в ноутбуках
| Используется в руководстве | Используется в учебниках |
|---|---|
Этот слой преобразует набор произвольных строк в целочисленные выходные данные с помощью табличного поиска словаря. Этот слой не будет производить разделение или преобразование входных строк. Для слоя, который может разделять и токенизировать естественный язык, см. слой 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, распределяя значения 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.
Выход one-hot
Настройте слой с помощью output_mode='one_hot'. Обратите внимание, что первые num_oov_indices измерения в кодировании one-hot представляют значения 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)Выход multi-hot
Настройте слой с помощью output_mode='multi_hot'. Обратите внимание, что первые num_oov_indices измерения в кодировании multi-hot представляют значения 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'. Как и в случае с выходом 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='count')
layer(data)
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 — это обратные веса частот документов на токен. Они должны быть предоставлены вместе со словарем. Обратите внимание, что 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, способным создать тот же слой из словаря конфигурации. Он не обрабатывает соединение слоёв (это обрабатывает сеть), а также веса (это обрабатывает 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