[英]Tensorflow / Keras sigmoid on single output of dense layer
我在 tensorflow 中有一个简单的 CNN 模型,它接收图像并预测 6 元素标签向量。 因此,我的模式的最后一层是 Dense(6)。 Label[0] 应该是二进制的,而 Label[1:6] 是连续值。 因此,我只想在输出的第一个节点上对输出层应用 sigmoid 激活,而其他 5 个输出保持原样。 我如何使用 tensorflow.keras 做到这一点? 为简单起见,我的模型构建代码目前类似于:
model = tf.keras.models.Sequential()
model.add(Reshape((image_size, image_size, 1), input_shape = (image_size, image_size))
model.add(Conv2D(8, **parameters))
model.add(BatchNormalization())
model.add(Activation('relu')
Model.add(MaxPool2D())
model.add(Flatten())
model.add(Dense(6))
我如何添加到最后一层的第一个索引上使用 sigmoid 激活?
假设我们将模型的输出作为 pred,那么 pred 将是一个形状为 (1, 6) 的张量,因此为了实现您的目标,您可以执行以下操作:
sigmoid_input = pred.numpy()[0][0]
sigmoid_output = tf.keras.activations.sigmoid(sigmoid_input)
因此,首先您需要将张量转换为 Numpy ndarray,然后仅访问张量的第一个元素。 之后,我们按计划将保存该值的新变量 sigmoid_input 传递给 sigmoid。
您可以定义一个简单的自定义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 之间挤压的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.