Recently, I have attempted to complete an experiment where a neural network algorithm identifies the composer of a piece of classical music. I am. however, basing this experiment on a previous project, whereby a neural network is created using the Keras system and analyses the respective pieces of music. My source is this article:
After conducting various tests where the program performed as expected, I have recently encountered another error. When I attempted to run the program provided in the article:
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils.np_utils import to_categorical
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))
np.random.shuffle(alldata)
splitidx = int(len(alldata) * training_split)
train, test = alldata[:splitidx,:], alldata[splitidx:,:]
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, along with these expected results:
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)
(800, 25010)
(200, 25010)
(200, 25000)
(800,)
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 100) 2500100
_________________________________________________________________
activation_1 (Activation) (None, 100) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 1010
_________________________________________________________________
activation_2 (Activation) (None, 10) 0
=================================================================
Total params: 2,501,110
Trainable params: 2,501,110
Non-trainable params: 0
_________________________________________________________________
Gave an error message:
Traceback (most recent call last):
File "/Users/surengrigorian/Documents/Stage1.py", line 88, in
<module>
validation_split=0.2)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
batch_size=batch_size)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
exception_prefix='target')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
str(data_shape))
ValueError: Error when checking target: expected activation_2 to have shape (10,) but got array with shape (1,)
You have done a mistake while splitting data at this point:
train_input = test[:,:-10] <<======
train_labels = train[:,-10] <<=====
test_input = test[:,:-10]
test_labels = test[:,-10]
Try this:
train_input = train[:,:-10] <<======
train_labels = train[:,-10:] <<=====
test_input = test[:,:-10]
test_labels = test[:,-10:]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.