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)
当然,这里最大的问题是正确地塑造事物。
您完全在正确的轨道上。
尽管您只有一个声音样本,但是keras仍然会假设您有很多。解决方案就是在您的输入中为其指定尺寸。
同样,keras希望您的卷积数据具有“通道”。如果只有一个通道(例如,没有立体声通道),则为其指定尺寸为1的尺寸。
因此,您的输入数据应调整为:
(1, 100000, 1)-如果使用data_format='channels_last'(默认) (1, 1, 100000) -如果使用 data_format='chanels_first'这意味着:1个长度为100000的信号样本和一个通道。
您模型中的所有其余部分对于该任务来说似乎都还不错。
如果您的内存无法一次支持全部数据,则需要将音频分成多个部分。否则,你很好。(请注意,分割时,使用可能会得到更好的结果padding='valid',因为“相同”会在剪切中添加很多边框效果)。
您可能对阅读WaveNet及其相关文章感兴趣。
他们使用具有扩散率的堆叠卷积层。
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |