在 Keras 中使用 Conv1D 处理长音频信号
Processing a long audio signal with Conv1D in Keras
我有一个很长的音频信号x
,它是一个包含 100000 个样本的一维列表。
为简单起见,假设我只想将其与长度为 15 的滤波器进行卷积,并最终输出 100000 个样本的目标滤波信号 y
。
所以基本上,我正在尝试使用 1D CNN 进行 y = conv(x, h)
,并且要训练过滤器 h
。
在 Keras 中执行此操作的最佳方法是什么?我找到的所有例子似乎都是 "Each of the samples is a sequence of length 400 words, and convolution is run along that sequence of 400 words" 的形式。由此看来,我唯一的选择似乎是将音频信号分成 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))
当然,这里的大问题是正确塑造事物。
你的方向完全正确。
虽然你有一个声音样本(例子*
),keras 仍然会假设你有很多。解决方案只是在您的输入中有一个维度。
此外,keras 会期望您的卷积数据具有 "channels"。如果您只有一个通道(例如,不是立体声),则为其设置一个值为 1 的维度。
因此,您的输入数据的形状应为:
(1, 100000, 1)
- 如果使用 data_format='channels_last'
(默认)
(1, 1, 100000)
- 如果使用 data_format='chanels_first'
这意味着:1 个长度为 100000 的信号样本和一个通道。
您模型中的所有其他部分似乎都非常适合这项任务。
如果您的内存不能一次支持整个数据,那么您需要将音频分成块。否则,你就可以走了。 (请注意,在划分时,使用 padding='valid'
可能会获得更好的结果,因为 "same" 会在剪切中添加很多边框效果)。
您可能有兴趣阅读有关 WaveNet 及其相关文章。
他们使用具有膨胀率的堆叠卷积层。
*
- 在 Keras 中,每个 "example" 被称为 "sample",尽管在音频处理中,样本通常是时间步长。因此,完整的音频文件在 Keras 中将是 "sample"。
我有一个很长的音频信号x
,它是一个包含 100000 个样本的一维列表。
为简单起见,假设我只想将其与长度为 15 的滤波器进行卷积,并最终输出 100000 个样本的目标滤波信号 y
。
所以基本上,我正在尝试使用 1D CNN 进行 y = conv(x, h)
,并且要训练过滤器 h
。
在 Keras 中执行此操作的最佳方法是什么?我找到的所有例子似乎都是 "Each of the samples is a sequence of length 400 words, and convolution is run along that sequence of 400 words" 的形式。由此看来,我唯一的选择似乎是将音频信号分成 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))
当然,这里的大问题是正确塑造事物。
你的方向完全正确。
虽然你有一个声音样本(例子*
),keras 仍然会假设你有很多。解决方案只是在您的输入中有一个维度。
此外,keras 会期望您的卷积数据具有 "channels"。如果您只有一个通道(例如,不是立体声),则为其设置一个值为 1 的维度。
因此,您的输入数据的形状应为:
(1, 100000, 1)
- 如果使用data_format='channels_last'
(默认)(1, 1, 100000)
- 如果使用data_format='chanels_first'
这意味着:1 个长度为 100000 的信号样本和一个通道。
您模型中的所有其他部分似乎都非常适合这项任务。
如果您的内存不能一次支持整个数据,那么您需要将音频分成块。否则,你就可以走了。 (请注意,在划分时,使用 padding='valid'
可能会获得更好的结果,因为 "same" 会在剪切中添加很多边框效果)。
您可能有兴趣阅读有关 WaveNet 及其相关文章。
他们使用具有膨胀率的堆叠卷积层。
*
- 在 Keras 中,每个 "example" 被称为 "sample",尽管在音频处理中,样本通常是时间步长。因此,完整的音频文件在 Keras 中将是 "sample"。