首页 > 解决方案 > 使用 keras 在 2D 数据上输出 1D 卷积的形状

问题描述

我正在尝试使用 keras 对时间序列分类问题实现一维卷积。我在解释一维卷积层的输出大小时遇到​​了一些麻烦。

我的数据由 128 个单位的时间间隔内的不同特征的时间序列组成,并应用一维卷积层:

x = Input((n_timesteps, n_features))
cnn1_1 = Conv1D(filters = 100, kernel_size= 10, activation='relu')(x)

编译后我得到以下输出形状:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_26 (InputLayer)        (None, 128, 9)            0         
_________________________________________________________________
conv1d_28 (Conv1D)           (None, 119, 100)          9100     

我假设使用一维卷积,数据仅在时间轴(轴 1)上进行卷积,我的输出大小为:119、100*9。但我猜想网络正在跨特征维度(轴 2)执行一些操作王,我不知道正在执行哪个操作。我之所以这么说是因为我将其解释为 1d 卷积是必须保留特征形状,因为我只对时域进行卷积:如果我有 9 个特征,那么对于每个过滤器我有 9 个卷积核,每个都应用于不同的特征并在时间轴上复杂。这应该为每个过滤器返回 9 个卷积特征,从而产生 119、9*100 的输出形状。但是输出形状为 119、100。

显然,正在发生其他事情,我无法理解或理解它。

我在哪里失败了我的推理?一维卷积是如何进行的?

我再添加一条评论,这是我对提供的答案之一的评论:

我理解从 128 到 119 的减少,但我不明白的是为什么特征维度会发生变化。例如,如果我使用

Conv1D(filters = 1, kernel_size= 10, activation='relu')

,那么输出维度将是 (None, 119, 1),卷积后只产生一个特征。这个维度是怎么回事,从 9 --> 1 执行哪个操作?

标签: pythonkerasdeep-learningconv-neural-network

解决方案


Conv1D的输入需要 3D 张量,形状为 ( batch_size,time_step,feature)。根据您的代码,过滤器大小为 100,这意味着过滤器从 9 维转换为 100 维。这是怎么发生的?点积

在此处输入图像描述

在上面,X_ik单词的连接(k= kernel_size),l是过滤器的数量(l=filters),d是输入单词向量的维度,p_i是每个单词窗口的输出向量k

你的代码会发生什么?

[n_features * 9][n_features * 9]=> [1]=> 重复l-times=>[1 * 100]

对所有序列执行上述操作 =>[128 * 100]

这里发生的另一件事是您没有指定padding类型。根据文档,默认情况下 Conv1d 使用有效填充,这导致您的维度从 128 减少到 119。如果您需要维度与输入相同,您可以选择相同的选项:

Conv1D(filters = 100, kernel_size= 10, activation='relu', padding='same')

推荐阅读