我有一个很长的音频信号 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))
当然,这里的大问题是正确地塑造事物 .
1 回答
你完全走在正确的轨道上 .
虽然你有一个声音样本,但keras仍然认为你有很多 . 解决方案只是在输入中有一个维度 .
此外,keras会期望卷积数据具有“通道” . 如果您只有一个通道(例如,不是立体声),那么,它的值为1 .
因此,您的输入数据应该形如:
(1, 100000, 1)
- 如果使用data_format='channels_last'
(默认)(1, 1, 100000)
- 如果使用data_format='chanels_first'
这意味着:1个长度为100000且一个通道的信号样本 .
模型中的所有其余部分对于任务来说似乎都很好 .
如果你的记忆不能立刻支持整个数据,那你就好了 . (请注意,在划分时,使用
padding='valid'
可能会获得更好的结果,因为"same"会在剪切中添加大量边框效果) .您可能有兴趣阅读WaveNet及其相关文章 .
他们使用具有扩张率的堆叠卷积层 .