在下面的神经网络中,Sigmoid函数的结果优于tanh或softmax。
如果我将激活函数从S形更改为tanh或softmax,则误差增加,精度降低。虽然我已经知道tanh和softmax比S型更好。有人可以帮我理解吗? 使用的数据集:虹膜和比马印第安人糖尿病数据库 我已经使用过tensorflow 1.5和keras 2.2.4
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))
答案 0 :(得分:1)
值范围在-1和1之间,但是就Tanh而言,这不一定是问题。通过学习合适的权重,Tanh可以使用偏差适合值范围[0,1]。因此,Sigmoid和Tangh均可在此处使用。由于上述原因,仅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
ANN = Sequential()
ANN.add(Dense(1,input_dim=1,activation='tanh'))
ANN.compile(loss='binary_crossentropy', optimizer='SGD',metrics=['accuracy'])
ANN.fit(X,Y,epochs=100)
print(ANN.evaluate(X,Y,verbose=False))
每当有人说您在机器学习中应该总是比foo更喜欢foo时,这可能是不可接受的简化。有一些反模式可以向人们解释,这是行不通的,例如上面示例中的Softmax。如果剩下的那么简单,AutoML将是一个非常无聊的研究领域;)。 PS:我不是完全在AutoML上工作。
答案 1 :(得分:0)
Softmax激活功能通常用作分类激活。这是因为softmax将输出压缩在范围(0,1)之间,以便输出的总和始终为1 。如果您的输出层只有一个单元/神经元,它将始终具有常数1作为输出。
Tanh或双曲正切是将输出映射到(-1,1)范围的逻辑函数。 Tanh可用于两个类之间的二进制分类。使用tanh时,请记住用[-1,1]相应地标记数据。
Sigmoid函数是另一个逻辑函数,例如tanh。如果S型功能输入限制为实值和正值,则输出将在(0,1)范围内。这使得乙状结肠成为预测某种事物发生概率的好函数。
因此,总而言之,输出激活功能通常不是模型性能的选择,而实际上取决于您正在处理的任务和网络体系结构。