我有一个包含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
在所有层中都使用sigmoid
进行激活吗?如上所示,使用S型曲线时,精度达到99.9%。所以我想知道模型实现中是否有问题。
答案 0 :(得分:2)
乙状结肠可能起作用。但是我建议使用relu激活来激活隐藏层。问题是,输出层的激活是S形的,但应该是softmax(因为您使用的是sparse_categorical_crossentropy损失)。
model.add(Dense(4, activation="softmax", kernel_initializer=init))
您的输出是类标签的整数。乙状结肠逻辑功能输出范围(0,1)内的值。 softmax的输出也处于(0,1)范围内,但是softmax函数对输出增加了另一个约束:-输出之和必须为1。因此,softmax的输出可以解释为每种类别的输入概率。
答案 1 :(得分:-1)
您必须使用一个或另一个激活,因为激活是将非线性引入模型的来源。如果模型没有任何激活,那么它的行为基本上就像是单层网络。阅读有关“为什么使用激活here”的更多信息。您可以检查各种激活here。
尽管使用Sigmoid时您的模型似乎过拟合,但是请尝试一些技巧来克服它,例如创建训练/开发/测试集,降低模型的复杂性,退出等。
答案 2 :(得分:-1)
神经网络要求每一层都具有非线性才能起作用。如果没有非线性激活,则无论您有多少层,都可以只用一层写同一件事。
线性函数的复杂度受到限制,如果“ g”和“ f”是线性函数,则g(f(x))可以写为z(x),其中z也是线性函数。堆叠它们而不增加非线性是没有意义的。
这就是为什么我们使用非线性激活函数。 sigmoid(g(f(x)))不能写成线性函数。