您可以定义一个简单的自定义Lambda 层并完全按照您的意愿行事。这是一个最初没有激活函数的示例。注意输出:
import tensorflow as tf
tf.random.set_seed(2)
def custom_layer(tensor):
activated_node = tf.nn.sigmoid(tensor[:, :1])
return tf.concat([activated_node, tensor[:, 1:]], axis=1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(6))
model(tf.random.uniform((2, 5)))
<tf.Tensor: shape=(2, 6), dtype=float32, numpy=
array([[-1.1554979 , 0.29463094, 0.57452184, 0.40530735, -0.15730543,
0.16329125],
[-1.1518296 , 1.2684885 , 0.50156784, 1.2273686 , 0.13656075,
-0.7025717 ]], dtype=float32)>
现在有了自定义Lambda 层,它将激活函数应用于张量中的第一个节点:
import tensorflow as tf
tf.random.set_seed(2)
def custom_layer(tensor):
activated_node = tf.nn.sigmoid(tensor[:, :1])
return tf.concat([activated_node, tensor[:, 1:]], axis=1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(6))
model.add(tf.keras.layers.Lambda(custom_layer, name="activation_layer"))
model(tf.random.uniform((2, 5)))
<tf.Tensor: shape=(2, 6), dtype=float32, numpy=
array([[ 0.23948632, 0.29463094, 0.57452184, 0.40530735, -0.15730543,
0.16329125],
[ 0.24015504, 1.2684885 , 0.50156784, 1.2273686 , 0.13656075,
-0.7025717 ]], dtype=float32)>
您可以清楚地看到每个样本的第一个元素(我使用的是 batch_size=2)是如何在 0 和 1 之间挤压的。