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

时间:2017-11-27 06:59:52

标签: audio neural-network keras convolution keras-layer

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

为简单起见,假设我要做的就是用长度为15的滤波器进行卷积,最后输出100000个样本的目标滤波信号y

基本上,我正在尝试使用1D CNN进行y = conv(x, h),并且需要对过滤器h进行培训。

在Keras这样做的最佳方式是什么?我发现的所有例子似乎都是“每个样本都是一个长度为400字的序列,并且卷积沿着400字的序列运行”。从那以后,似乎我唯一的选择是将音频信号分解为大小为sequence_length的块,但我真的宁愿避免这种情况,因为我基本上只有一个长度为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))

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

1 个答案:

答案 0 :(得分:5)

你完全走在正确的轨道上。

虽然你有一个声音样本,但keras仍然认为你有很多。解决方案只是在输入中有一个维度。

此外,keras会期望您的卷积数据有"频道"。如果您只有一个通道(例如,不是立体声),那么它的维度值为1。

因此,您的输入数据应该形成为:

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

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

你的模型中的所有其余部分似乎都很适合这项任务。

如果您的记忆不能同时支持整个数据,那么您需要将音频划分为多块。否则,你很高兴去。 (请注意,在划分时,使用padding='valid'可能会获得更好的结果,因为"相同"会在剪切中添加大量边框效果)。

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

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