Я пытался обучить CNN распознавать жанр.Используя (маленький) набор данных FMA, каждый сегмент песни 30-х годов транслировался в mel-спектрограмму с использованием librosa.В свою очередь, эти спектрограммы были преобразованы в матрицы размером 480x640x3 (высота пикселя, ширина пикселя, значение RGB), которые, в свою очередь, были разделены на три вторых сегмента с перекрытием 50%, в результате чего были получены итоговые входные матрицы размером 480x64x3.Сеть, которую я написал, направлена на копирование сети, описанной в этой статье (https://arxiv.org/pdf/1802.09697.pdf).
). Таким образом, в общей сложности у меня есть 7197 mel-спектрограмм в качестве входных данных, разделенных на 3 с перекрытием, что дает 7197 * 19 = 136743матрицы в качестве входных данных и 800 * 19 = 15200 матриц в качестве тестовых данных. Для изучения сети существует восемь жанров, помеченных 0-7.
При обучении, даже после нескольких эпох, точность все еще снижаетсяна 0,125 (что соответствует чистым догадкам (1/8)). Так что же я делаю не так?
import keras
#from keras.datasets import mnist
from keras.models import load_model
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
#THIS ARCHITECTURE IS TAKEN FROM: https://arxiv.org/pdf/1802.09697.pdf
#3s with 50% overlap
batch_size = 64 #The set of examples used in one iteration (that is, one gradient update) of model training.
num_classes = 8 #1,2,3,4,5,6,7,8
epochs = 20
# input image dimensions
img_rows, img_cols = 480, 64 #480x640 pixlar
# the data, split between train and test sets
(x_train, y_train) = (np.load('x_data_train_3s.npy'), np.load('y_data_train_3s.npy'))
(x_test, y_test) = (np.load('x_data_test_3s.npy'), np.load('y_data_test_3s.npy'))
x_train = x_train.reshape(136743,480,64,3) #this network accepts only 4-dim vector, so we reshape it. the last argument=grayscale. for RGB use 3.
x_test = x_test.reshape(15200,480,64,3)
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
#y_train = y_train -5 #otherwise error in np_utils.py
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
#IMAGE DIMENSIONS
model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), #first layer
activation='relu',
input_shape=(480,64,3)))
model.add(MaxPooling2D(pool_size=(2, 2))) #second layer, pooling
model.add(Conv2D(64, (3, 5), activation='relu')) #third layer
model.add(Dropout(0.25)) #dropout makes sure there is no overfitting, randomly switches of some neurons
model.add(MaxPooling2D(pool_size=(2, 4))) #fifth layer, pooling
model.add(Flatten())
model.add(Dense(128, activation ='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy, #compile the model with cross entropy loss function
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.save('genres.h5')
Как видно из приведенной выше статьи, точность составляет около 0,7, но я получаю только 0,125.Что здесь не так?