Python 基于Keras的卷积神经网络输入形状
我计算了32760个音频频谱,其尺寸=72(#帧)x 40(#频带),我试图将其输入“宽”卷积神经网络(第一层是4个不同conv层的集合)。这些光谱没有深度,因此它们可以表示为72 x 40 2D浮点数组,因此输入到分类器的x是32760个元素长的数组,每个元素是这些72 x 40 x 1光谱中的一个。Y输入是一个标签数组,一个热编码,包含32760个元素 当尝试使用Python 基于Keras的卷积神经网络输入形状,python,tensorflow,neural-network,keras,conv-neural-network,Python,Tensorflow,Neural Network,Keras,Conv Neural Network,我计算了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)
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)
ValueError: Input 0 is incompatible with layer conv2d_203: expected ndim=4, found ndim=3
以下是我的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 when checking input: expected input_47 to have 4 dimensions, but got array with shape (32760, 1)
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输出层之间添加flatte()
层,修复了后一个值错误。现在我意识到我的训练数据的形状不对。如果我没有弄错的话,预期的输入形状应该是(#samples,H,W,#channels)mono_X
具有形状(32760,),而mono_X[0]
具有形状(72,40)。使用numpy的重塑似乎无法解压缩这些嵌套数组。如何正确准备输入张量?输入形状是(72,40,1),但您可以说mono\u X
的元素有一个形状(72,40)。可能在准备训练数据时需要对其进行整形,如mono_X=mono_X.restrape(-1,72,40,1)
。这假设mono_X
是一个形状的numpy数组(#samples,72,40),但出于某种原因,听起来像是一个numpy数组
也可以按如下方式重塑Keras层:
spectra = Input(shape=(72, 40))
spectra = Reshape((72, 40, 1))(spectra)
就我个人而言,我会在训练前进行重塑,而不是在模型中进行重塑,以避免训练中的任何额外开销。mono_X的形状是什么?确保它的顺序是
(num\u samples,H,W,C)
如果你有data\u format=channels\u last
mono\u X是形状(32760,)并且是一个numpy。ndarray,数组的每个元素都是一个2D数组(72,40,1)。有没有更好的方法向CNN展示这些数据?你应该制作形状(32760,72,40,1)
。确保1的最后一个形状在那里。就神经网络而言,形状(32760,72,40,1)
和(32760,72,40)
之间存在差异。您可以使用np.reformate
将数组形状调整为适当的形状。