tf.nn.ctc_loss 不收敛的单个文件的 TensorFlow 语音到文本训练

数据挖掘 机器学习 Python 张量流 rnn 机器翻译
2022-02-23 18:27:24

我想在 tensorflow 上训练语音到文本模型。

代码位于: https ://github.com/bikramjitroy/speech-to-text/blob/master/TrainingUnitTest-CTCTrain.py

存储库中还存在一个示例“audio.wav”和“label.txt”文件。 https://github.com/bikramjitroy/speech-to-text

我正在加载一个wav文件。每帧获得 20 个 mfcc 功能。将输入传递给一层 RNN(256 个隐藏单元),然后添加一个全连接层,然后使用ctc_loss.

即使使用一个训练示例执行 500 步,准确度也不会增加

Error = 70.932137 # 期望它应该接近于零

Accuracy = 0.62068963 # 预计这将变为零

我也尝试过双向 rnn,但这是不同的。

我在代码中做错了什么?

1个回答

我找到了解决方案。

早些时候,我在单层 RNN 之后有一个Dropout 层。我已将 rnn_layer 函数更改如下。

  • 从 RNN 层中删除了 DropoutWrapper - 这有助于我过拟合
  • 添加了 2 层 LSTM 单元。单层 LSTM 单元需要时间来收敛,而不是让 LSTM 层宽改为深。这帮助我实现了比扩大网络更快的收敛速度。

下面是rnn_layer的代码。

def rnn_layer(input_tensor, n_cell_units, dropout, seq_length, batch_size):
    lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(2*n_cell_units, forget_bias=1.0, state_is_tuple=True)
# Dropout 层被丢弃
# lstm_fw_cell = tf.contrib.rnn.DropoutWrapper(lstm_fw_cell, input_keep_prob=dropout, output_keep_prob=dropout)
# 多层 RNN
    lstm_fw_cell = tf.contrib.rnn.MultiRNNCell([lstm_fw_cell] * 2, state_is_tuple=True)

    输出,output_states = tf.nn.dynamic_rnn(cell=lstm_fw_cell,
                                               输入=输入张量,
                                               dtype=tf.float32,
                                               time_major=真,
                                               序列长度=序列长度)

    返回输出