尝试使用具有不同形状输入的 ConcatLayer

Trying to use ConcatLayer with different shape inputs

我正在尝试使用 nolearn 并使用 ConcatLayer 组合多个输入。只要每个输入都具有相同的类型和形状,它就可以很好地工作。我有三种不同类型的输入,它们最终会产生一个标量输出值。

我在第一个输入上使用 Conv2DLayer(s)。 第二个输入使用 Conv1DLayer 或 DenseLayer(不确定哪个会更好,因为我不能足够远地看到会发生什么) 我什至不确定应该如何设置第三个输入,因为它只是我想输入网络的单个值。

代码在 ConcatLayer 爆炸了: 'Mismatch: input shapes must be the same except in the concatenation axis'

如果有人能写出一个超级简单的网络结构,可以接受这些类型的输入并输出单个标量值,我们将永远感激不已。我整天都在谷歌搜索,根本无法弄清楚这个。

拟合函数看起来像这样,如果它有助于了解的话,正如你所看到的,我正在输入一个字典,其中包含每种输入类型的项目:

X = {'base_input': X_base, 'header_input': X_headers, 'time_input':X_time}
net.fit(X, y)

很难正确回答这个问题,因为 - 这取决于。 在没有关于您正在尝试做什么以及您正在处理哪些数据的信息的情况下,我们在这里玩猜谜游戏,因此我不得不回过头来提供一般提示。

首先,ConcatLayer 的抱怨是完全合理的。将标量附加到图像的像素值并没有多大意义。所以你应该考虑你真正想要的是什么。这很有可能结合了三个来源的信息。

你是对的,建议用二维卷积处理图像,用一维卷积处理序列数据。如果你想生成一个标量值,你可能希望稍后使用密集层来压缩信息。 所以很自然地,让三个分支的低级处理独立,然后再将它们连接起来。

大致如下:

Image -> conv -> ... -> conv -> dense -> ... -> dense -> imValues
Timeseries -> conv -> ... -> conv -> dense ... -> dense -> seriesValues
concatLayer([imValues, seriesValues, Scalar] -> dense -> ... -> dense with num_units=1

另一个不太常见的选项是,在图像的低级处理中添加信息。考虑到 scalar/timeseries.

的知识,如果本地处理更容易,这可能是有道理的

此架构可能如下所示:

concatLayer(seriesValues, scalar) -> dense -> ... -> reshape((-1, N, 1, 1))
    -> Upscale2DLayer(Image.shape[2:3]) -> globalInformation
concatLayer([globalInformation, Image]) -> 2D conv filtersize=1 -> conv -> ... -> conv

请注意,您几乎肯定会选择第一个选项。

我注意到的一件无关紧要的事情是您的输入图像的巨大尺寸。你应该减少它(resizing/patches)。除非你有大量的数据和大量的内存和计算能力,否则你将过度拟合或浪费硬件。