为啥神经网络输出浮点数而不是整数?

Posted

技术标签:

【中文标题】为啥神经网络输出浮点数而不是整数?【英文标题】:Why is neural network output in float instead of integers?为什么神经网络输出浮点数而不是整数? 【发布时间】:2022-01-06 18:05:32 【问题描述】:

我刚刚完成了有关如何构建神经网络的教程。现在我正在尝试为二进制分类构建一个成本敏感的神经网络。但不知何故,当我使用预测函数时,我的输出不是二进制,而是浮点数。我想我做错了什么,但我不知道是什么。

from keras.layers import Dense
from keras.layers import Dropout
cost_sensitive_NN = Sequential()
cost_sensitive_NN.add(Dense(12, activation = 'relu', input_dim=X_train_NN.shape[1]))
cost_sensitive_NN.add(Dropout(0.75))
cost_sensitive_NN.add(Dense(8, activation = 'relu'))
cost_sensitive_NN.add(Dense(1, activation = 'sigmoid'))
cost_sensitive_NN.compile(loss = 'binary_crossentropy',
              optimizer = 'adam',metrics = ['AUC'])
cost_sensitive_NN.fit(X_train_NN, y_train_NN, class_weight = 0:1, 1:100, epochs = 1)

【问题讨论】:

这是预期行为;输出代表 2 个类的 概率,因此它们确实应该是浮点数而不是整数。 @desertnaut 小心,只有在某些情况下,输出才代表概率,即便如此,它们也很少符合应有的水平。 arxiv.org/abs/1706.04599 @AndrewHolmgren 同意,进入校准问题和表示的细节不是我在这里的意图(也不是编程)主题。 【参考方案1】:

二进制分类中的binary 并不意味着您的模型将输出二进制值。

您在神经网络中的最后一层是Dense layer,输出形状为1。 Dense 层输出的默认类型是浮点数(实际上是it can only be a floating point dtype。通过用binary_crossentropy 损失训练这个模型,我们正在教模型输出0.01.0 之间的浮点数,表示概率属于正类的模型输入。

如果您在推理期间想要像 01 这样的二进制输出,您可以设置一个概率阈值并返回适当的二进制值,如下所示:

def binary_inference(input_list, threshold=0.8):
    probability_list = cost_sensitive_NN(input_list)
    return probability_list >= threshold

然而,决定一个阈值是whole other topic。

【讨论】:

可以使用矢量化方法代替列表解析:output >= threshold 会给你一个布尔数组。 @jakub 相应编辑

以上是关于为啥神经网络输出浮点数而不是整数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Kivy 使用浮点数而不是整数?

我应该使用浮点数还是类作为神经网络最后一层的输出?

为啥我们在 OpenGL (ES) android 中以字节分配块而不是浮点数,尽管我们大部分时间都使用浮点数

Python中整数运算除法,输出带浮点数

关于整数输出为浮点数的问题

为啥 as_tibble() 将浮点数舍入到最接近的整数?