用于图像分类的频谱图

Spectrogram for image classification

我目前正在尝试补充论文:https://www.frontiersin.org/articles/10.3389/fneur.2019.00806/full

他们达到了 90% 以上

数据库:https://physionet.org/content/chbmit/1.0.0/

然而,这似乎比我想象的更具挑战性。我使用的数据包括采样率为 256 赫兹的脑电图。

我读过关于癫痫和脑电图,癫痫发作和非癫痫发作之间最明显的区别在于较低的频率,因此我使用 scipy:[=17 实现了低通滤波器=]

我的 windows 由 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% 以上的验证 acc。我尝试越来越多地使用 dropout、数据增强、降低学习率和不同的网络(resnet、inception、vgg16、effiecency net + 我自己的浅层模型)

在训练期间,我对数据进行了欠采样,因此我拥有等量的癫痫发作非癫痫发作数据。我一直在实施一个重叠的 window 函数来生成更多的扣押数据。每个 class.

我有大约 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'))

我的输入好像有问题。 window 中的 1028 个样本对于 FFT 频谱图来说不够吗?

评论里有答案。 Fs、interval 和 overlap_interval 非常重要,它们对你的信号影响很大。与您的低通滤波器相同。我不认为这里的代码有什么问题。你只需要玩弄参数。我什至不认为问题出在 CNN。您需要仔细准备数据。什么是正确的数据预置,我不能告诉你你必须玩数据并找到它。看起来你在大量操纵你的数据,所以要小心不要从原始信号中截断或扭曲信息。代码没问题。