沿样本的Keras卷积

问题描述 投票:0回答:1

我有LSTM NN,在最后一个密集(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可以做到这一点吗?

keras lstm convolution
1个回答
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)

© www.soinside.com 2019 - 2024. All rights reserved.