我有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,1),但是您说
mono_X
的元素有一个形状(72,40)。可能在准备mono_X = mono_X.reshape(-1, 72, 40, 1)
之类的训练数据时,需要对其进行重塑。这假设mono_X
是一个numpy形状数组(#samples,72,40),但由于某些原因,听起来好像您有一个numpy数组。在也可以按如下方式重塑Keras层:
就我个人而言,我会在培训前重塑,而不是在模型中,以避免在培训中产生任何额外的开销。在
相关问题 更多 >
编程相关推荐