【问题标题】:Softmax activation gives worst performance with loss sparse_categorical_crossentropySoftmax 激活在损失 sparse_categorical_crossentropy 的情况下表现最差
【发布时间】:2020-12-22 00:42:25
【问题描述】:

我有一个简单的 Keras 顺序模型。 我有 N 个类别,我必须根据前一个点预测下一个点将属于哪个类别。

奇怪的是,当我从输出层移除 Softmax 激活函数时,性能会更好(更低的损失和最高的 sparse_categorical_accuracy)。 作为损失,我使用 logits=True 的 sparse_categorical_crossentropy。

有什么理由吗?不应该是相反的吗?

提前感谢您的任何建议!

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
  model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim,
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True, 
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size, activation='softmax')
    ])
  return model

model = build_model(
  vocab_size = vocab_size,
  embedding_dim=embedding_dim,
  rnn_units=rnn_units,
  batch_size=BATCH_SIZE)

def loss(labels, logits):
  return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)


model.compile(optimizer='adam', loss=loss, metrics=['sparse_categorical_accuracy'])

EPOCHS = 5
history = model.fit(train_set, epochs=EPOCHS, validation_data=val_set,)

【问题讨论】:

  • 如果您的网络输出概率,为什么是 from_logits=True? (softmax 激活的结果)

标签: tensorflow keras loss-function softmax


【解决方案1】:

简而言之,当您使用选项 from_logits = True 时,您是在告诉损失函数您的神经网络输出未标准化。由于您在最后一层使用 softmax 激活,因此您的输出确实是标准化的,因此您有两种选择:

  1. 删除 softmax 激活,您已经尝试过了。请记住,在此之后,您的输出概率将不会被标准化。
  2. 使用from_logits = False

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2018-02-01
    • 2020-09-14
    • 1970-01-01
    • 2010-12-01
    • 2018-09-21
    • 2021-03-23
    • 2018-06-27
    相关资源
    最近更新 更多