tf.keras.layers.experimental.preprocessing.StringLookup
Преобразует строки из словаря в целочисленные индексы.
Наследуется от: PreprocessingLayer, Layer, Module
tf.keras.layers.experimental.preprocessing.StringLookup(
max_tokens=None, num_oov_indices=1, mask_token='',
oov_token='[UNK]', vocabulary=None, encoding=None, invert=False,
**kwargs
)
Этот слой преобразует набор произвольных строк в целочисленный выходной результат с помощью табличного поиска, с необязательной обработкой вне словаря.
При необходимости пользователь может вызвать метод adapt() этого слоя на наборе данных, который проанализирует набор данных, определит частоту отдельных строковых значений и создаст словарь из них. Этот словарь может иметь неограниченный размер или быть ограниченным, в зависимости от параметров конфигурации этого слоя; если количество уникальных значений ввода больше максимального размера словаря, для создания словаря будут использоваться самые частые термины.
Примеры:
Создание слоя поиска со известным словарем
В этом примере создается слой поиска с предварительно существующим словарем.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = StringLookup(vocabulary=vocab)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[2, 4, 5],
[5, 1, 3]])>
Создание слоя поиска с адаптированным словарем
В этом примере создается слой поиска и генерируется словарь путём анализа набора данных.
data = tf.constant([["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 = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = StringLookup()
layer.adapt(data)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[6, 4, 2],
[2, 3, 5]])>
Поиск с несколькими токенами OOV.
В этом примере показано, как использовать слой поиска с несколькими токенами OOV. При создании слоя с более чем одним токеном OOV, любые значения OOV хешируются для определения значения OOV, распределяя значения OOV детерминированным образом по набору.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["m", "z", "b"]])
layer = StringLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[3, 5, 6],
[1, 2, 4]])>
Обратите внимание, что выходное значение для значения OOV 'm' равно 1, а выходное значение для значения OOV 'z' равно 2. Индекс выходных значений для терминов из словаря увеличен на 1 по сравнению с предыдущими примерами (a сопоставлен с 3 и т.д.), чтобы освободить место для дополнительных значений OOV.
Обратный поиск
В этом примере показано, как отобразить индексы в строки с помощью этого слоя. (Вы также можете использовать adapt() с inverse=True, но для простоты мы передадим словарь в этом примере.)
vocab = ["a", "b", "c", "d"]
data = tf.constant([[1, 3, 4], [4, 5, 2]])
layer = 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)>
Обратите внимание, что целое число 5, которое выходит за пределы пространства словаря, возвращает токен OOV.
Обратные и прямые пары поиска
В этом примере показано, как использовать словарь стандартного слоя поиска для создания обратного слоя поиска.
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "z", "b"]])
layer = StringLookup(vocabulary=vocab)
i_layer = StringLookup(vocabulary=layer.get_vocabulary(), 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 возвращаются как '[OOV]' в обратном слое. Также обратите внимание, что для работы обратного поиска вам необходимо предварительно установить словарь прямого слоя, либо напрямую, либо с помощью fit(), перед вызовом get_vocabulary().
| Атрибуты | |
|---|---|
max_tokens | Максимальный размер словаря для этого слоя. Если None, размер словаря не ограничен. Обратите внимание, что этот словарь включает токены OOV и маски, поэтому эффективное количество токенов равно (max_tokens - num_oov_indices - (1 if mask_token else 0)) |
num_oov_indices | Количество токенов вне словаря, которые нужно использовать; по умолчанию
|
mask_token | Токен, представляющий замаскированные значения, и который сопоставлен с индексом 0. По умолчанию пустая строка "". Если установлено в None, маркер маски не будет добавлен, и токены OOV, если таковые имеются, будут индексироваться с (0...num_oov_indices) вместо (1...num_oov_indices+1). |
oov_token | Токен, представляющий значение вне словаря. По умолчанию "[UNK]". |
vocabulary | Необязательный список терминов словаря или путь к текстовому файлу, содержащему словарь для загрузки в этот слой. Файл должен содержать по одному токену в строке. Если список или файл содержат один и тот же токен несколько раз, будет выброшено исключение. |
encoding | Кодировка Python-строки для использования. По умолчанию 'utf-8'. |
invert | Если True, этот слой будет сопоставлять индексы с элементами словаря вместо сопоставления элементов словаря с индексами. |
Методы
adapt
adapt(
data, reset_state=True
)
Подгоняет состояние слоя предобработки к набору данных.
Переопределяет метод adapt по умолчанию, чтобы применить соответствующую предобработку к входам перед передачей их в комбинировщик.
| Аргументы | |
|---|---|
data | Данные для обучения. Можно передать как объект tf.data Dataset, так и как массив numpy. |
reset_state | Необязательный аргумент, определяющий, следует ли очищать состояние слоя в начале вызова adapt. Это должно быть True для данного слоя, так как он не поддерживает повторные вызовы adapt. |
get_vocabulary
get_vocabulary()
set_vocabulary
set_vocabulary(
vocab
)
Устанавливает данные словаря для данного слоя с inverse=False.
Этот метод напрямую устанавливает словарь для данного слоя вместо анализа набора данных через 'adapt'. Он должен использоваться всякий раз, когда информация о словаре уже известна. Если данные словаря уже присутствуют в слое, этот метод либо заменит
| Аргументы | |
|---|---|
vocab | Массив строковых токенов. |
| Исключения | |
|---|---|
ValueError | Если входных данных слишком много, входные данные не соответствуют требованиям или данные ввода отсутствуют. |
vocab_size
vocab_size()
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/keras/layers/experimental/preprocessing/StringLookup