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

Posted

技术标签:

【中文标题】我应该使用浮点数还是类作为神经网络最后一层的输出?【英文标题】:should I use float or classes as output for the final layer in my neural network? 【发布时间】:2019-10-04 06:56:17 【问题描述】:

我正在研究一个深度学习问题,我试图根据观察到的地震时间序列预测实验室地震数据的故障时间。目标是一个整数(距离下一次地震的时间),范围从 1 到 10。

我可以将最后一层设计为返回单个浮点数,并使用均方误差 (MSE) 作为损失,以使返回的浮点数接近所需的整数。或者,我可以将每个整数可能性视为一个“类”,并使用交叉熵 (CE) 损失进行优化。

是否有任何支持这些选项的论据?

另外,如果目标是从 1 到 10 的浮点数怎么办?我也可以把它变成一个类/CE问题。

到目前为止,我已经尝试了 CE 选项(在某种程度上有效)并且正在考虑尝试 mse 选项,但想在继续之前退后一步思考。这样的想法将包括推理为什么一种方法可能优于另一种方法。

我正在使用 pytorch 版本 1.0.1 和 Python 3.7。

感谢您的任何指导。

【问题讨论】:

难道不可以考虑:“软件开发独有的实用、可回答的问题” 也许有一个特定的应用程序。当前没有用例的通用解释建议在其他地方进行更通用的讨论。 如果我添加到我正在使用 pytorch 包的问题,​​这会使问题可行吗?如果我更详细地解释我试图解决的问题会有所帮助吗? 以上两项我都做了——这样更好吗?希望我能了解提出可接受问题的规则。 【参考方案1】:

我决定在 Pytorch 中实现一个带有 L1Loss 的浮动头,并创建了一个简单但有效的合成数据集来测试实现。该数据集创建的图像中随机绘制了许多小方块。训练标签只是平方数除以 10,一个带有一位十进制数字的浮点数。 网络训练得非常快且精度很高——测试样本精确到小数点后一位。

至于最初的问题,我所做的运行肯定有利于浮动而不是班级。

我对此的看法是,类中的实现在类的分配中具有基本的不精确性,也许更重要的是,类实现没有“度量”的概念。也就是说,浮点实现,即使它错过了精确匹配,也会尝试生成一个输出标签“接近”输入标签,而类实现没有“接近”的概念。

Pytorch 的一个警告。如果您适合一个浮点数,请确保将其包含在数据生成器中的长度为 1 的向量中。 Pytorch 无法处理“裸”浮点数(即使批处理完成后它确实变成了向量)。但它没有抱怨。这花了我很多时间。

【讨论】:

以上是关于我应该使用浮点数还是类作为神经网络最后一层的输出?的主要内容,如果未能解决你的问题,请参考以下文章

请问BP输出节点数如何确定?

BP神经网络—java实现

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

对于分类问题的神经网络最后一层的函数:sigmoidsoftmax与损失函数

在java中将浮点数舍入到7位有效数字[重复]

从 python 访问 c++ 类