Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于Keras的卷积神经网络输入形状_Python_Tensorflow_Neural Network_Keras_Conv Neural Network - Fatal编程技术网

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

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)

我计算了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)
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
将数组形状调整为适当的形状。