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


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


將其輸入投影到隨機特征空間的層。

繼承自:LayerModule

用法

tf.keras.layers.experimental.RandomFourierFeatures(
    output_dim, kernel_initializer='gaussian', scale=None,
    trainable=False, name=None, **kwargs
)

參數

  • output_dim 正整數,層輸出的維度,即用於逼近內核的隨機特征的數量。
  • kernel_initializer 確定隨機特征圖的參數分布(以及因此層近似的內核)。它可以是字符串標識符或 Keras Initializer 實例。目前僅支持 'gaussian' 和 'laplacian' 的字符串標識符(不區分大小寫)。請注意,內核矩陣不可訓練。
  • scale 對於高斯和拉普拉斯核,這對應於由層近似的相應核的比例因子(參見上麵的具體定義)。如果提供,它應該是一個正浮點數。如果為 None,則使用默認值:如果內核初始化程序設置為 "gaussian",scale默認為sqrt(input_dim / 2),否則默認為 1.0。核的逼近誤差和分類質量都對該參數敏感。如果trainable被設定為True,這個參數是在訓練過程中學習到的end-to-end,提供的值作為初始值。注意:當來自這一層的特征被饋送到線性模型時,通過使scale可訓練,由此產生的優化問題不再是凸的(即使線性模型使用的損失函數是凸的)。
  • trainable 層的縮放參數是否應該是可訓練的。默認為 False
  • name 字符串,用於該層的名稱。

該層實現了從輸入空間到具有output_dim 維度的空間的映射,這近似於shift-invariant 內核。內核函數 K(x, y) 是 shift-invariant 如果 K(x, y) == k(x - y) 對於某些函數 k 。許多流行的徑向基函數 (RBF),包括高斯和拉普拉斯核,都是shift-invariant。

該層的實現基於以下論文:Ali Rahimi 和 Ben Recht 的“Large-Scale Kernel Machines 的隨機特征”。

隨機特征圖(層)的參數從中采樣的分布決定了該層近似於哪個shift-invariant內核(有關更多詳細信息,請參見論文)。您可以使用您選擇的分布。該層支持以下兩個 RBF 內核的out-of-the-box 近似:

  • 高斯:K(x, y) == exp(- square(x - y) / (2 * square(scale)))
  • 拉普拉斯算子:K(x, y) = exp(-abs(x - y) / scale))

注意:與論文中說明的內容和Scikit-Learn 實現中使用的內容不同,該層的輸出不應用sqrt(2 / D) 歸一化因子。

用法:通常,此層用於"kernelize" 線性模型,方法是對輸入特征應用非線性變換(此層),然後在變換後的特征之上訓練線性模型。根據線性模型的損失函數,該層和線性模型的組合導致模型等效於(近似)內核 SVM(用於鉸鏈損失)、內核邏輯回歸(用於邏輯損失)、內核線性回歸(用於平方損失)等。

例子:

用於 MNIST 的具有高斯核的核多項式邏輯回歸模型:

model = keras.Sequential([
  keras.Input(shape=(784,)),
  RandomFourierFeatures(
      output_dim=4096,
      scale=10.,
      kernel_initializer='gaussian'),
  layers.Dense(units=10, activation='softmax'),
])
model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['categorical_accuracy']
)

MNIST 的quasi-SVM 分類器:

model = keras.Sequential([
  keras.Input(shape=(784,)),
  RandomFourierFeatures(
      output_dim=4096,
      scale=10.,
      kernel_initializer='gaussian'),
  layers.Dense(units=10),
])
model.compile(
    optimizer='adam',
    loss='hinge',
    metrics=['categorical_accuracy']
)

要使用另一個內核,隻需將層創建行替換為:

random_features_layer = RandomFourierFeatures(
    output_dim=500,
    kernel_initializer=<my_initializer>,
    scale=...,
    ...)

相關用法


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