当前位置: 首页 > 知识库问答 >
问题:

使用keras在2D数据上的一维卷积输出的形状

程彭祖
2023-03-14

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

我的数据由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)执行一些操作之王,我不知道正在执行哪个操作。我这么说是因为我解释为一维卷积的是必须保留特征形状,因为我只是在卷积时域:如果我有9个特征,那么对于每个过滤器,我有9个卷积核,每个都应用于不同的特征并在时间轴上卷积。这应该为每个过滤器返回9个卷积特征,导致输出形状为119,9*100。但是输出形状是119,100。

很明显,还有其他事情正在发生,我无法理解或理解。

我的推理在哪里失败了?1d卷积是如何执行的?

我再补充一点,这是我对所提供答案之一的评论:

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

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

,那么输出维度将是(无,119,1),卷积后只产生一个特征。这个维度发生了什么,从9开始执行哪个操作——

共有2个答案

赵锐
2023-03-14

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

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)

Y:

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

现在您可以很容易地看到,x的和的前3个值的和是卷积的第一个值,我使用了3的内核大小来简化验证

赵禄
2023-03-14

Conv1D需要3D张量来输入形状(batch\u size,time\u step,feature)。根据您的代码,过滤器大小为100,这意味着过滤器已从9维转换为100维。这是怎么发生的?Dot产品。

在上面,X\u ik字的串联(k=内核大小),l是过滤器的数量(l=过滤器),d是输入字向量的维数,而p\u ik字的每个窗口的输出向量。

你的代码中发生了什么?

[n_features*9]dot[n_features*9]=

对所有序列执行上述操作=

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

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

 类似资料:
  • 真的很难理解keras中卷积1d层的输入维度: 输入形状 带形状的三维张量:(采样、步长、input\u dim)。 输出形状 带形状的三维张量:(采样、新的\u步骤、nb\u过滤器)。由于填充,步骤值可能已更改。 我希望我的网络接受价格的时间序列(101,按顺序)并输出4个概率。我当前的非卷积网络做得相当好(训练集为28000)如下所示: 为了改进这一点,我想从具有长度为10的局部感受野的输入层

  • 我正在尝试创建一维卷积模型,但我似乎无法获得正确的输入形状。以下是我所拥有的: 我收到以下错误: 有人有什么建议吗?

  • 我在Keras建立了一个卷积神经网络。 根据CS231讲座,卷积操作为每个过滤器创建一个特征映射(即激活映射),然后将其堆叠在一起。在我的例子中,卷积层有一个300维的输入。因此,我预计会进行以下计算: 每个过滤器的窗口大小为5。因此,每个滤波器产生300-5 1=296个卷积 但是,实际输出形状看起来不同: 偏移值的形状很有意义,因为每个过滤器都有一个偏移值。然而,我不了解重量的形状。显然,第一

  • 我在一维输入信号上实现了一个具有批量归一化的卷积神经网络。我的模型有一个相当好的精度约80%。以下是我的图层顺序:(Conv1D,Batch,ReLU,MaxPooling)重复6次,Conv1D,Batch,ReLU,Dense,Softmax。 我看过几篇文章说我不应该在卷积层上使用dropout,而是应该使用批处理规范化,所以我想通过用dropout层替换所有批处理规范化层来试验我的模型,看

  • 我一直在研究一个简单的卷积神经网络模型,但输出似乎与我想要的形状不匹配。 所以我的输入大小似乎不是问题。我的训练集输入形状是(13630, 200, 4, 1)其中13630是数据的数量,而我的training_label如下。(13630,2)我期望模型输出形状是(2,),但它似乎期望(1,)作为输出大小。 所以我的错误是这样的。 检查目标时出错:预期稠密_28具有形状(1),但获得具有形状(2

  • 我有32760个音频频谱,计算维度=72(#帧)x 40(#频段),我试图将其输入“宽”卷积神经网络(第一层是4个不同conv层的合奏)。这些频谱没有深度,因此它们可以表示为72 x 40 2D数字浮点数组,因此分类器的X输入是一个32760个元素长的数组,每个元素都是这些72 x 40 x 1频谱之一。Y输入是一个标签数组,一个热编码,有32760个元素。 当尝试使用 我得到以下错误: 以下是我