【问题标题】:Is it possible to generate an 1D dimensional output of a 2D convolutional layer in Keras?是否可以在 Keras 中生成 2D 卷积层的 1D 维输出?
【发布时间】:2021-04-29 14:50:40
【问题描述】:

我正在尝试应用卷积神经网络来处理 2D 输入,即 2X300 矩阵。它基本上是一个有 2 行的矩阵,其中每行是 300 个位置的向量。

我想应用一个大小为 2X1(两行一列)的内核。这个想法是将内核应用于两个向量的每个位置 i。直觉上,我认为这个卷积操作会产生大小为 1X300 的输出。也就是说,我认为输出将是一个具有 300 列的一维向量。我说的对吗?

我想包含一个这样的卷积层:

layers.Conv2D(10, kernel_size=(2, 1), activation="relu",name="conv1")

这有道理吗?这个层会生成一个300个位置的一维向量吗?

【问题讨论】:

    标签: machine-learning keras neural-network keras-layer


    【解决方案1】:

    不,2D 卷积层的输入需要具有 3 个维度(通常是宽度、高度、通道)。 您正在寻找的是一维卷积层,它对一系列数据(通常是时间步长、通道)进行操作。在您的情况下,通道是第一个维度,即每个步骤都考虑所有输入的维度,而您的第二个维度是步骤(在每个步骤上卷积核都被移动)。这需要使用 data_format 关键字指定,因为 'channels_last' 将是 tensorflow/keras 的默认值。

    model.add(Conv1D(1, kernel_size=(1,), data_format='channels_first', activation = 'relu', input_shape=(2, 300)))
    

    这将为您提供形状为(1,300) 的输出。第一个参数是输出通道的数量(在您的情况下为 1)。内核大小为 1,因为您不考虑来自其他卷积步骤的样本,只考虑两个通道(始终在所有通道上执行一维卷积)。 如果您选择更大的内核大小,则可能需要padding='same' 作为附加参数才能获得相同步数的输出。

    【讨论】:

    • 我不确定我是否理解。请注意,我想对输入矩阵的每一列的两个值(每行中的每个值)执行卷积。也就是说,我想对第一列的两行进行卷积并生成结果值。之后,我想在第二列、第三列等中执行此操作...您的解决方案在这种情况下有效吗?
    • 是的,这是我的代码行中应该做的卷积层。
    • 很好,@Max...我认为这可以帮助我。
    • 我遇到了以下错误:pastebin.com/CmRH7WhV
    • 这似乎是频道格式的问题。我认为最简单的解决方法是在 Conv1D 之前和之后置换轴,以避免channels_first 格式:model.add(Permute([2,1], input_shape=(2,300))model.add(Conv1D(1, kernel_size=(1,), activation'relu'))model.add(Permute([2,1])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2017-07-25
    • 2017-05-21
    相关资源
    最近更新 更多