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

基于Keras的卷积神经网络输入形状

隗星驰
2023-03-14

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

当尝试使用

model.fit(mono_X, mono_Y, epochs=10, batch_size=None, verbose=2)

我得到以下错误:

ValueError when checking input: expected input_47 to have 4 dimensions, but got array with shape (32760, 1)

以下是我的CNN的架构

spectra = Input(shape=(72, 40, 1)) 

# conv1a
c1a = Conv2D(48, (3,5), activation='relu', padding = 'same')(spectra)
c1a = BatchNormalization()(c1a)
c1a = MaxPooling2D(pool_size=(5, 5), strides = 1)(c1a)
# conv1b
c1b = Conv2D(32, (3,9), activation='relu', padding = 'same')(spectra)
c1b = BatchNormalization()(c1b)
c1b = MaxPooling2D(pool_size=(5, 5), strides = 1)(c1b)
# conv1c
c1c = Conv2D(16, (3,15), activation='relu', padding = 'same')(spectra)
c1c = BatchNormalization()(c1c)
c1c = MaxPooling2D(pool_size=(5, 5), strides = 1)(c1c)
# conv1d
c1d = Conv2D(16, (3,21), activation='relu', padding = 'same')(spectra)
c1d = BatchNormalization()(c1d)
c1d = MaxPooling2D(pool_size=(5, 5), strides = 1)(c1d)

# stack the layers
merged = keras.layers.concatenate([c1a, c1b, c1c, c1d], axis=3)

# conv2
c2 = Conv2D(224, (5,5), activation='relu')(merged)
c2 = BatchNormalization()(c2)
c2 = MaxPooling2D(pool_size=(5, 5), strides = 1)(c2)

# output softmax
out = Dense(15, activation='softmax')(c2)

# create Model
model = Model(spectra, out)

# apply optimization and loss function
adam = Adam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(optimizer=adam,
            loss='categorical_crossentropy',
            metrics=['accuracy'])

但是,如果我尝试将输入形状更改为32760x1,我会收到以下错误:

ValueError: Input 0 is incompatible with layer conv2d_203: expected ndim=4, found ndim=3

我做错了什么?有没有更好的方法来表示我的输入数据?我已经尝试使用熊猫数据帧,其中每一行代表一个光谱和无数其他组合。在后端使用Python 3.6.5和Keras 2.1.3以及TensorFlow 1.1.0。

这是我第一次使用CNN,之前我只使用Keras实现了ANN,所以我可能犯了一个非常明显的错误。感谢您的帮助!

使现代化根据@enumaris的建议,在输入层上使用data\u format=channels\u last作为参数,并在最后一个Conv2D和softmax输出层之间添加一个Flatten()层,修复了后一个值错误。现在我意识到我的训练数据mono\u X的形状不对。如果我没有弄错的话,预期的输入形状应该是(#samples,H,W,#channels)mono\u X为形状(32760,),而mono\u X[0]为形状(72,40)。使用numpy的重塑似乎无法解压缩这些嵌套数组。如何正确准备输入张量?

共有1个答案

谢墨竹
2023-03-14

输入形状是(72,40,1),但您可以说mono\u X的元素有一个形状(72,40)。可能在准备训练数据时需要对其进行整形,如:mono\u X=mono\u X。整形(-1,72,40,1)。这假设mono\u X是一个numpy形状数组(#samples,72,40),但出于某种原因,听起来像是一个numpy数组。

您还可以像这样重塑Keras层:

spectra = Input(shape=(72, 40))
spectra = Reshape((72, 40, 1))(spectra)

就个人而言,我会在训练前而不是在模型中进行重塑,以避免训练中的任何额外开销。

 类似资料:
  • 我正在尝试创建一个CNN来对数据进行分类。我的数据是X[N\u数据,N\u特征]我想创建一个能够对其进行分类的神经网络。我的问题是关于keras后端Conv1D的输入形状。 我想在上面重复一个过滤器。。假设有10个特征,然后为接下来的10个特征保持相同的权重。对于每个数据,我的卷积层将创建N\U特征/10个新神经元。我该怎么做?我应该在input\u形状中放置什么? 有什么建议吗?非常感谢。

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

  • 注意: 本教程适用于对Tensorflow有丰富经验的用户,并假定用户有机器学习相关领域的专业知识和经验。 概述 对CIFAR-10 数据集的分类是机器学习中一个公开的基准测试问题,其任务是对一组大小为32x32的RGB图像进行分类,这些图像涵盖了10个类别: 飞机, 汽车, 鸟, 猫, 鹿, 狗, 青蛙, 马, 船以及卡车。 想了解更多信息请参考CIFAR-10 page,以及Alex Kriz

  • 卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络