Почему точность не увеличивается при обучении этой CNN? - PullRequest
1 голос
/ 27 апреля 2019

Я пытался обучить 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.Что здесь не так?

1 Ответ

2 голосов
/ 27 апреля 2019

1. Поскольку ваш набор данных относительно мал. Вы должны были сделать увеличение данных, чтобы достичь лучшего результата. 2. Определение правильного размера партии также является хорошим фактором для лучшего результата. Модель с размером партии 32 и модель с размером партии 64 могут по-разному производить проверку достоверности. 3. Уменьшите параметр регуляризации, также полезный для получения лучшего результата.

У вас есть 5 объединенных слоев размером 64 изображения в 3 * 3 размера: первый слой пула 21 * 21 * 64 пятый слой пула - это 64 изображения в 2 * 4

Это довольно много объединяет. Попробуйте 5 * 5 слоев конвоя, максимальный пул в 2 * 2 блоках, а затем выпадают до полностью связанного слоя Если упомянутые шаги не улучшают ваш результат, перейдите к библиотеке глубокого обучения с высокоуровневым API для Tensorflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...