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

keras中一维卷积网络的输入维数

李鸿
2023-03-14

真的很难理解keras中卷积1d层的输入维度:

输入形状

带形状的三维张量:(采样、步长、input\u dim)。

输出形状

带形状的三维张量:(采样、新的\u步骤、nb\u过滤器)。由于填充,步骤值可能已更改。

我希望我的网络接受价格的时间序列(101,按顺序)并输出4个概率。我当前的非卷积网络做得相当好(训练集为28000)如下所示:

standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))

为了改进这一点,我想从具有长度为10的局部感受野的输入层制作一个特征图。(因此有10个共享权重和1个共享偏差)。然后我想使用max pooling并将其输入到一个由40个左右神经元组成的隐藏层中,然后用外层有softmax的4个神经元输出。

图片(这是相当可怕的抱歉!)

因此理想情况下,卷积层将采用二维张量:

(minibatch\u大小,101)

并输出三维尺寸张量

(minibatch\u大小,91,没有\u个功能图)

然而,keras层似乎需要输入一个称为步骤的维度。我试着理解这一点,但还是不太明白。在我的例子中,步骤应该是1吗?因为向量中的每一步都是时间增加1?另外,什么是new\u步骤?

此外,如何将池层(3d张量)的输出以2d张量的形式转换为适用于标准隐藏层(即密集keras层)的输入?

更新:在给出了非常有用的建议之后,我尝试制作一个卷积网络,如下所示:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))

行conv.Add(Flatten())引发范围超出有效边界错误。有趣的是,此错误不仅仅针对以下代码:

conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())

正在执行

print conv.input_shape
print conv.output_shape

结果在

(None, 1, 101
(None, -256)

正在返回

更新2:

改变了

conv.add(Convolution1D(64, 10, input_shape=(1,101)))

conv.add(Convolution1D(10, 10, input_shape=(101,1))

它开始工作了。然而,将(None,101,1)输入到1d conv层或(None,1,101)输入到我应该知道的层之间有什么重要的区别吗?为什么(无,1101)不起作用?

共有1个答案

松安民
2023-03-14

之所以看起来像这样,是因为Keras设计师打算将一维卷积框架解释为处理序列的框架。为了充分理解差异——试着想象你有一个由多个特征向量组成的序列。然后你的输出将至少是二维的——其中第一个维度与时间相连,其他维度与特征相连。一维卷积框架旨在以某种方式大胆地处理这个时间维度,并试图找到数据中重复出现的模式——而不是执行经典的多维卷积变换。

在您的情况下,您必须简单地重塑数据以具有形状(dataset\u size,101,1),因为您只有一个特征。可以使用numpy轻松完成。重塑功能。要理解一个新步骤意味着什么,您必须理解您正在随着时间的推移进行卷积,因此您更改了数据的时间结构,这将导致新的时间连接结构。为了将数据转换为适合密集/静态层的格式,请使用keras。图层。展平层-与经典卷积情况相同。

更新:正如我之前提到的——输入的第一个维度与时间有关。所以(1,101)(101,1)之间的区别在于,在第一种情况下,您有一个带有101个特征的时间步长,在第二种情况下-101个带有1个特征的时间步长。您在第一次更改后提到的问题源于在此类输入上使用大小为2的池化。只有一个时间步长——您无法在大小为2的时间窗口上汇集任何值——仅仅是因为没有足够的时间步长来做到这一点。

 类似资料:
  • 我在使用Keras和Python对3D形状进行分类时遇到了一个问题。我有一个文件夹,里面有一些JSON格式的模型。我将这些模型读入Numpy数组。模型是25*25*25,表示体素化模型的占用网格(每个位置表示位置(i、j、k)中的体素是否有点),因此我只有1个输入通道,就像2D图像中的灰度图像一样。我拥有的代码如下: 在此之后,我得到以下错误 使用TensorFlow后端。回溯(最后一次调用):文

  • 我正在尝试为数字数据集构建1D CNN。我的数据集有520行和13个特征。下面是代码。 它给出了“ValueError:layer sequential\u 21的输入0与layer不兼容::expected min\u ndim=3,found ndim=2。接收到的完整形状:(1,13)”错误。 我需要如何设置输入形状,还是必须重塑X\U列?非常感谢您的帮助。

  • 我正在试图理解卷积神经网络中的维度是如何表现的。在下图中,输入为带1个通道的28乘28矩阵。然后是32个5乘5的过滤器(高度和宽度步幅为2)。所以我理解结果是14乘14乘32。但是在下一个卷积层中,我们有64个5×5的滤波器(同样是步幅2)。那么为什么结果是7乘7乘64而不是7乘7乘32*64呢?我们不是将64个滤波器中的每一个应用于32个通道中的每一个吗?

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

  • 我正在关注TensorFlow的“专家深度列表”教程:https://www.tensorflow.org/tutorials/mnist/pros/ 第二卷积层具有形状【5、5、32、64】;也就是说,它有32个输入,而第一个卷积层有1个输入(该输入是我了解原始图像的灰度值)。 第二个卷积层有32个输入通道意味着什么?这是否意味着在第二层中学习的64个过滤器将全部应用(移位)到每像素具有32个点

  • 我正在制作这个CNN模型 ''' 但这是给我一个错误:-InvalidArgumentError:负尺寸造成的减去2从1'{{nodeconv2d_115/Conv2D}}=Conv2D[T=DT_FLOAT,data_format="NHWC",膨胀=[1,1,1,1],explicit_paddings=[],填充="VALID",步幅=[1,2,2,1],use_cudnn_on_gpu=t