2017-08-03 50 views
3

我的神经网络的第一层是这样的:输入形状和Conv1d在Keras

model.add(Conv1D(filters=40, 
       kernel_size=25, 
       input_shape=x_train.shape[1:], 
       activation='relu', 
       kernel_regularizer=regularizers.l2(5e-6), 
       strides=1)) 

如果我的输入形状是(600,10)

我得到(None, 576, 40)作为输出形状

如果我的输入形状是(6000,1)

我得到(None, 5976, 40)作为输出形状

所以我的问题是到底发生了什么?是第一个简单地忽略90%输入的例子?

回答

6

它不是“忽略” 90%时的输入的,问题很简单,如果通过大小X的结果的输入执行与大小ķ的内核1维卷积卷积将有大小X - K + 1.如果您希望输出具有与输入相同的大小,则需要扩展或“填充”数据。有几种策略,例如添加零,复制两端的值或环绕。 Keras'Convolution1D有一个padding参数,您可以将其设置为"valid"(缺省值,无填充),"same"(在输入的两侧添加零以获得与输入相同的输出大小),并且"causal"(在一端用零填充只有,从WaveNet采取的想法)。

更新

关于在您的评论的问题。所以你说你的输入是(600, 10)。我假设这是一个示例的大小,并且您有一批大小为(N, 600, 10)的示例。从卷积运算的角度来看,这意味着你有一个例子,每个例子的长度至多为600(这个“长度”可能是时间或其他任何东西,它只是卷积工作的维数),而且,在这些600的每一点上,您都有大小为10的载体。这些向量中的每一个被认为是具有10特征(例如价格,高度,大小,无论)的原子样本,或者如在卷积的情况下有时称为“通道”(来自用于2D图像卷积的RGB通道)。

问题是,卷积有一个内核大小和一些输出通道,这是Keras中的filters参数。在你的例子中,卷积所做的是将25个连续的10个矢量的每一个可能片段,并为每个矢量生成一个单一的40-矢量(当然,对于批处理中的每个例子)。所以你从输入中的10个特征或通道转到卷积后有40个特征或通道。并不是它只使用最后一维中的10个元素中的一个,而是使用它们全部来生成输出。

如果输入中维度的含义不是卷积解释的内容,或者它正在执行的操作不是您所期望的操作,则可能需要重新整形输入或使用不同类型的图层。

+0

这不是我真正想问的。可以说我用0填充,那么我的输出形状将分别为'(None,600,40)'和'(None,6000,40)'。我想知道的是'(600,10)'中的其他9个数组会发生什么,也就是说输出形状应该是'(None,576,40,10)'而不是'(None,576) ,40)' – drulludanni

+0

@drulludanni我已经用更多的解释更新了答案。 – jdehesa

+0

所以,我们在每个样本中有10个长度为600的序列。每个序列都代表一个特征。所以我们有e.q. 600个连续的温度值,600个连续的湿度值等。 Conv1D层在每个序列*中分别查找模式*。我能理解吗? – gisek