沿样本的 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)
。
我的 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)
。