【问题标题】:Keras: Should I use an 1D or a 2D convolutional layer in this case?Keras:在这种情况下,我应该使用 1D 还是 2D 卷积层?
【发布时间】:2023-03-04 11:04:02
【问题描述】:

假设我们有一个包含 N 个标记实例的数据集,每个实例是一个 2 X M 的二维矩阵。也就是说,每个实例有两行,其中每一行是一个大小为 M(M 列)的向量。

我想构建一个 NN,其第一层执行卷积操作,其内核具有两行一列。这个想法是将此内核应用于输入矩阵的每一列,为每一列生成一个值作为结果。这个想法将生成一个大小为 M 的向量作为输出,其中向量的每个位置 P 将由 P 列中的两行的卷积生成。下图说明了这个想法。

我不知道如何构建这个卷积层。在这种情况下,我需要 1D 还是 2D 卷积?

我想构建一个具有以下架构的神经网络:

  • 输入为 2 X M,输出为 M 的卷积层。我会 喜欢应用 k 个内核(产生 k 个大小为 M 的向量)
  • 具有 500 个神经元和 relu 激活的密集层。
  • 0.2 的辍学
  • 具有 2 个神经元和 softmax 激活的密集层。

你能帮我建立这个架构吗?

【问题讨论】:

    标签: tensorflow machine-learning keras neural-network conv-neural-network


    【解决方案1】:

    您想为此目的使用 2D CNN。一维 CNN 只需要 1 个空间维度,但您有 2 个空间维度,即使您没有任何“宽度”可以进行多次卷积。

    2D CNN 需要 4D (batch, height, width, channels)。相应地,您的内核也将是 4D。

    查看此代码了解更多详情 -

    import tensorflow as tf
    
    inp = np.array([[[[2.1],[0.8]],[[1.3],[2.4]],[[1.8],[1.3]]]])
    
    kernel = np.array([[[[1.0]],[[2.0]]]])
    
    print('input shape ->',inp.shape)
    print('kernel shape ->',kernel.shape)
    
    result = tf.nn.conv2d(x, kernel, strides=(1,1,1,1), padding='VALID')
    
    print('result shape ->',result.shape)
    print(result.numpy())
    
    input shape -> (1, 3, 2, 1)
    kernel shape -> (1, 2, 1, 1)
    result shape -> (1, 3, 1, 1)
    
    [[[[3.6999998]]
    
      [[6.1000004]]
    
      [[4.3999996]]]]
    

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2017-03-05
      • 1970-01-01
      • 2017-07-25
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多