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


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


將整數特征映射到連續範圍的預處理層。

繼承自:PreprocessingLayerLayerModule

用法

tf.keras.layers.IntegerLookup(
    max_tokens=None, num_oov_indices=1, mask_token=None, oov_token=-1,
    vocabulary=None, vocabulary_dtype='int64', idf_weights=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,則不會添加任何掩碼項。默認為無。
  • oov_token 僅在 invert 為 True 時使用。返回 OOV 索引的令牌。默認為 -1。
  • vocabulary 可選的。整數數組或文本文件的字符串路徑。如果傳遞一個數組,可以傳遞一個元組、列表、一維 numpy 數組或包含整數詞匯項的一維張量。如果傳遞文件路徑,則該文件應包含詞匯表中的每個術語一行。如果設置了此參數,則無需adapt() 圖層。
  • vocabulary_dtype 詞匯術語的 dtype,例如 "int64""int32" 。默認為 "int64"
  • 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 圖層是否已經適合數據。

該層通過基於表的詞匯表查找將一組任意整數輸入標記映射到索引整數輸出。該層的輸出索引將連續排列,直到最大詞匯大小,即使輸入標記是非連續的或無界的。該層支持通過 output_mode 對輸出進行編碼的多種選項,並可選擇支持詞匯表外 (OOV) 標記和掩碼。

該層的詞匯表必須在構造時提供或通過 adapt() 學習。在 adapt() 期間,該層將分析數據集,確定單個整數標記的頻率,並從中創建一個詞匯表。如果詞匯表的大小有上限,則最常用的標記將用於創建詞匯表,而所有其他標記將被視為 OOV。

該層有兩種可能的輸出模式。當 output_mode"int" 時,輸入整數將轉換為它們在詞匯表中的索引(整數)。當 output_mode"multi_hot" , "count""tf_idf" 時,輸入整數被編碼到一個數組中,其中每個維度對應於詞匯表中的一個元素。

詞匯表可以選擇性地包含掩碼標記和 OOV 標記(可以選擇性地占據詞匯表中的多個索引,由 num_oov_indices 設置)。這些標記在詞匯表中的位置是固定的。當 output_mode"int" 時,詞匯表將從索引 0 處的掩碼標記開始,然後是 OOV 索引,然後是詞匯表的其餘部分。當 output_mode"multi_hot" , "count""tf_idf" 時,詞匯表將以 OOV 索引開頭,並且將刪除掩碼標記的實例。

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

例子:

使用已知詞匯創建查找層

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

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])  # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
       [4, 0, 2]])>

使用經過調整的詞匯表創建查找層

此示例創建一個查找層並通過分析數據集生成詞匯表。

data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup()
layer.adapt(data)
layer.get_vocabulary()
[-1, 42, 1138, 1000, 36, 12]

請注意,OOV 標記 -1 已添加到詞匯表中。剩餘的標記按頻率排序(42,有 2 次出現,是第一個),然後按逆排序順序。

data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup()
layer.adapt(data)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[5, 2, 1],
       [1, 3, 4]])>

具有多個 OOV 索引的查找

此示例演示如何使用具有多個 OOV 索引的查找層。當使用多個 OOV 索引創建層時,任何 OOV 令牌都會散列到 OOV 存儲桶的數量中,從而以確定性的方式在集合中分配 OOV 令牌。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [37, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, num_oov_indices=2)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[2, 4, 5],
       [1, 0, 3]])>

請注意,OOV 標記 37 的輸出為 1,而 OOV 標記 1000 的輸出為 0。in-vocab 術語的輸出索引從前麵的示例中增加了 1(12 映射到 2 等),以便為額外的OOV令牌。

One-hot 輸出

使用 output_mode='one_hot' 配置層。請注意,ont_hot 編碼中的第一個 num_oov_indices 維度表示 OOV 值。

vocab = [12, 36, 1138, 42]
data = tf.constant([12, 36, 1138, 42, 7]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    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 = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    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 = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    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 = [12, 36, 1138, 42]
idf_weights = [0.25, 0.75, 0.6, 0.4]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    output_mode='tf_idf', 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 = [-1, 12, 36, 1138, 42]
idf_weights = [0.9, 0.25, 0.75, 0.6, 0.4]
data = tf.constant([[12, 1138, 42, 42], [42, 7, 36, 7]]) # Note OOV tokens
layer = tf.keras.layers.IntegerLookup(
    output_mode='tf_idf', 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 = [12, 36, 1138, 42]
data = tf.constant([[1, 3, 4], [4, 0, 2]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab, invert=True)
layer(data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[  12, 1138,   42],
       [  42,   -1,   36]])>

請注意,默認情況下,第一個索引對應於 oov 令牌。

正向和反向查找對

此示例演示如何使用標準查找層的詞匯表來創建反向查找層。

vocab = [12, 36, 1138, 42]
data = tf.constant([[12, 1138, 42], [42, 1000, 36]])
layer = tf.keras.layers.IntegerLookup(vocabulary=vocab)
i_layer = tf.keras.layers.IntegerLookup(
    vocabulary=layer.get_vocabulary(), invert=True)
int_data = layer(data)
i_layer(int_data)
<tf.Tensor:shape=(2, 3), dtype=int64, numpy=
array([[  12, 1138,   42],
       [  42,   -1,   36]])>

在此示例中,輸入標記 1000 導致輸出 -1,因為 1000 不在詞匯表中 - 它被表示為 OOV,並且所有 OOV 標記在逆層中返回為 -1。另外,請注意,要使逆向工作,您必須在調用 get_vocabulary() 之前直接或通過 adapt() 設置前向層詞匯表。

相關用法


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