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


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

將任意表達式包裝為 Layer 對象。

繼承自:LayerModule

用法

tf.keras.layers.Lambda(
    function, output_shape=None, mask=None, arguments=None, **kwargs
)

參數

  • function 要評估的函數。將輸入張量作為第一個參數。
  • output_shape 函數的預期輸出形狀。如果未明確提供,則可以推斷此參數。可以是元組或函數。如果是元組,它隻指定第一個維度;假設樣本維度與輸入相同:output_shape = (input_shape[0], ) + output_shape,或者,輸入為 None,樣本維度也是 Noneoutput_shape = (None, ) + output_shape 如果是函數,則將整個形狀指定為輸入的函數形狀:output_shape = f(input_shape)
  • mask None(表示沒有掩碼)或具有與 compute_mask 層方法相同簽名的可調用對象,或者無論輸入是什麽都將作為輸出掩碼返回的張量。
  • arguments 要傳遞給函數的關鍵字參數的可選字典。

Lambda 層的存在使得在構造 Sequential 和函數 API 模型時可以將任意表達式用作 LayerLambda 層最適合簡單操作或快速實驗。對於更高級的用例,請按照本指南對 tf.keras.layers.Layer 進行子類化。

警告:tf.keras.layers.Lambda 層有(反)序列化限製!

繼承tf.keras.layers.Layer 而不是使用Lambda 層的主要原因是保存和檢查模型。 Lambda 層是通過序列化 Python 字節碼來保存的,這本質上是不可移植的。它們隻能在保存它們的相同環境中加載。通過覆蓋它們的get_config 方法,可以以更便攜的方式保存子類層。依賴於子類層的模型通常也更容易可視化和推理。

例子:

# add a x -> x^2 layer
model.add(Lambda(lambda x:x ** 2))
# add a layer that returns the concatenation
# of the positive part of the input and
# the opposite of the negative part

def antirectifier(x):
    x -= K.mean(x, axis=1, keepdims=True)
    x = K.l2_normalize(x, axis=1)
    pos = K.relu(x)
    neg = K.relu(-x)
    return K.concatenate([pos, neg], axis=1)

model.add(Lambda(antirectifier))

變量:

雖然可以將變量與 Lambda 層一起使用,但不鼓勵這種做法,因為它很容易導致錯誤。例如,考慮以下層:

scale = tf.Variable(1.)
  scale_layer = tf.keras.layers.Lambda(lambda x:x * scale)

因為scale_layer 不直接跟蹤scale 變量,所以它不會出現在scale_layer.trainable_weights 中,因此如果在模型中使用scale_layer 則不會被訓練。

更好的模式是編寫一個子類層:

class ScaleLayer(tf.keras.layers.Layer):
    def __init__(self):
      super(ScaleLayer, self).__init__()
      self.scale = tf.Variable(1.)

    def call(self, inputs):
      return inputs * self.scale

一般來說,Lambda 層可以方便地進行簡單的無狀態計算,但任何更複雜的都應該使用子類 Layer 來代替。

輸入形狀:任意。將此層用作模型中的第一層時,請使用關鍵字參數 input_shape(整數元組,不包括樣本軸)。輸出形狀:由output_shape 參數指定

相關用法


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