Модель CNN предсказывает одно и то же значение в большинстве случаев - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь обучить модель 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

...