沿样本的Keras卷积

沿样本的Keras卷积,keras,lstm,convolution,Keras,Lstm,Convolution,我有一个LSTM NN,在最后一个密集(softmax)神经元之后有一个输出。我发现如果我通过应用numpy卷积来平滑预测的Y,我会得到更好的精度 问题是我手动选择卷积内核的值。我想得到训练卷积核值的NN可能性。所以,我需要添加卷积作为softmax dense之后的最后一层。如果我正确理解Keras Conv1D,它只能沿着特征卷积。但我需要对不同样本(轴0)的输出进行卷积。因此,如果NN产生 Y = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7] …并且卷积层的核_

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

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

Y = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]
…并且卷积层的核_大小为3,它应该卷积向量Y和另一个经过训练的卷积向量C(例如[0.1,0.5,1]):

因此,目标是沿着样本卷积输出,但让神经网络训练卷积向量核来选择最佳的


在Keras中可以这样做吗?

卷积层需要像
(样本、长度、通道)
这样的输入形状

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

看起来您希望旧采样为新长度,并且在任何情况下都只有一个通道。我不确定这是否正是您打算做的,但因此,我们只留下一个新样品

因此,我们将张量从
(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数组是
(示例,)
还是
(示例,1)

1最后一次密集(softmax)后的输出
——您指的是带有softmax的
(批次,1)
形状的输出吗?不管怎样,这总是输出1。是的,我的意思是NN在最后一层有1个密集的神经元,所以你必须先修复它。您可能应该使用“sigmoid”来代替。好吧,但不管激活情况如何,问题都是一样的:如何添加卷积层,将沿着样本卷积
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,)))