Спектрограмма для классификации изображений

#python #tensorflow #machine-learning #keras #deep-learning

Вопрос:

В настоящее время я пытаюсь воспроизвести статью: https://www.frontiersin.org/articles/10.3389/fneur.2019.00806/full

Они достигают более 90% acc

База данных: https://physionet.org/content/chbmit/1.0.0/

Однако это кажется более сложным, чем я думал. Данные, которые я использую, состоят из ЭЭГ с частотой дискретизации 256 Гц.

Я читал, что при эпилепсии и ЭЭГ наиболее очевидная разница между припадком и отсутствием припадка обнаруживается на более низких частотах, поэтому я реализовал фильтр низких частот с использованием scipy:

введите описание изображения здесь

Мои окна состоят из 4 секунд данных = 4*256 = образцов. Ниже у меня есть необработанные данные и когда применяется фильтр:

введите описание изображения здесь

Я перепробовал множество различных конфигураций для создания своих спектрограмм для cnn (это последняя версия).:

 Fs = 256
interval = 128   # ... the interval size,
overlap = interval * 0.95  # ... and the overlap intervals

import matplotlib.colors as colors
from scipy.stats import lognorm
#plt.ylim(0, 10)
f, t, Sxx = signal.spectrogram(
    np.array(filtered),                # Provide the signal,
    fs=Fs,                # ... the sampling frequency,
    nperseg=interval,
    noverlap=overlap, mode='psd')

#Sxx = 10 * np.log10(Sxx)
normalize_color= colors.LogNorm(vmin=np.amin(Sxx), vmax=np.amax(Sxx))
                          # ... the number of samples to overlap,
plt.pcolormesh(t, f, Sxx, norm=normalize_color,
            cmap='jet')# Plot the result
 

что выводит следующее (что-то странное происходит на самых высоких частотах):

введите описание изображения здесь

Моя проблема заключается в том, что, когда я использую эти различные спектрограммы в качестве входных данных, я не могу достичь показателя проверки выше 50-60%. Я все чаще пытался использовать отсев, увеличение объема данных, снижение скорости обучения и различные сети (resnet, inception, vgg16, эффективная сеть моя собственная неглубокая модель)

Во время обучения я занижаю свои данные, поэтому у меня есть равное количество данных о захвате, не связанных с захватом. Я реализовал функцию перекрывающегося окна для создания большего количества данных о захвате. У меня есть около 2000 изображений каждого класса.

Вот мой обычай cnn:

 model = Sequential()

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(299,299,3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(3, activation='softmax'))
 

Похоже, что-то не так с моим вкладом. Разве 1028 образцов в окне недостаточно для спектрограмм БПФ?

Комментарии:

1. Почему вы думаете, что что-то не так с вашим кодом?

2. Также, почему вы используете Conv2D, когда ваш сигнал равен 1D?

3. Я пытаюсь воспроизвести ту статью, о которой упоминал в начале. Я преобразую данные сигнала в изображения с помощью FFT. Однако я не нахожусь там, где рядом с acc упоминаются авторы этой статьи…

4. Fs, интервал и overlap_interval очень важны, они сильно влияют на ваш сигнал . То же самое с вашим фильтром нижних частот. Я не думаю, что здесь что-то не так с кодом. Вам просто нужно поиграть с параметрами. Я даже не думаю, что проблема в Си-эн-эн. Вам нужно тщательно подготовить данные. Каковы правильные данные, я не могу сказать вам, что вы должны играть с данными и находить их. Похоже, что вы сильно манипулируете своими данными, поэтому будьте осторожны, чтобы не прерывать или не искажать информацию из исходного сигнала. Код в порядке.

5. Также имейте в виду, что статья может быть сомнительной и содержать ложные утверждения. Я видел статьи, в которых сообщается о чрезвычайно высокой точности выбранных данных, но они не упоминают об этом. Они просто пытаются казаться потрясающими. Некоторые люди хранят только те данные, которые позволяют их методу хорошо работать. Не доверяйте этому слепо.

Ответ №1:

В комментариях содержится ответ. he Fs, интервал и overlap_interval очень важны, они сильно влияют на ваш сигнал . То же самое с вашим фильтром нижних частот. Я не думаю, что здесь что-то не так с кодом. Вам просто нужно поиграть с параметрами. Я даже не думаю, что проблема в Си-эн-эн. Вам нужно тщательно подготовить данные. Каковы правильные данные, я не могу сказать вам, что вы должны играть с данными и находить их. Похоже, что вы сильно манипулируете своими данными, поэтому будьте осторожны, чтобы не прерывать или не искажать информацию из исходного сигнала. Код в порядке.