NameError: имя 'train' не определено - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь завершить эксперимент, в рамках которого программа анализа музыки в нейронной сети создается с использованием Keras, а количество слоев в нейронной сети изменяется, чтобы найти влияние на производительность. Это мой источник для программы.

Ранее я столкнулся с несколькими ошибками в моей программе и, по совету другого разработчика по переполнению стека, я решил обратиться за помощью к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

Спасибо за любую помощь, которую вы можете оказать по этому вопросу.

1 Ответ

0 голосов
/ 27 января 2019

Вы столкнулись с указанной ошибкой, потому что у вас нет массива NumPy с именем train.

Итак, вы сгенерировали ваш набор данных со следующей строкой:

features, labels = generate_features_and_labels()

Но когда вы разбили набор данных на наборы данных train и test, вы сохранили их в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...