Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sigmoid激活函数在Keras中的应用_Python_Tensorflow_Keras_Neural Network_Sigmoid - Fatal编程技术网

Python sigmoid激活函数在Keras中的应用

Python sigmoid激活函数在Keras中的应用,python,tensorflow,keras,neural-network,sigmoid,Python,Tensorflow,Keras,Neural Network,Sigmoid,我有一个由18260个输入字段和4个输出组成的大数据集。我正在使用Keras和Tensorflow建立一个神经网络,可以检测可能的输出 然而,我尝试了许多解决方案,但精度不会超过55%,除非我在所有模型层中使用sigmoid激活功能,但第一个除外,如下所示: def baseline_model(optimizer= 'adam' , init= 'random_uniform'): # create model model = Sequential() model.add(Dense(40,

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

然而,我尝试了许多解决方案,但精度不会超过55%,除非我在所有模型层中使用
sigmoid
激活功能,但第一个除外,如下所示:

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

在所有层中使用
sigmoid
激活是否正确?如上图所示,使用sigmoid时,准确率达到99.9%。因此,我想知道模型实现中是否存在错误。

您必须使用一个或另一个激活,因为激活是将非线性引入模型的来源。如果模型没有任何激活,那么它的行为基本上就像一个单层网络。阅读有关“为什么使用激活”的更多信息。您可以检查各种激活


尽管在使用sigmoid时,您的模型似乎过于合适,但请尝试一些技术来克服它,如创建训练/开发/测试集、降低模型的复杂性、退出等。

您必须使用一种或另一种激活,因为激活是将非线性引入模型的来源。如果模型没有任何激活,那么它的行为基本上就像一个单层网络。阅读有关“为什么使用激活”的更多信息。您可以检查各种激活


虽然在使用sigmoid时,您的模型似乎过拟合,但请尝试一些技术来克服它,如创建训练/开发/测试集、降低模型的复杂性、退出等。

神经网络需要在每一层上使用非线性。如果没有非线性激活,无论你有多少层,你都可以只用一层写同样的东西

线性函数的复杂性有限,如果“g”和“f”是线性函数,则g(f(x))可以写成z(x),其中z也是线性函数。在不增加非线性的情况下叠加它们是没有意义的


这就是为什么我们使用非线性激活函数。sigmoid(g(f(x))不能写成线性函数

神经网络需要每一层的非线性才能工作。如果没有非线性激活,无论你有多少层,你都可以只用一层写同样的东西

线性函数的复杂性有限,如果“g”和“f”是线性函数,则g(f(x))可以写成z(x),其中z也是线性函数。在不增加非线性的情况下叠加它们是没有意义的


这就是为什么我们使用非线性激活函数。sigmoid(g(f(x))不能写成线性函数

乙状结肠可能有用。但是我建议使用relu激活来激活隐藏层。问题是,您的输出层的激活是sigmoid,但它应该是softmax(因为您使用的是稀疏的分类的交叉熵损失)

讨论意见后编辑 您的输出是类标签的整数。S形逻辑函数输出范围(0,1)内的值。softmax的输出也在范围(0,1)内,但softmax功能在输出上增加了另一个约束:-输出之和必须为1。因此,softmax的输出可以解释为输入为每个类别的概率

例如


def乙状结肠(x):
返回1.0/(1+np.exp(-x))
def softmax(a):
返回np.exp(a-max(a))/np.sum(np.exp(a-max(a)))
a=np.数组([0.6,10,-5,4,7])
印刷品(乙状体(a))
# [0.64565631, 0.9999546 , 0.00669285, 0.98201379, 0.99908895]
打印(softmax(a))
#[7.86089760e-05、9.50255231e-01、2.90685280e-07、2.3554472E-03、,
4.73104222e-02]
打印(总和(softmax(a))
# 1.0

sigmoid可能有效。但我建议使用relu激活来激活隐藏层。问题是,输出层的激活是sigmoid,但它应该是softmax(因为您使用的是稀疏的分类熵损失)

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

例如


def乙状结肠(x):
返回1.0/(1+np.exp(-x))
def softmax(a):
返回np.exp(a-max(a))/np.sum(np.exp(a-max(a)))
a=np.数组([0.6,10,-5,4,7])
印刷品(乙状体(a))
# [0.64565631, 0.9999546 , 0.00669285, 0.98201379, 0.99908895]
打印(softmax(a))
#[7.86089760e-05、9.50255231e-01、2.90685280e-07、2.3554472E-03、,
4.73104222e-02]
打印(总和(softmax(a))
# 1.0

谢谢你的回答,但我对我的问题还是有点困惑。使用上面显示的sigmoid是否有问题?我知道还有很多激活功能,但我想在所有层中使用sigmoid,第一层除外。所以我需要知道这是否正确。你可以在第二层中自由使用任何你想要的激活功能e隐藏层。但当您将其分为4类时,应在输出层使用“softmax”。此外,还应使用“Category_crossentropy”作为损失。请阅读此处的更多内容。只需记住检查过拟合。输出为整数(1、2、3和4),因此,根据您建议的链接,我应该使用稀疏的分类交叉熵。这取决于您的标签是什么。如果它们类似于[2,3,1,0],请使用稀疏的分类交叉熵,如果它们类似于[[0,0,1,0],[0,0,0,0,1],[0,1,0,0,0]],请使用分类交叉熵。请参阅(),().Yupp,所以你会使用稀疏分类交叉熵。谢谢你的回答,但我对我的问题仍然有点困惑。使用上面显示的sigmoid是否有问题?我知道还有很多激活函数,但我想在所有层中使用sigmoid,除了第一层。所以我需要知道这是正确的还是错误的。你有使用任何激活的自由
model.add(Dense(4, activation="softmax", kernel_initializer=init))