用于 TensorFlow 文本分类示例的激活层是什么
What is the activation layer used for TensorFlow text classification example
我正在尝试了解 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.Dropout(0.2),
layers.Dense(1)])
据我所知,深度学习模型使用激活函数,我想知道上述分类模型在内部使用什么激活函数。
谁能帮我理解一下?
此模型在输出端使用单个 activation function(S 形),用于 二元分类任务的预测。
要执行的任务通常会指导损失函数和激活函数的选择。因此,在这种情况下,Binary-Cross-Entropy loss function is used, as well as the sigmoid activation function (which is also called the logistic function, and outputs values between 0 and 1 for any real value taken as input). This is quite well explained in this post.
相比之下,您还可以在神经网络中使用多个激活函数,具体取决于其架构;例如在卷积神经网络中,每个卷积层都有一个激活函数是很常见的,如 this tutorial.
所示。
如你所见,模型定义是这样写的
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教程中使用的数据集是二元分类zero
和one
。通过没有对模型的最后一层定义任何激活,原作者想要得到logits
而不是概率。这就是为什么他们将 loss
函数用作
model.compile(loss=losses.BinaryCrossentropy(from_logits=True),
...
现在,如果我们将最后一层激活设置为 sigmoid
(通常用于二元分类),那么我们必须设置 from_logits=False
。因此,这里有两个选项可供选择:
logit: True
我们从最后一层取 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
的情况下,可能会出现数值不稳定的情况。查看 答案了解更多详情。
我正在尝试了解 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.Dropout(0.2),
layers.Dense(1)])
据我所知,深度学习模型使用激活函数,我想知道上述分类模型在内部使用什么激活函数。 谁能帮我理解一下?
此模型在输出端使用单个 activation function(S 形),用于 二元分类任务的预测。
要执行的任务通常会指导损失函数和激活函数的选择。因此,在这种情况下,Binary-Cross-Entropy loss function is used, as well as the sigmoid activation function (which is also called the logistic function, and outputs values between 0 and 1 for any real value taken as input). This is quite well explained in this post.
相比之下,您还可以在神经网络中使用多个激活函数,具体取决于其架构;例如在卷积神经网络中,每个卷积层都有一个激活函数是很常见的,如 this tutorial.
所示。如你所见,模型定义是这样写的
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教程中使用的数据集是二元分类zero
和one
。通过没有对模型的最后一层定义任何激活,原作者想要得到logits
而不是概率。这就是为什么他们将 loss
函数用作
model.compile(loss=losses.BinaryCrossentropy(from_logits=True),
...
现在,如果我们将最后一层激活设置为 sigmoid
(通常用于二元分类),那么我们必须设置 from_logits=False
。因此,这里有两个选项可供选择:
logit: True
我们从最后一层取 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
的情况下,可能会出现数值不稳定的情况。查看