【问题标题】:Multiple-input multiple-output CNN with custom loss function具有自定义损失函数的多输入多输出 CNN
【发布时间】:2019-05-19 12:53:50
【问题描述】:

我有一组二维输入数组m x n,即A,B,C,我必须预测两个二维输出数组,即d,e,我确实有预期值。如果您愿意,您可以将输入/输出视为灰色图像。

由于空间信息是相关的(这些实际上是 2D 物理域),我想使用卷积神经网络来预测 de。我的设计(尚未测试)如下所示:

因为我有多个输入,我想我应该使用多个列(或分支)来为每个输入找到不同的特征(它们看起来完全不同)。这些列中的每一列都遵循分割中使用的编码-解码架构(参见 SegNet):Conv2D 块涉及卷积+批量标准化+ReLU 层。 Deconv2D涉及反卷积+批量归一化+ReLU。

然后,我可以通过连接、平均或取最大值来合并每一列的输出。为了获得我见过的每个输出的原始m x n 形状,我可以使用1 x 1 内核卷积来做到这一点。

我想预测该单层的两个输出。从网络结构的角度来看,这可以吗?最后,我的损失函数取决于与目标相比的输出本身以及我想要施加的另一个关系。

A 希望对此有一些专家意见,因为这是我第一次设计 CNN,我不确定它是否像现在这样有意义和/或是否有更好的方法(或网络架构)来这个问题。

我最初在datascience 上发布了此内容,但没有得到太多反馈。我现在在这里发布它,因为在这些主题上有一个更大的社区,而且我将非常感谢收到除了网络架构之外的实施技巧。谢谢。

【问题讨论】:

  • 模型结构问题过于宽泛,具体视具体场景而定。最好问一下如何为指定的输入和输出设计自定义损失函数。
  • 这实际上与在没有点卷积的情况下执行深度可分离卷积相同。
  • 这有什么问题?

标签: tensorflow keras neural-network deep-learning conv-neural-network


【解决方案1】:

我认为你的设计总体上是有意义的:

  • 由于 A、B 和 C 完全不同,您将每个输入设为一个变换子网络,然后将它们融合在一起,这就是您的中间表示。

  • 从中间表示中,您应用额外的 CNN 来分别解码 D 和 E。

几件事:

  1. A、B 和 C 看起来不同并不一定意味着您不能将它们堆叠在一起作为 3 通道输入。应根据 A、B 和 C 中的值的含义是否不同这一事实做出决定。例如,如果 A 是灰度图像,B 是深度图,C 也是由不同相机捕获的灰度图像。然后以您建议的方式更好地处理 A 和 B,但是可以将 A 和 C 连接为一个输入,然后再将其馈送到您的网络。

  2. D 和 E 是网络的两个输出,将以多任务方式进行训练。当然,它们应该共享一些潜在特征,并且应该在这个特征上进行拆分,以便为每个输出应用一个下游非共享权重分支。但是,在哪里拆分通常很棘手。

【讨论】:

    【解决方案2】:

    这确实是一个广泛的问题,主要依靠意见来寻求答案。不过,这是我的两分钱,您可能会觉得这很有趣,因为它与此处和数据科学上的先前答案不同。

    首先,我不会为每个输入使用单独的列。 AFAIK,当不同的列处理不同的输入时,几乎总是网络是某种 Siemese 网络并且列共享相同的权重;或者至少所有列都需要生成类似的代码。这不是你的情况,所以我根本不会打扰。

    其次,你有幸遇到输出密集的问题并且不需要学习代码。这应该将您直接引导至U-nets,它毫不费力地胜过任何瓶颈设计的网络。 U-nets 被引入用于密集分割,但它们确实适用于任何密集输出问题。

    简而言之,只需将您的输入堆叠在一起并使用 U-net。

    【讨论】:

    • 顺便谢谢你的回答。我认为我的列会有不同的权重,因为输入数据从一列到另一列可能会有很大差异。所以我认为我应该坚持多列。不过,我看过 U-nets 并且看起来很有趣。感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2019-01-11
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多