在Keras中使用Conv1D处理长音频信号

cha*_*ies 3 audio convolution neural-network keras keras-layer

我的音频信号很长x,是100000个样本的一维列表。

为简单起见,假设我要对长度为15的滤波器进行卷积处理,最后输出y100000个样本的目标滤波信号。

因此,基本上,我正在尝试y = conv(x, h)处理一维CNN,并且h训练滤镜。

在Keras中执行此操作的最佳方法是什么?我发现的所有示例似乎都具有以下形式:“每个样本都是一个长度为400个单词的序列,而卷积是沿着这400个单词的序列进行的”。由此看来,我唯一的选择似乎是将音频信号分解成大小的块sequence_length,但我真的宁愿避免这种情况,因为我基本上只有1个长度为100000的输入序列。

理想情况下,代码看起来像

import matplotlib.pylab as P
from keras.models import Model
from keras.layers import Conv1D, Input

x_train = P.randn(100000)
y_train = 2*x_train
x_val = P.randn(10000)
y_val = 2*x_val

batch_size = 64

myinput = Input(shape=(None, 1)) # shape = (BATCH_SIZE, 1D signal)
output = Conv1D(
    1, # output dimension is 1
    15, # filter length is 15
    padding="same")(myinput)

model = Model(inputs=myinput, outputs=output)

model.compile(loss='mse',
              optimizer='rmsprop',
              metrics=['mse'])


model.fit(x_train, y_train,
          batch_size=batch_size, epochs=100, shuffle=False,
          validation_data=(x_val, y_val))
Run Code Online (Sandbox Code Playgroud)

当然,这里最大的问题是正确地塑造事物。

Dan*_*ler 6

您完全在正确的轨道上。

尽管您只有一个声音样本,但是keras仍然会假设您有很多。解决方案就是在您的输入中为其指定尺寸。

同样,keras希望您的卷积数据具有“通道”。如果只有一个通道(例如,没有立体声通道),则为其指定尺寸为1的尺寸。

因此,您的输入数据应调整为:

  • (1, 100000, 1)-如果使用data_format='channels_last'(默认)
  • (1, 1, 100000) -如果使用 data_format='chanels_first'

这意味着:1个长度为100000的信号样本和一个通道。

您模型中的所有其余部分对于该任务来说似乎都还不错。


如果您的内存无法一次支持全部数据,则需要将音频分成多个部分。否则,你很好。(请注意,分割时,使用可能会得到更好的结果padding='valid',因为“相同”会在剪切中添加很多边框效果)。

您可能对阅读WaveNet及其相关文章感兴趣。

他们使用具有扩散率的堆叠卷积层。