Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 Keras二元分类-Sigmoid激活函数_Python_Tensorflow_Neural Network_Keras_Sigmoid - Fatal编程技术网

Python Keras二元分类-Sigmoid激活函数

Python Keras二元分类-Sigmoid激活函数,python,tensorflow,neural-network,keras,sigmoid,Python,Tensorflow,Neural Network,Keras,Sigmoid,我已经用tensorflow在Keras中实现了一个基本的MLP,我正在尝试解决一个二进制分类问题。对于二进制分类,似乎sigmoid是推荐的激活函数,我不太理解为什么,以及Keras如何处理这个问题 我知道sigmoid函数将生成0到1之间的值。我的理解是,对于使用sigmoid的分类问题,将有一个特定的阈值用于确定输入的类别(通常为0.5)。在Keras中,我没有看到任何指定此阈值的方法,所以我假设它是在后端隐式完成的?如果是这种情况,Keras如何区分在二元分类问题中使用sigmoid,还

我已经用tensorflow在Keras中实现了一个基本的MLP,我正在尝试解决一个二进制分类问题。对于二进制分类,似乎sigmoid是推荐的激活函数,我不太理解为什么,以及Keras如何处理这个问题

我知道sigmoid函数将生成0到1之间的值。我的理解是,对于使用sigmoid的分类问题,将有一个特定的阈值用于确定输入的类别(通常为0.5)。在Keras中,我没有看到任何指定此阈值的方法,所以我假设它是在后端隐式完成的?如果是这种情况,Keras如何区分在二元分类问题中使用sigmoid,还是在回归问题中使用sigmoid?对于二元分类,我们需要一个二元值,但是对于回归,需要一个标称值。我所能看到的,可能表明这是损失函数。这是否告知Keras如何处理数据

此外,假设Keras隐含地应用了一个阈值,当我使用我的模型预测新数据时,为什么它会输出标称值

例如:

y_pred = model.predict(x_test)
print(y_pred)
给出:

[7.4706882e-02][8.3481872e-01][2.9314638e-04][5.2297767e-03] [2.1608515e-01]。。。[4.4894204e-03][5.1120580e-05][7.0263929e-04]

我自己可以在预测得到二进制输出时应用一个阈值,但无论如何,为了正确分类,Keras一定要这样做吗?也许Keras在训练模型时应用了一个阈值,但是当我使用它来预测新值时,阈值没有被使用,因为损失函数没有被用于预测?或者根本不应用阈值,输出的标称值恰好与我的模型配合良好?我已经检查过二进制分类的Keras示例,所以我认为我的代码没有犯任何错误,特别是因为它预测准确

如果有人能解释这是如何工作的,我将不胜感激

以下是我的模型作为参考:

model = Sequential()
model.add(Dense(124, activation='relu', input_shape = (2,)))
model.add(Dropout(0.5))
model.add(Dense(124, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy',
              optimizer=SGD(lr = 0.1, momentum = 0.003),
              metrics=['acc'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)

二元分类的输出是样本属于某一类的概率

Keras如何区分在二元分类问题或回归问题中使用sigmoid

它不需要这样做。它使用损失函数计算损失,然后计算导数并更新权重

换言之:

  • 在培训期间,该框架将损失降至最低。用户必须指定损失函数(由框架提供)或提供自己的损失函数。网络只关心此函数输出的标量值,它的两个参数是预测的
    y^
    和实际的
    y
  • 每个激活函数实现正向传播和反向传播函数。该框架只对这两个功能感兴趣。它不关心函数的确切功能。唯一的要求是激活函数是非线性的

您可以在compile()中使用

例如:

model.compile(optimizer='sgd',
              loss='mse',
              metrics=[tf.keras.metrics.BinaryAccuracy()])

也许是定制的度量标准?非常感谢。这很有道理。如果它给你一个属于某个类的概率,那么如何计算误差呢?你可以将概率与二进制值进行比较。这有用吗?@DanielWhettam For tensorflow Keras后端请参阅@DanielWhettam为您添加了更多详细信息。假设我需要二进制输出。softmax图层是一种很好的方法吗?
model.compile(optimizer='sgd',
              loss='mse',
              metrics=[tf.keras.metrics.BinaryAccuracy()])