1

我有一个由 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激活正确吗?如上所示,使用 sigmoid 时准确率达到 99.9%。所以我想知道模型实现是否有问题。

4

3 回答 3

5

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

model.add(Dense(4, activation="softmax", kernel_initializer=init))

在讨论评论后编辑

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

例如


def sigmoid(x): 
    return 1.0/(1 + np.exp(-x))

def softmax(a): 
    return np.exp(a-max(a))/np.sum(np.exp(a-max(a))) 

a = np.array([0.6, 10, -5, 4, 7])
print(sigmoid(a))
# [0.64565631, 0.9999546 , 0.00669285, 0.98201379, 0.99908895]
print(softmax(a))
# [7.86089760e-05, 9.50255231e-01, 2.90685280e-07, 2.35544722e-03,
       4.73104222e-02]
print(sum(softmax(a))
# 1.0
于 2018-11-30T08:42:14.453 回答
0

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

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

于 2018-11-30T08:34:51.323 回答
-1

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

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

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

于 2018-11-30T08:37:26.260 回答