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

时间:2016-08-02 23:10:28

标签: lasagne nolearn python-nolearn

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

  • 第一个输入是尺寸图像(288,1001)

  • 第二个输入是长度为87

  • 的向量
  • 第三个是单个标量值

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

代码在ConcatLayer上爆炸: '不匹配:输入形状必须相同,但串联轴除外

如果有人能够写出一个可以采用这些类型的输入并输出单个标量值的超简单网络结构,那将永远感激不尽。我一直在谷歌上搜索,根本无法弄清楚这个。

如果有必要知道,拟合函数看起来像这样,因为你可以看到我输入的字典中包含每种输入类型的项目:

foreach($data as $row){
    $ID = $row['id'];
    $prop1 = isset($row['prop1'])? $row['prop1']: null;
    $prop2 = isset($row['prop2'])? $row['prop2']: null;
    $prop3 = isset($row['prop3'])? $row['prop3']: null;

    $result = $createworkoutquery->execute();
    ...
}

1 个答案:

答案 0 :(得分:1)

很难正确回答这个问题,因为 - 这取决于。 如果没有关于你想要做什么以及你正在做什么数据的信息,我们在这里玩猜谜游戏,因此我不得不回过头来提供一般性提示。

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

建议使用2D卷积处理图像并使用1D卷积处理序列数据,这是正确的。如果要生成标量值,则可能希望稍后使用密集层来压缩信息。 所以很自然地,将三个分支的低级处理保持独立,然后再将它们连接起来。

有些事情:

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

另一个不太合理的选项是,在图像的低级处理中添加信息。根据标量/时间序列的知识,如果本地处理更容易,这可能是有意义的。

此架构可能如下所示:

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

请注意,您几乎肯定会想要使用第一个选项。

我发现一个无关的东西,就是输入图像的巨大尺寸。你应该减少它(调整大小/补丁)。除非您拥有巨大的数据量和大量的内存和计算能力,否则您将过度使用或浪费硬件。