我正在尝试完成一个实验,其中使用Keras创建神经网络音乐分析程序,并修改神经网络中的层数以找到对性能的影响。这是我的程序来源。
我以前在我的程序中遇到了几个错误,根据另一位开发人员对 Stack Overflow 的建议,我决定寻求sklearn
库部分的帮助。
这是我正在使用的代码:
import librosa
import librosa.feature
import librosa.display
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
from sklearn.model_selection import train_test_split,
StratifiedShuffleSplit, StratifiedKFold
def display_mfcc(song):
y, _ = librosa.load(song)
mfcc = librosa.feature.mfcc(y)
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfcc, x_axis='time', y_axis='mel')
plt.colorbar()
plt.title(song)
plt.tight_layout()
plt.show()
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]
def generate_features_and_labels():
all_features = []
all_labels = []
genres = ['blues', 'classical', 'country', 'disco', 'hiphop',
'jazz', 'metal', 'pop', 'reggae', 'rock']
for genre in genres:
sound_files = glob.glob('genres/'+genre+'/*.au')
print('Processing %d songs in %s genre...' %
(len(sound_files), genre))
for f in sound_files:
features = extract_features_song(f)
all_features.append(features)
all_labels.append(genre)
label_uniq_ids, label_row_ids = np.unique(all_labels,
return_inverse=True)
label_row_ids = label_row_ids.astype(np.int32, copy=False)
onehot_labels = to_categorical(label_row_ids,
len(label_uniq_ids))
return np.stack(all_features), onehot_labels
features, labels = generate_features_and_labels()
print(np.shape(features))
print(np.shape(labels))
training_split = 0.8
alldata = np.column_stack((features, labels))
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.20,
random_state=37)
for train_index, test_index in sss.split(X, y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print(np.shape(train))
print(np.shape(test))
train_input = test[:,:-10]
train_labels = train[:,-10:]
test_input = test[:,:-10]
test_labels = test[:,-10:]
print(np.shape(train_input))
print(np.shape(train_labels))
model = Sequential([
Dense(100, input_dim=np.shape(train_input)[1]),
Activation('relu'),
Dense(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)
loss, acc = model.evaluate(test_input, test_labels, batch_size=32)
print('Done!')
print('Loss: %.4f, accuracy: %.4f' % (loss, acc))
Python开始打印预期的响应:
Using TensorFlow backend.
Processing 100 songs in blues genre...
Processing 100 songs in classical genre...
Processing 100 songs in country genre...
Processing 100 songs in disco genre...
Processing 100 songs in hiphop genre...
Processing 100 songs in jazz genre...
Processing 100 songs in metal genre...
Processing 100 songs in pop genre...
Processing 100 songs in reggae genre...
Processing 100 songs in rock genre...
(1000, 25000)
(1000, 10)
但这被一条错误消息打断了:
Traceback (most recent call last):
File "/Users/surengrigorian/Documents/Stage1.py", line 70, in <module>
print(np.shape(train))
NameError: name 'train' is not defined
感谢您就此事提供的任何帮助。
您遇到上述错误是因为您没有名为 train
的 NumPy 数组。
因此,您使用以下行生成了数据集:
features, labels = generate_features_and_labels()
但是,将数据集分区为训练数据集和测试数据集时,将它们存储在以下代码片段中的X_train, X_test
和y_train, y_test
中。
for train_index, test_index in sss.split(X, y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
此外,上述数组将不包含任何内容,因为它们前面的行,
alldata = np.column_stack((features, labels))
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.20,
random_state=37)
表示您将数据集打包在 alldata
中,但您实际使用 StratifiedShuffleSplit
拆分的数据是X
和y
的——其中您也没有数组X
开始。
鉴于此,您可以通过以下方式拆分它们:
for train_index, test_index in sss.split(features, labels):
x_train, x_test = features[train_index], features[test_index]
y_train, y_test = labels[train_index], labels[test_index]
然后,如果需要,可以通过以下方式检查它们的形状
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)