Я пытаюсь обучить модель CNN для классификации изображений.
Есть девять классов, и у каждого класса есть 1000 изображений.
Вот мой код
model = Sequential()
model.add(Conv2D(32, kernel_size=(5,5), activation='relu',kernel_initializer='random_uniform', input_shape=(128,646,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Conv2D(16, kernel_size=(5,5), activation='relu', input_shape=(64,321,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(16, activation = 'relu',kernel_initializer='normal'))
model.add(Dropout(0.5))
model.add(Dense(9, activation = 'softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Я пробовал это на наборе данных MNIST, и он будет работать
, но на моем наборе данных он всегда предсказывает одно и то же значение.
(True Label выше и предсказывает значение метки снизу)
[[0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0.]]
[[0.11161657 0.11246169 0.11564494 0.11465651 0.11153363 0.10664304
0.11097018 0.11052497 0.10594855]
[0.11161657 0.11246169 0.11564494 0.11465651 0.11153363 0.10664304
0.11097018 0.11052497 0.10594855]
[0.11161657 0.11246169 0.11564494 0.11465651 0.11153363 0.10664304
0.11097018 0.11052497 0.10594855]
[0.11161657 0.11246169 0.11564494 0.11465651 0.11153363 0.10664304
0.11097018 0.11052497 0.10594855]
[0.11161657 0.11246169 0.11564494 0.11465651 0.11153363 0.10664304
0.11097018 0.11052497 0.10594855]]
Кривые точности Кривые потерь
Я пытался изменить инициализатор, оптимизатор, функцию потерь, больше эпох, .. ... по-прежнему ничего не меняется.
Но когда я
1.Установим оба ядра Conv2D на 1
2.Задать 1-ю функцию активации Conv2D на tanh
начало модели предсказывает другое значение для ввода, но производительность не будет.
Я в основном путаюсь с
1. Установка номера ядра в 1 кажется необычной, но по моему опыту это позволяет избежать предсказания то же значение.
2. Все значения входного изображения больше нуля , но установка функции активации на tanh также может изменить результат на разные предсказанные классы?
Кроме того, размер изображения составляет 128 * 646. Каждое значение изображения находится в диапазоне 0 ~ 80
array([[[33.74863434],
[27.84932709],
[22.6257019 ],
...,
[21.47132492],
[19.61938477],
[14.22393227]],
[[16.31633759],
[29.69265747],
[25.40621376],
...,
[28.50727081],
[11.46302605],
[ 4.04836655]],
[[ 9.1305275 ],
[10.00378227],
[28.46733665],
...,
[23.54629517],
[20.91897202],
[ 1.38314819]],
...,
[[63.33175659],
[66.34197998],
[68.40023804],
...,
[73.8707428 ],
[68.64536285],
[67.72910309]],
[[67.61167908],
[67.59188843],
[66.96526337],
...,
[70.63095856],
[74.70448303],
[72.90202332]],
[[71.49047852],
[74.54782104],
[69.39613342],
...,
[80. ],
[80. ],
[80. ]]])
Обновление
Мой набор данных из Free Musi c Архив
Включает аудиоданные трека (.mp3) и метаданные трека (жанр, исполнитель, ...)
Я выбрал небольшую версию (8000 треков) и преобразовал ее в спектрограмму с помощью пакета libROSA.
Так же, как эта ссылка Использование CNN и RNN для Musi c Распознавание жанра
Но я бы хотел сначала попробовать модель CNN.
Спектрограмма, преобразованная пакетом libROSA, имеет размер 128 * 646.
Строковые данные выглядят следующим образом
array([[-65.06227 , -47.759537, -44.17627 , ..., -39.40817 , -41.736862,
-25.19515 ],
[-65.40295 , -52.76098 , -49.17935 , ..., -16.40555 , -16.314035,
-17.56438 ],
[-69.481834, -56.676388, -50.506615, ..., -16.358843, -16.072405,
-18.807785],
...,
[-79.42308 , -59.743004, -36.382896, ..., -46.371193, -42.364635,
-50.037727],
[-80. , -63.419754, -41.73323 , ..., -50.383797, -46.90663 ,
-55.136078],
[-80. , -73.820724, -52.94601 , ..., -63.188026, -56.469948,
-60.473305]], dtype=float32)
Я разделил значение на 80 и рассчитал абсолютное значение для этих спектрограмм как вход модели CNN