在测试简单的Keras框架下的神经网络用的是model.predict_classes(),里面输入的应是你想要测试使用的数据,但输入单个测试数据时会出错,因为我们得到的特征是数组list形式,代码如下:
import librosa
import librosa.display
import librosa.feature
import glob
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense,Activation
from keras.utils.np_utils import to_categorical
test_file="E:\\Chrome\\97612__reaktorplayer__blues-4 (1).wav"
def extract_features_song(f):
y, _ = librosa.load(f)
mfcc = librosa.feature.mfcc(y)
mfcc /= np.amax(np.absolute(mfcc)) # 这个的用法是,把每个元素都取最大值,最后组成一个数组,正则化是输出的值在负一到正一之间
return np.ndarray.flatten(mfcc)[:25000]
features=np.loadtxt("E:\\TensorFlow\\dataset\\music.txt")
labels=np.loadtxt("E:\\TensorFlow\\dataset\\labels.txt")
print (np.shape(features))
print (np.shape(labels))
train_split=0.8
alldata=np.column_stack((features,labels))
#np.random(alldata)
np.random.shuffle(alldata)
splitidx=int(len(alldata)*train_split)
train,test=alldata[:splitidx,:],alldata[splitidx:,:]
print(np.shape(train))
print(np.shape(test))
#下面这两步是因为我这里shuffle了alldata里包括的25000的特征和每个样本的十个标签
#所以我这里的train是(800:25010)多了十个,其中最后十个是标签,前面25000是每种的特征
#所以用这种方式把输入和标签重新分出来
train_input=train[:,:-10]
train_labels=train[:,-10:]
test_labels=test[:,-10:]
test_input=test[:,:-10]
print(np.shape(train_labels))
print(np.shape(train_input))
#开始构建网络
model=Sequential([Dense(1000,input_dim=np.shape(train_input)[1]),#这里输入的是dense,及第一层网络的神经元的个数,这里我们设置100个神经元的dense layer,这里input_dim是与第一层输出的100相对应的特征个数,所以我们用np.shape(train_input)[1]其值即为25000,然后这25000个输入特征连接至100个神经元
Activation('relu'),#这里表示其激活方式是小于零的变为零,大于零的为本省
Dense(10),#这里连接到第二层输出层,输出层是10个神经元,因为是独热表示方式,十个种类对应十个输出神经元
Activation('softmax'),])#对输出进行规范化
model.compile(optimizer='adam',loss='categorical_crossentropy',
metrics=['accuracy'])
print(model.summary())
model.fit(train_input,train_labels,epochs=10,batch_size=32,validation_split=0.2)
model.save("E:\\TensorFlow\\model.h5")
loss,acc=model.evaluate(test_input,test_labels,batch_size=32)
print("done")
print("Loss:%.4f,accuracy:%.4f"%(loss,acc))
test_features=extract_features_song(test_file)
test_features=test_features[:24998]
test_features=np.mat(test_features)
print(model.predict_classes(test_features))
可以发现最后test——features是在获取到测试数据的特征之后又加了一个转换为矩阵的过程,如果不加,会报错:
ValueError: Error when checking input: expected dense_1_input to have shape (24998,) but got array with shape (1,)
然后我们来看一下这里加了mat转矩阵前后的test_features的类型和具体数值的变化情况
test_features=test_features[:24998]
print(type(test_features))
print(test_features)
print(np.shape(test_features))
test_features=np.mat(test_features)
print(type(test_features))
print(test_features)
print(np.shape(test_features))
print(model.predict_classes(test_features))
下面这个是结果:
<class ‘numpy.ndarray’>
[-0.36864332 -0.4096052 -0.5551554 … 0.0123002 0.01176927
0.0189673 ]
(24998,)
<class ‘numpy.matrix’>
[[-0.36864332 -0.4096052 -0.5551554 … 0.0123002 0.01176927
0.0189673 ]]
(1, 24998)
发现转换完后原来(24998,)的数组变成了(1,24998)的向量,即可带入测试网络