【问题标题】:What is the activation layer used for TensorFlow text classification exampleTensorFlow文本分类示例使用的激活层是什么
【发布时间】:2021-07-10 05:44:13
【问题描述】:

我试图理解https://www.tensorflow.org/tutorials/keras/text_classificationTensorFlow 文本分类示例。他们将模型定义如下:

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

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

【问题讨论】:

  • 我不相信简单模型使用非线性激活函数。

标签: tensorflow machine-learning keras deep-learning activation-function


【解决方案1】:

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

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

相比之下,您还可以在神经网络中拥有多个激活函数,具体取决于其架构;例如在卷积神经网络中,每个卷积层都有一个激活函数是很常见的,如this tutorial 所示。

【讨论】:

    【解决方案2】:

    如你所见,模型定义是这样写的

    model = tf.keras.Sequential([
      layers.Embedding(max_features + 1, embedding_dim),
      layers.Dropout(0.2),
      layers.GlobalAveragePooling1D(),
      layers.Dropout(0.2),
      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, embedding_dim),
      layers.Dropout(0.2),
      layers.GlobalAveragePooling1D(),
      layers.Dropout(0.2),
      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
    

    没有logit:假

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

    model = tf.keras.Sequential([
      layers.Embedding(max_features + 1, embedding_dim),
      layers.Dropout(0.2),
      layers.GlobalAveragePooling1D(),
      layers.Dropout(0.2),
      layers.Dense(1, activation='sigmoid')])
    
    model.compile(loss=losses.BinaryCrossentropy(from_logits=False),
                  optimizer='adam',
                  metrics=['accuracy'])
    
    history = model.fit(
        train_ds, verbose=2,
        validation_data=val_ds,
        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答案了解更多详情。

    【讨论】:

    • 我有兴趣通过评论教程的这一部分来增强您的答案:“因为这是一个二元分类问题并且模型输出概率(具有 sigmoid 激活的单单元层)” +在进行预测时使用 sigmoid 的事实。
    • 我明白了。我没有注意到他们在那里的陈述。感谢您指出。
    • 谢谢@M.Innat,这个答案是否适用于使用具有losses.SparseCategoricalCrossentropy损失函数的相同模型的多类分类器?
    • 是的,它适用于多类案件。请参阅this 示例。
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多