python - 使用 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 执行哪个操作?
解决方案
Conv1D的输入需要 3D 张量,形状为 ( batch_size,time_step,feature
)。根据您的代码,过滤器大小为 100,这意味着过滤器从 9 维转换为 100 维。这是怎么发生的?点积。
在上面,X_i
是k
单词的连接(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')
推荐阅读
- python - 使用python在弹性搜索中自动完成
- apache-spark - Spark结构化流式实时聚合
- python - 有没有办法动态更改子模块名称
- firebase - Flutter Firebase 上传多张图片
- python-3.x - 拆分功能不适用于字符串和列表
- c++ - 'std::string*& {aka std::basic_string 类型的非常量引用的初始化无效
*&}' 来自 'std::string* {aka - database - 我想听听关于在这个项目中使用时间序列数据库的想法:
- javascript - 配置 webpack 以将 _ 解析为 lodash 索引
- ruby-on-rails - 如何将两个不同模型的 ID 传递给一个新模型?
- python - 引用满足特定条件的 np.array 元素的最快方法