tf.keras.layers.Lambda()——匿名函數層解析

1. 參數列表

在這裏插入圖片描述

2. 作用

在這裏插入圖片描述

  • 可以把任意的一個表達式作爲一個“Layer”對象
  • Lambda層之所以存在是因爲它可以在構建Squential時使用任意的函數或者說tensorflow 函數。
  • 在我們需要完成一些簡單的操作(例如VAE中的重採樣)的情況下,Lambda層再適合不過了。

3. 舉個栗子(VAE)

  • 可以看到通過在encoder和decoder中間加入一個Lambda層使得encoder和decoder連接起來,很方便
def sampling(agrs):
    mean,logvar = agrs[0],agrs[1]
    eps = tf.random.normal(tf.shape(mean))
    
    return mean + eps*tf.exp(logvar * 0.5)


# 編碼階段
    
x = layers.Input(shape=(784,))  # 輸入層
    
h1 = layers.Dense(200,activation='softplus')(x)
h2 = layers.Dense(200,activation='softplus')(h1)
# 均值和方差層不需要激活函數
mean = layers.Dense(latent_dimension)(h2)
log_var = layers.Dense(latent_dimension)(h2)
    
# 將採樣過程看成一個Lambda層,這裏利用自定義的sampling函數
z = layers.Lambda(sampling,output_shape=(latent_dimension,))([mean,log_var])
    
# 解碼階段
h3 = layers.Dense(200,activation='softplus')
h4 = layers.Dense(200,activation='softplus')
h5 = layers.Dense(200,activation='softplus')
# No activation
end = layers.Dense(784)
z1 = h3(z)
z2 = h4(z1)
z3 = h5(z2)
out = end(z3)
    
# 建立模型
model = tf.keras.Model(x,out)

4. Lambda層的缺點

  • Lambda層雖然很好用,但是它不能去更新我們模型的配置信息,就是不能重寫’model.get_config()'方法
  • 所以tensorflow提議,儘量使用自定義層(即tf.keras.layers的子類)
  • 關於自定義層,我的博客有一期會專門講

總結

當網絡需要完成一些簡單的操作時,可以考慮使用Lambda層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章