沿样本的Keras卷积

时间:2017-12-19 12:54:16

标签: keras lstm convolution

我的LSTM NN在最后一个Dense(softmax)神经元之后有1个输出。我看到如果我通过应用numpy卷积来平滑预测的Y,我会获得更好的准确性。

问题是我手动选择卷积内核的值。我希望NN有可能训练卷积核值。所以,我需要在softmax密集之后添加卷积作为最后一层。如果我正确理解Keras Conv1D,它只能沿着特征进行卷积。但我需要针对不同的样本(轴0)进行输出卷积。因此,如果NN产生

Y = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]

...和卷积层的kernel_size是3,它应该卷积矢量Y和另一个训练的卷积矢量C(例如[0.1,0.5,1]):

>>> np.convolve([0.1, 0.5, 1],[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7], mode='same')
array([ 0.07,  0.23,  0.39,  0.55,  0.71,  0.87,  0.95])

因此,目标是沿着样本卷积输出,但让NN训练卷积矢量内核来选择最佳的。

在Keras可以这样做吗?

1 个答案:

答案 0 :(得分:1)

卷积层需要输入形状,如(samples, length, channels)

要沿着样本进行卷积,只需重新组织张量,使其达到卷积输入要求。

看起来您希望旧样本为新长度,并且在任何情况下您只有一个频道。我不确定这是否与您打算做的完全相同,但因此,我们只会留下一个新样本。

所以,我们将你的张量从(samples,)改为(1, samples, 1)

考虑到第一个维度的重塑,我们需要一个lambda层:

model.add(Lambda(lambda x: K.reshape(x,(1,-1,1)), output_shape=(None,1)))
model.add(Conv1D(1,3,padding='same'))

#it's very important to reshape back to the same number of original samples, or keras will not accept your model:
model.add(lambda(lambda x: K.reshape(x,(-1,1)),output_shape=(1,)))

最终形状可能需要调整以适合您的训练数据。取决于您的numpy数组是(samples,)还是(samples,1)