2016-08-02 30 views
0

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

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

  • 第二输入是长度87

  • 第三的向量是一个标量值的图像

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

的代码在ConcatLayer吹了: “不匹配:输入形状必须是除了在上述串列轴线”

这将是永远感激,如果有人能写出一个超级简单的网络结构可以接受这些类型的输入并输出单个标量值。我一整天都在Google上搜索,根本找不到这个。

拟合函数看起来是这样的,如果它是有帮助的就知道了,你可以看到我输入字典,一个项目对每个类型的输入:

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

回答

1

这是很难正确地回答这个问题,因为 - 这取决于。 没有关于你正在做什么以及你正在处理什么数据的信息,我们在这里玩猜谜游戏,因此我必须回到给出一般提示。

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

你是对的,建议用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 

注意,你几乎肯定会想要去的第一个选项。

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

+0

出于某种原因,我没有想到我可以用DenseLayer重塑它。我想我以为图书馆会有一种合并的方式,但经过进一步的思考,我意识到这样一个过程可能无法用合理的默认方式来概括。然后,很明显,我将不得不提供重塑所需的图层。感谢您的非常有用的答案! – Beaker

相关问题