當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.keras.layers.StringLookup用法及代碼示例


將字符串特征映射到整數索引的預處理層。

繼承自:PreprocessingLayerLayerModule

用法

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
)

參數

  • max_tokens 該層的最大詞匯量。這僅應在調整詞匯表或設置 pad_to_max_tokens=True 時指定。如果沒有,詞匯量沒有上限。請注意,此大小包括 OOV 和掩碼標記。默認為無。
  • 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() 圖層。
  • idf_weights 僅當 output_mode"tf_idf" 時有效。元組、列表、一維 numpy 數組或一維張量或與詞匯表長度相同,包含浮點逆文檔頻率權重,該權重將乘以每個樣本術語計數,以獲得最終的 tf_idf 權重。如果設置了 vocabulary 參數,並且 output_mode"tf_idf" ,則必須提供此參數。
  • invert 僅當 output_mode"int" 時有效。如果為 True,則該層將索引映射到詞匯項,而不是將詞匯項映射到索引。默認為假。
  • output_mode 層輸出的規範。默認為"int".值可以是"int","one_hot","multi_hot","count", 或者"tf_idf"配置層如下:
    • "int" :返回輸入標記的原始整數索引。
    • "one_hot" :將輸入中的每個單獨元素編碼為與詞匯表大小相同的數組,在元素索引處包含 1。如果最後一個維度是大小 1,將在該維度上進行編碼。如果最後一個維度不是大小 1,將為編碼輸出附加一個新維度。
    • "multi_hot" :將輸入中的每個樣本編碼為與詞匯表大小相同的單個數組,其中樣本中存在的每個詞匯表項都包含一個 1。將最後一個維度視為樣本維度,如果輸入形狀為 (..., sample_length),則輸出形狀將為 (..., num_tokens)。
    • "count" :與 "multi_hot" 一樣,但 int 數組包含該索引處的標記出現在樣本中的次數的計數。
    • "tf_idf" :與 "multi_hot" 一樣,但應用 TF-IDF 算法來查找每個令牌槽中的值。對於"int" 輸出,支持任何形狀的輸入和輸出。對於所有其他輸出模式,目前僅支持輸出到 rank 2。
  • pad_to_max_tokens 僅當 output_mode"multi_hot" , "count""tf_idf" 時適用。如果為 True,即使詞匯表中唯一標記的數量少於 max_tokens,輸出的特征軸也會填充到 max_tokens,從而導致形狀為 [batch_size, max_tokens] 的張量,而與詞匯表無關尺寸。默認為假。
  • sparse 布爾值。僅當 output_mode"multi_hot" , "count""tf_idf" 時適用。如果為 True,則返回 SparseTensor 而不是密集的 Tensor 。默認為假。

屬性

  • is_adapted 圖層是否已經適合數據。

該層通過基於表的詞匯查找將一組任意字符串轉換為整數輸出。該層不會對輸入字符串進行拆分或轉換。對於不能分割和標記自然語言的層,請參閱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 索引開頭,並且將刪除掩碼標記的實例。

有關預處理層的概述和完整列表,請參閱預處理指南。

例子:

使用已知詞匯創建查找層

此示例使用預先存在的詞匯表創建查找層。

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。in-vocab 項的輸出索引從前麵的示例(a 映射到 2 等)按順序增加了 1為額外的 OOV 值騰出空間。

One-hot 輸出

使用 output_mode='one_hot' 配置層。請注意,ont_hot 編碼中的第一個 num_oov_indices 維度表示 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)>

Multi-hot 輸出

使用 output_mode='multi_hot' 配置層。請注意,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' 配置層。與 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='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" 配置層。與 multi_hot 輸出一樣,輸出中的第一個 num_oov_indices 維度表示 OOV 值。

每個令牌箱將輸出 token_count * idf_weight ,其中 idf 權重是每個令牌的逆文檔頻率權重。這些應與詞匯一起提供。請注意,OOV 值的 idf_weight 將默認為傳入的所有 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)>

要為 oov 值指定 idf 權重,您需要傳遞整個詞匯表,包括前導 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]"。另外,請注意,為了使逆向工作,您必須在調用 get_vocabulary() 之前直接或通過 adapt() 設置前向層詞匯表。

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.layers.StringLookup。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。