CTC模型不学习



我正在尝试使用连接主义时间分类为音频转录编程Keras模型。使用一个主要工作的逐帧分类模型和OCR示例,我提出了下面给出的模型,我想训练它将德语句子的短时傅立叶变换映射到它们的语音转录。

我的训练数据实际上有定时信息,所以我可以使用它来训练没有CTC的逐帧模型。无CTC损失的逐帧预测模型工作良好(训练准确率80%,验证准确率50%(。然而,在没有定时信息的情况下,还有更多潜在的训练数据可用,所以我真的想切换CTC。为了测试这一点,我从数据中删除了计时,将NULL类的输出大小增加了一个,并添加了CTC丢失函数。

CTC的这种模式似乎没有学到什么。总的来说,损失并没有下降(在十几个时期,每个时期有80个句子,从2000年下降到180年,但后来又上升到430年(,它产生的最大似然输出在每个句子的[nh周围蔓延,通常有大约六个单词,像[foːɐmʔɛsndʰaɪnəhɛndəvaʃn][]这样的转录是序列的一部分,代表音频开始和结束时的停顿。

我发现在喀拉拉邦很难找到CTC的好解释,所以可能是我做了一些愚蠢的事情。我是不是把模型搞砸了,把争论的顺序搞混了?在训练模型时,我是否需要更加小心,在给模型完整的句子之前,可能从每个声音都有一个、两个或三个声音的音频片段开始?简而言之,

我该如何学习CTC模型

connector = inputs
for l in [100, 100, 150]:
lstmf, lstmb = Bidirectional(
LSTM(
units=l,
dropout=0.1,
return_sequences=True,
), merge_mode=None)(connector)
connector = keras.layers.Concatenate(axis=-1)([lstmf, lstmb])
output = Dense(
units=len(dataset.SEGMENTS)+1,
activation=softmax)(connector)
loss_out = Lambda(
ctc_lambda_func, output_shape=(1,),
name='ctc')([output, labels, input_length, label_length])
ctc_model = Model(
inputs=[inputs, labels, input_length, label_length],
outputs=[loss_out])
ctc_model.compile(loss={'ctc': lambda y_true, y_pred: y_pred},
optimizer=SGD(
lr=0.02,
decay=1e-6,
momentum=0.9,
nesterov=True,
clipnorm=5))

CCD_ 4和根据预测生成序列的代码来自OCR示例。

在这里给出的代码中它是完全不可见的,但在其他地方OP提供了指向其Github存储库的链接。错误实际上在于数据准备:

这些数据是对数谱图。它们是不规范的,而且大多是高度负面的。CTC函数对标签的一般分布的处理速度比LSTM层调整其输入偏差和输入权重的速度快得多,因此输入中的所有变化都被压平了。当标签的边缘化分布尚未在全球范围内假设时,局部最小损失可能来自时代。

解决方案是缩放输入光谱图,使其同时包含正值和负值:

for i, file in enumerate(files):
sg = numpy.load(file.with_suffix(".npy").open("rb"))
spectrograms[i][:len(sg)] = 2 * (sg-sg.min())/(sg.max()-sg.min()) - 1

相关内容

  • 没有找到相关文章

最新更新