Keras 在这种情况下,为什么sigmoid函数的性能优于tanh和softmax?

Keras 在这种情况下,为什么sigmoid函数的性能优于tanh和softmax?,keras,neural-network,Keras,Neural Network,对于以下神经网络,sigmoid函数比tanh或softmax提供更好的结果 如果我将激活函数从sigmoid更改为tanh或softmax,则误差会增加,精确度会降低。虽然我已经知道tanh和softmax比sigmoid更好。有人能帮我理解吗 我使用的数据集是iris和Pima印度糖尿病数据库。我使用了TensorFlow 1.5和Keras 2.2.4 from keras.models import Sequential from keras.layers import Dense fr

对于以下神经网络,sigmoid函数比tanh或softmax提供更好的结果

如果我将激活函数从sigmoid更改为tanh或softmax,则误差会增加,精确度会降低。虽然我已经知道tanh和softmax比sigmoid更好。有人能帮我理解吗

我使用的数据集是iris和Pima印度糖尿病数据库。我使用了TensorFlow 1.5和Keras 2.2.4

from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy as np

dataset = np.genfromtxt('diabetes.csv', dtype=float, delimiter=',')
X = dataset[1:, 0:8]
Y = dataset[1:, 8]

xtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size=0.2, random_state=42)

model = Sequential()
model.add(Dense(10, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(xtrain, ytrain, epochs=50, batch_size=20)
print(model.metrics_names)
print(model.evaluate(xtest, ytest))

Softmax激活功能通常用作分类激活。这是因为softmax在范围(0,1)之间挤压输出,因此输出的和始终为1。如果您的输出层只有一个单元/神经元,它将始终有一个常量1作为输出

Tanh或双曲正切是一个逻辑函数,将输出映射到(-1,1)的范围。Tanh可用于两类之间的二元分类。使用tanh时,请记住相应地用[-1,1]标记数据

乙状结肠功能是另一种类似tanh的逻辑功能。如果sigmoid函数输入限制为实值和正值,则输出将在(0,1)范围内。这使得sigmoid成为预测某事物概率的强大功能


因此,总而言之,输出激活功能通常不是模型性能的选择,而是取决于您正在使用的任务和网络体系结构

值范围在-1和1之间,但就Tanh而言,这不一定是个问题。通过学习合适的权重,Tanh可以使用偏差拟合到值范围[0,1]。因此,这里可以使用乙状结肠和唐氏结肠。由于上述原因,仅Softmax是不可能的。请参阅下面的代码:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

X = np.hstack((np.linspace(0, 0.45, num=50), np.linspace(0.55, 1, num=50)))
Y = (X > 0.5).astype('float').T

model = Sequential()
model.add(Dense(1, input_dim=1, activation='tanh'))

model.compile(loss='binary_crossentropy', optimizer='SGD', metrics=['accuracy'])
model.fit(X, Y, epochs=100)

print(model.evaluate(X, Y, verbose=False))

每当有人说在机器学习中你应该总是喜欢foo而不是bar,这可能是一种不可接受的简化。有一些反模式可以向人们解释,一些根本不起作用的东西,比如上面例子中的Softmax。如果剩下的都那么简单,AutoML将是一个非常枯燥的研究领域;)。PS:我并不是在做AutoML

这毫无意义,softmax或tanh不能用于该网络中的二进制交叉熵损失,因为它只有一个输出神经元。这就解释了为什么你会得到糟糕的结果。@MatiasValdenegro你能详细说明一下吗?我没有正确理解你的观点。二进制交叉熵损失假设目标是二进制的(0或1),并且预测是[0,1](连续的)。如果将softmax与一个神经元一起使用,则输出将是不变的常数1.0,如果使用tanh,则输出为[-1,1]+1,表示“…foo over bar…”。“Tanh如何使用偏差适应值范围[0,1]”工作?常规的“偏差”无助于拟合[0,1],因为它不能随着权重/输入的变化限制tanh的输出。神经元有权重w和偏差。这两种方法可以一起用于将训练集(最好是测试集)的所有元素的输出拟合到[0,1]。请记住,这一切都是关于向量空间(也称为特征空间)的相关子集。不是R^n的所有值。希望有帮助。