Keras中sigmoid激活函数的使用

Ahm*_*azi 1 python neural-network keras tensorflow sigmoid

我有一个由 18260 个输入字段和 4 个输出组成的大数据集。我正在使用 Keras 和 Tensorflow 构建一个可以检测可能输出的神经网络。

但是,我尝试了很多解决方案,但除非我sigmoid在除第一个模型层之外的所有模型层中都使用激活函数,否则准确率不会超过 55% ,如下所示:

def baseline_model(optimizer= 'adam' , init= 'random_uniform'):
# create model
model = Sequential()
model.add(Dense(40, input_dim=18260, activation="relu", kernel_initializer=init))
model.add(Dense(40, activation="sigmoid", kernel_initializer=init))
model.add(Dense(40, activation="sigmoid", kernel_initializer=init))
model.add(Dense(10, activation="sigmoid", kernel_initializer=init))
model.add(Dense(4, activation="sigmoid", kernel_initializer=init))
model.summary()
# Compile model
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model
Run Code Online (Sandbox Code Playgroud)

使用sigmoid激活在所有层是否正确?使用 sigmoid 时准确率达到 99.9%,如上所示。所以我想知道模型实现是否有问题。

Mit*_*iku 5

sigmoid 可能会起作用。但我建议使用 relu 激活来激活隐藏层。问题是,您的输出层的激活是 sigmoid 但它应该是 softmax(因为您使用的是 sparse_categorical_crossentropy 损失)。

model.add(Dense(4, activation="softmax", kernel_initializer=init))
Run Code Online (Sandbox Code Playgroud)

评论讨论后编辑

您的输出是类标签的整数。Sigmoid 逻辑函数输出范围 (0,1) 内的值。softmax 的输出也在 (0,1) 范围内,但 Softmax 函数对输出添加了另一个约束:- 输出的总和必须为 1。因此,softmax 的输出可以解释为输入的概率每个班级。

例如

model.add(Dense(4, activation="softmax", kernel_initializer=init))
Run Code Online (Sandbox Code Playgroud)

  • Relu 通常比带有隐藏层的 sigmoid 工作得更好,因为当激活函数的输入非常高或非常低(大的负数)时,sigmoid 函数的导数变得接近于零。这阻碍了模型的学习。但是如果在你的情况下 sigmoid 工作得更好,那就没问题了。 (2认同)