沿样本的 Keras 卷积

Keras convolution along samples

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

问题是我手动选择了卷积核的值。我想获得 NN 可能性来训练卷积核值。所以,我需要在 softmax dense 之后添加卷积作为最后一层。如果我正确理解 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 中执行此操作?

卷积层需要像 (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)