【问题标题】:Shape of 1D convolution output on a 2D data using keras使用 keras 在 2D 数据上输出 1D 卷积的形状
【发布时间】:2022-03-17 01:14:43
【问题描述】:

我正在尝试使用 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 执行哪个操作?

【问题讨论】:

    标签: python keras deep-learning conv-neural-network


    【解决方案1】:

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

    在上面,X_ik 单词的串联(k = kernel_size),l 是过滤器的数量(l=filters),d 是输入词向量的维度,并且p_ik 单词的每个窗口的输出向量。

    你的代码会发生什么?

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

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

    这里发生的另一件事是您没有指定padding 类型。 According to the docs,默认情况下 Conv1d 使用 valid 填充,这导致您的尺寸从 128 减少到 119。如果您需要尺寸与输入相同,您可以选择 same 选项:

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

    【讨论】:

    • 我理解从128减少到119,但我不明白为什么特征维度会发生变化。例如,如果我使用 Conv1D(filters = 1, kernel_size= 10, activation='relu'),那么输出维度将是 (None, 119, 1),卷积后只产生一个特征。这个维度是怎么回事,从9-->1执行哪个操作?
    • @Iván 简单矩阵乘法 xW+b 发生在这里。阅读更多here
    • 过滤器 = 1,功能 = 1
    【解决方案2】:

    它在最后一个轴上求和,这是特征轴,您可以通过执行以下操作轻松检查:

    input_shape = (1, 128, 9)
    # initialize kernel with ones, and use linear activations
    
    y = tf.keras.layers.Conv1D(1,3, activation="linear", input_shape=input_shape[2:],kernel_initializer="ones")(x)
    

    是的:

    如果您沿特征轴对 x 求和,您将得到: x

    现在你可以很容易地看到 sum of x 的前 3 个值之和是卷积的第一个值,我使用了 3 的内核大小来使这个验证更容易

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2021-04-29
      • 2018-02-19
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2021-11-23
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多