我已经使用具有一个目标的Keras建立了一个神经网络回归模型。这工作正常, 现在我想包括多个目标。该数据集总共包括 30 个目标,我宁愿训练一个神经网络而不是 30 个不同的神经网络。
我的问题是,在数据的预处理中,对于给定的示例,我必须删除一些目标值,因为它们表示无法预测的非物理值。 这会产生我有不同数量的目标/输出的问题。 例如: 目标 =
- 无、0.007798、0.012522
- 0.261140, 2110.000000, 2440.000000
- 0.048799, 无, 无
我将如何创建 keras。对于给定输入具有不同数量输出的顺序模型(或功能模型(?
编辑:我是否可以先训练一个分类模型,该模型预测给定某些测试输入的输出数量,然后根据此预测改变输出层中的输出数量?我想我将不得不使用函数式 API 来实现这样的事情。
这里的"分类"编辑是不必要的,即忽略它。测试目标的输出数量是已知数量。
(抱歉,我没有足够的声誉来评论( 首先,您是否预先知道某些输出值是否无效,或者预测哪些输出实际上是有效的问题的一部分?
如果您事先不知道要忽略哪些输出,则可以使用您在评论中描述的两步方法。
如果它是确定性的(你知道怎么做(,哪些输出对任何给定的输入都有效,而你的问题只是如何建立一个正确的模型,这是我在 keras 中如何做到这一点:
- 使用函数式 API
- 创建 30 个命名输出图层(例如 out_0、out_1、...out_29(
- 创建模型时,只需使用 outputs 参数列出所有 30 个输出
- 编译模型时,为每个单独的输出指定损失,您可以通过将字典传递给 loss 参数来执行此操作,其中键是输出层的名称,值是各自的损失
- 假设您将对所有输出使用均方误差,字典将类似于 {'out_0' : 'mse', 'out_1': 'mse', ..., 'out_29': 'mse'}
- 将输入传递给模型时,每个输入传递三件事:x、y、损失权重
- y 必须是一个字典,其中键是输出图层名称,值是目标输出值
- 损失权重也是与 y 格式相同的字典。在您的例子中,权重可以是二进制的,1 表示对应于实际值的每个输出,0 表示对应于任何给定样本的非物理值的每个输出(因此在训练期间忽略它们(">
- 不要为非物理值目标传递 None,使用某种数字填充物,否则会遇到问题。用于填充物的什么完全无关紧要,因为它不会影响训练期间的梯度
这将为您提供一个可训练的模型。但是,一旦你从训练中继续前进并尝试预测新数据,你将不得不决定忽略每个样本的哪些输出,网络可能仍然会为你提供这些输入的"有效"输出。
一种可能的解决方案是有一个单独的"有效性标志"输出,其值范围从零到一。例如,您的第一个目标将是
y=[0.0, 0.007798, 0.012522]
yf=[0.0, 1.0, 1.0]
其中零表示无效值。 使用乙状结肠激活功能进行yf
。 损失函数可以是y
和yf
的损失之和。 在推理过程中,分析网络输出yf
,并且仅在相应yf
超过 0.5 阈值时才认为y
值有效