如何在 keras 中使用 1D conv 神经网络解决音频信号问题



PS,我更改了我的模型,但它效果不佳(64%(

我有一个数据集(它是给定的,不是问题(。

all_speakers = np.unique([os.path.basename(i).split('_')[1] for i in fsdd])
np.random.shuffle(all_speakers)
train_speakers = all_speakers[:2]
test_speakers = all_speakers[2:]
print("All   speakers:", all_speakers)
print("Train speakers:", train_speakers)
print("Test  speakers:", test_speakers)
train_files = [
i for i in fsdd if os.path.basename(i).split('_')[1] in train_speakers
]
test_files = [i for i in fsdd if i not in train_files]
train = create_audio_dataset(train_files, training=True)
test = create_audio_dataset(test_files, training=False)

结果是:

所有发言者:['尼古拉斯''西奥''杰克逊']

火车扬声器:["尼古拉斯"西奥"]

测试扬声器:["杰克逊"]

目的是创建一个卷积神经网络,并获得超过 90% 的准确率.
我的模型不够好,我不认为这是一个过拟合问题。

model = keras.Sequential()
model.add(keras.layers.Conv1D(64,kernel_size=3,activation='relu',input_shape=(300,40)))
model.add(keras.layers.Conv1D(32,kernel_size=3,activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))  
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'],
)
n_epoch = 12
model.fit(x=train.repeat(n_epoch))
model.evaluate(test)

您应该避免在每个 Conv1D 层之后出现最大池化。最后,maxpooling会破坏信息(它下采样(,这些信息可能是至关重要的,特别是在音频信号中,其分析主要取决于时间相关性。无论如何使用最大池的原因都在 https://stats.stackexchange.com/questions/288261/why-is-max-pooling-necessary-in-convolutional-neural-networks。此外,您还可以将最大池步幅相结合,这是另一个下采样。过多的缩减采样会破坏信息,应避免使用。这同样适用于扁平化(在图像处理中,它会破坏 2D 相关性(,但有时这是必要的。

如果您不固定在 1D 中 https://medium.com/x8-the-ai-community/audio-classification-using-cnn-coding-example-f9cbd272269e 则采用 2D 方法,准确度为 97%。

https://missinglink.ai/guides/keras/keras-conv1d-working-1d-convolutional-neural-networks-keras/是用于音频分析的 1D CNN 的 keras 模型,它仅使用 1 个最大池,没有跨步。

最新更新