TensorFlow 文本分类示例使用的激活层是什么

问题描述

我正在尝试了解 https://www.tensorflow.org/tutorials/keras/text_classification 中的 TensorFlow 文本分类示例。他们定义模型如下:

model = tf.keras.Sequential([
  layers.Embedding(max_features + 1,embedding_dim),layers.Dropout(0.2),layers.GlobalAveragePooling1D(),layers.Dense(1)])

据我所知,深度学习模型使用激活函数,我想知道上述分类模型内部使用的是什么激活函数。 谁能帮我理解一下?

解决方法

当你读到时,模型定义是这样写的

model = tf.keras.Sequential([
  layers.Embedding(max_features + 1,embedding_dim),layers.Dropout(0.2),layers.GlobalAveragePooling1D(),layers.Dense(1)])

that 教程中使用的数据集是二元分类 zeroone。通过不对模型的最后一层定义任何激活,原作者想要获得logits而不是概率。这就是为什么他们使用 loss 函数作为

model.compile(loss=losses.BinaryCrossentropy(from_logits=True),... 

现在,如果我们将最后一层激活设置为 sigmoid(通常选择二元分类),那么我们必须设置 from_logits=False。因此,这里有两个选项可供选择:

logit:真

我们从最后一层取出 logit,这也是我们设置 from_logits=True 的原因。

model = tf.keras.Sequential([
  layers.Embedding(max_features + 1,layers.Dense(1,activation=None)])

model.compile(loss=losses.BinaryCrossentropy(from_logits=True),optimizer='adam',metrics=['accuracy'])

history = model.fit(
    train_ds,verbose=2,validation_data=val_ds,epochs=epochs)
7ms/step - loss: 0.6828 - accuracy: 0.5054 - val_loss: 0.6148 - val_accuracy: 0.5452
Epoch 2/3
7ms/step - loss: 0.5797 - accuracy: 0.6153 - val_loss: 0.4976 - val_accuracy: 0.7406
Epoch 3/3
7ms/step - loss: 0.4664 - accuracy: 0.7734 - val_loss: 0.4197 - val_accuracy: 0.8096

没有登录:错误

这里我们取最后一层的 probability,这也是我们设置 from_logits=False 的原因。

model = tf.keras.Sequential([
  layers.Embedding(max_features + 1,activation='sigmoid')])

model.compile(loss=losses.BinaryCrossentropy(from_logits=False),epochs=epochs)
Epoch 1/3
8ms/step - loss: 0.6818 - accuracy: 0.6163 - val_loss: 0.6135 - val_accuracy: 0.7736
Epoch 2/3
7ms/step - loss: 0.5787 - accuracy: 0.7871 - val_loss: 0.4973 - val_accuracy: 0.8226
Epoch 3/3
8ms/step - loss: 0.4650 - accuracy: 0.8365 - val_loss: 0.4195 - val_accuracy: 0.8472

现在,您可能想知道,为什么本教程使用 logit(或没有激活到最后一层)?简短的回答是,通常没有关系,我们可以选择任何选项。问题是,在使用 from_logits=False 的情况下存在数值不稳定的可能性。查看 this 答案了解更多详情。

,

此模型在输出端使用单个 activation function(一个 sigmoid),用于预测二元分类任务

要执行的任务通常会指导损失函数和激活函数的选择。因此,在这种情况下,将使用 Binary-Cross-Entropy 损失函数以及 sigmoid 激活函数(也称为逻辑函数,对于作为输入的任何实数值,输出 0 到 1 之间的值)。这在 this post 中有很好的解释。

相反,你也可以在一个神经网络中拥有多个激活函数,这取决于它的架构;例如,在卷积神经网络中,每个卷积层都有一个激活函数是很常见的,如 this tutorial 所示。