【问题标题】:How would I go about creating a keras model with a varying number of targets/outputs?我将如何创建具有不同数量目标/输出的 keras 模型?
【发布时间】:2020-05-27 19:56:12
【问题描述】:

我已经使用 Keras 和一个目标建立了一个神经网络回归模型。这工作正常, 现在我想包括多个目标。数据集一共包含 30 个目标,我宁愿训练一个神经网络,而不是 30 个不同的。

我的问题是,在数据的预处理中,对于给定的示例,我必须删除一些目标值,因为它们代表不可预测的非物理值。 这造成了我有不同数量的目标/输出的问题。 例如: 目标 =

  1. 无,0.007798,0.012522
  2. 0.261140, 2110.000000, 2440.000000
  3. 0.048799,无,无

对于给定的输入,我将如何创建一个具有不同数量输出的 keras.Sequential 模型(或函数)?

编辑:我是否可以先训练一个分类模型,在给定一些测试输入的情况下预测输出数量,然后根据该预测改变输出层中的输出数量?我想我必须使用函数式 API 来完成类似的事情。
这里的“分类”编辑是不必要的,即忽略它。测试目标的输出数量是一个已知量。

【问题讨论】:

    标签: python tensorflow keras neural-network


    【解决方案1】:

    (对不起,我没有足够的声誉来发表评论) 首先,您是否预先知道某些输出值是否无效,或者是预测哪些输出实际有效的问题的一部分?

    如果您事先不知道要忽略哪些输出,则可以采用您在评论中描述的两步法。

    如果它是确定性的(并且你知道如何),那么哪些输出对于任何给定的输入都是有效的,而你的问题是如何建立一个合适的模型,那么我将在 keras 中这样做:

    • 使用函数式 API
    • 创建 30 个命名输出层(例如 out_0、out_1、... out_29)
      • 创建模型时,只需使用输出参数列出所有 30 个输出
    • 编译模型时,为每个单独的输出指定损失,您可以通过将字典传递给损失参数来做到这一点,其中键是输出层的名称,值是相应的损失
      • 假设您将对所有输出使用均方误差,字典将类似于 {'out_0': 'mse', 'out_1': 'mse', ..., 'out_29': 'mse' }
    • 将输入传递给模型时,每个输入传递三个内容:x、y、损失权重
      • y 必须是字典,其中键是输出层名称,值是目标输出值
      • 损失权重也是与 y 格式相同的字典。在您的情况下,权重可以是二进制的,对于任何给定的样本,每个输出对应于一个真实值,每个输出对应于非物理值(因此它们在训练期间被忽略)为 0
      • 不要为非物理值目标传递“无”,使用某种数字填充符,否则会出现问题。填充物使用什么完全无关紧要,因为它不会影响训练期间的梯度

    这将为您提供可训练的模型。但是,一旦您从训练继续并尝试对新数据进行预测,您将不得不决定对每个样本忽略哪些输出,网络可能仍会为您提供这些输入的“有效”输出。

    【讨论】:

    • 感谢您的详尽回答。是的,我意识到我确实事先知道。很抱歉我对分类进行了编辑,结果发现它不相关。我将逐步尝试您的解决方案,然后将结果回复给您。非常感谢!
    【解决方案2】:

    一种可能的解决方案是单独输出“有效性标志”,其取值范围为 0 到 1。例如,您的第一个目标是

    y=[0.0, 0.007798, 0.012522]
    yf=[0.0, 1.0, 1.0]
    

    其中零表示无效值。 对yf 使用 sigmoid 激活函数。 损失函数可以是yyf 的损失之和。 在推理过程中,分析yf 的网络输出,仅当对应的yf 超过0.5 个阈值时才认为y 值有效

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2023-02-09
      • 2018-06-27
      相关资源
      最近更新 更多