NameError: name 'train' is not defined

NameError: name 'train' is not defined

我正在尝试完成一项实验,即使用 Keras 创建神经网络音乐分析程序,并修改神经网络中的层数以找出对性能的影响。 This is my source 为程序。

我之前在我的程序中遇到过几个错误,根据 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_testy_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 拆分的数据是 Xy - 其中您也这样做没有数组 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)