期望dense_3_input具有形状(无,40)但是具有形状的数组(40,1)

时间:2018-01-13 02:47:50

标签: python audio machine-learning neural-network keras

我是Deep Learning的初学者,我正试图通过对数据集执行音频分析来练习Python中的神经网络。我一直在关注Urban Sound Challenge教程并完成了训练模型的代码,但是在尝试在测试集上运行模型时,我一直遇到错误。

以下是我创建模型和培训的代码:

import numpy as np
from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten

num_labels = y.shape[1]
filter_size = 2

model = Sequential()

model.add(Dense(256, input_shape = (40,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_labels))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
model.fit(X, y, batch_size=32, epochs=40, validation_data=(val_X, val_Y))

在拟合模型之前运行model.summary()给我:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_3 (Dense)              (None, 256)               10496     
_________________________________________________________________
activation_3 (Activation)    (None, 256)               0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 10)                2570      
_________________________________________________________________
activation_4 (Activation)    (None, 10)                0         
=================================================================
Total params: 13,066
Trainable params: 13,066
Non-trainable params: 0
_________________________________________________________________

在拟合模型后,我尝试在一个文件上运行它,以便它可以对声音进行分类。

file_name = ".../UrbanSoundClassifier/test/Test/5.wav"
test_X, sample_rate = librosa.load(file_name,res_type='kaiser_fast')
mfccs = np.mean(librosa.feature.mfcc(y=test_X, sr=sample_rate, n_mfcc=40).T,axis=0)
test_X = np.array(mfccs)
print(model.predict(test_X))

然而,我得到了

ValueError: Error when checking : expected dense_3_input to have shape  

(无,40)但是得到了具有形状的阵列(40,1)

有人愿意指出我应该如何测试模型的正确方向吗?我不知道model.predict()的输入应该是什么。

可以找到完整代码here

1 个答案:

答案 0 :(得分:1)

所以:

  1. 最简单的解决方法就是重塑test_x

    test_x = test_x.reshape((1, 40))
    
  2. 更复杂的是重用您拥有的管道来为测试集创建trainvalid集合。请注意,在test的情况下,您应用于数据文件的过程完全不同。我创建了一个测试数据框:

    test_dataframe = pd.DataFrame({'filename': ["here path to test file"]}
    

    然后重用现有管道来创建验证集。