【发布时间】:2018-05-10 08:48:41
【问题描述】:
我有一个很长的音频信号x,它是一个包含 100000 个样本的一维列表。
为简单起见,假设我要做的就是将其与长度为 15 的滤波器进行卷积,并最终输出 100000 个样本的目标滤波信号y。
所以基本上,我正在尝试使用 1D CNN 来处理 y = conv(x, h),并且要训练过滤器 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))
当然,这里最大的问题是正确地塑造事物。
【问题讨论】:
-
我认为我们可以使用 LSTM 做得更好。如果是语音识别,那么您可以根据间隙将音频信号分成几部分和/或您可以尝试使用噪声消除技术。
-
这个例子是一个过于简单的例子,只是为了展示我对 Conv1D 的问题。我完全意识到 Conv1D 并不是解决这个问题的最佳方法。我只是想知道如何以这种方式使用Conv1D,这样我就可以实现我的真实网络,它松散地基于WaveNets。
-
澄清一下,我没有做任何输出离散的语音识别之类的事情。输入是长音频波形,最终输出也会是长音频波形。
-
将 Conv1D 输出传递给 LSTM。并保持 return_sequences = True。试试看
标签: audio neural-network keras convolution keras-layer