使用Keras的卷积神经网络输入形状

2024-03-29 12:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有32760个音频频谱,计算尺寸=72(#帧)x 40(#频带),我试图将其输入到“宽”卷积神经网络(第一层是4个不同转换层的集合)。这些光谱没有深度,因此它们可以表示为72×40二维浮点数数组,因此输入到分类器的x是一个32760个元素的数组,每个元素都是这些72×40×1光谱中的一个。Y输入是一个标签数组,一个热编码,有32760个元素。

当你试着用

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

我得到以下错误:

^{pr2}$

以下是我的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

我做错什么了?有没有更好的方法来表示我的输入数据?我已经尝试过使用pandas数据帧,其中每一行代表一个光谱和无数其他组合。 在后端使用python3.6.5和keras2.1.3以及TensorFlow 1.1.0。

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


更新!根据@enumaris的建议,在输入层上使用data_format=channels_last作为参数,并在最后一个Conv2D和softmax输出层之间添加一个Flatten()层,修复了后一个值错误。现在我开始意识到我的训练数据是错误的。如果我没弄错的话,预期的输入形状应该是(#samples,H,W,#个通道)。mono_X的形状是(32760,),而{}是形状(72,40)。使用numpy的整形似乎无法解压这些嵌套数组。如何正确准备输入张量?


Tags: size错误activationrelupoolc2spectraconv2d
1条回答
网友
1楼 · 发布于 2024-03-29 12:19:51

输入的形状是(72,40,1),但是您说mono_X的元素有一个形状(72,40)。可能在准备mono_X = mono_X.reshape(-1, 72, 40, 1)之类的训练数据时,需要对其进行重塑。这假设mono_X是一个numpy形状数组(#samples,72,40),但由于某些原因,听起来好像您有一个numpy数组。在

也可以按如下方式重塑Keras层:

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

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

相关问题 更多 >