用单个数据测试网络时出现的数组矩阵的格式转换问题

在测试简单的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)的向量,即可带入测试网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值