Я скачал данные UrbanSound по ссылке [1]. В нем около 8732 звуковых файлов, разделенных на 10 сгибов. В инструкциях по ссылке предлагается тренировать модель на предопределенных 9 сгибах, тестировать на оставшемся сгибе и повторять процесс 10 раз, каждый раз тестируя на разных сгибах.
Я выделил 11 других функций (например, скорости пересечения нуля, энергии и т. д.) и 40 функций MFCC из каждого файла, как это сделали многие другие [2] [3]. Вот фрагмент кода:
'' '
# Approach 1 of splitting the data
# 'fold' names what fold (from 1-10) will be used for testing. All other folds will be used for training. For, e.g., train_fold1 represnt features extracted from nine folds: fold2 to fold10, and test_fold1 has features from fold1.
df_train = pd.read_csv('G:\\AudioFiles\\UrbanSound8K\\train_{}.csv'.format(fold, index = False))
df_train.fillna(0, inplace = True)
df_train.dropna(inplace = True)
df_train = df_train.iloc[:,:-1]
df_train = pd.get_dummies(df_train) # one-hot-encoding class variables
X_train = df_train.iloc[:, 12:-10] # taking only 40 MFCC features
y_train = df_train.iloc[:, -10:]
df_test = pd.read_csv('G:\\AudioFiles\\UrbanSound8K\\test_{}.csv'.format(fold, index_col = 0))
df_test = df_test.iloc[:,:-1]
df_test.dropna(inplace = True)
df_test = pd.get_dummies(df_test) # one-hot-encoding class variables
X_test = df_test.iloc[:, 12:-10] # taking only 40 MFCC features
y_test = df_test.iloc[:, -10:]
# Approach 2 of splitting the data
df = pd.concat([df_train, df_test])
df.dropna(inplace = True)
df = pd.get_dummies(df)
X,y = df.iloc[:, 12:-10].values, df.iloc[:, -10:].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state=13)
' ''
Моя проблема в том, что я получаю очень разные результаты для обоих подходов. Подход 2 дает точность 90-95% на тренировочном наборе и> 90% на тестовом наборе. Когда я использую подход 1, максимальная точность обучения 70-90%, но точность теста составляет всего 50-60%.
Я установил почти все классификаторы (LR, SVC, KNN) и простую нейтральную сеть из двух- три плотных слоя на обоих подходах разделения данных на наборы тест-поезд. Все классификаторы показывают поразительно схожую разницу в точности при обоих подходах.
'' '
# I tried fitting each of these one by one.
clf = LogisticRegression(solver='lbfgs')
#clf = SVC()
#clf = KNeighborsClassifier()
#clf = LinearDiscriminantAnalysis()
#clf = GaussianNB()
clf.fit(X_train,y_train)
print(clf.score(X_train, y_train))
print(clf.score(X_test, y_test))
# code for neural network
model = Sequential()
model.add(Dense(256, activation='relu', input_dim=40))
model.add(Dropout(0.2))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
# Compile the model
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
num_epochs = 50
num_batch_size = 32
model.fit(X_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test, y_test), verbose=1)
' ''
Я не могу понять, почему я получаю такую разницу. Я не вижу ошибок в подгонке модели, так как мой процесс подбора довольно прост и понятен. Я использовал только настройки по умолчанию по большей части. Если я делаю некоторые другие ошибки, то же самое для обоих подходов.
Итак, это должно быть как-то связано с разделением поезда-теста. Случайная перетасовка дает гораздо лучший результат, чем предопределенные деления сгиба. Я пробовал долю теста 10-20% с другим начальным значением, но результаты все еще те же.
Ссылки
[1] https://urbansounddataset.weebly.com/urbansound8k.html
[2]https://medium.com/gradientcrescent/urban-sound-classification-using-convolutional-neural-networks-with-keras-theory-and-486e92785df4
[3] https://medium.com/@mikesmales/sound-classification-using-deep-learning-8bc2aa1990b7