ichou1のブログ

主に音声認識、時々、データ分析のことを書く

音声認識メモ(DeepSpeech)その2

モデルの構造

DeepSpeechの「create_model」関数を追ってみると、modelの構造としては「6層」

  • Layer1: Dense ( + clipped RELU activation + dropout )
  • Layer2: Dense ( + clipped RELU activation + dropout )
  • Layer3: Dense ( + clipped RELU activation + dropout )
  • Layer4: LSTM
  • Layer5: Dense ( + clipped RELU activation + dropout )
  • Layer6: Dense


Input shapeは以下のとおり。

# n_input : Number of MFCC features (Default 26)
# n_context : The number of frames in the context (Default 9)
[batch_size, n_steps, n_input + 2*n_input*n_context]


レイヤ4のLSTMは「tensorflow.contrib」モジュールを使っている。

  • LSTMBlockFusedCell (CPUの場合、tensorflow/contrib/rnn/python/ops/lstm_ops.pyで実装)
  • CudnnLSTM (GPUの場合、tensorflow/contrib/cudnn_rnn/python/layers/cudnn_rnn.pyで実装)


TF2系で動かす

環境として「TensorFlow 2.X」系を使っているとすると、「tensorflow.contrib」モジュールは使用できない。

「LSTMBlockFusedCell」に関してはissuesが上がっている(これを書いている時点ではOpen中)
Will LSTMBlockFusedCell be supported in tensorflow 2.0? · Issue #26642 · tensorflow/tensorflow · GitHub

これによると、「tf.raw_ops.BlockLSTM」で代替できそうではある。
tf.raw_ops.BlockLSTM  |  TensorFlow Core v2.3.0

ということで、「tf.raw_ops.BlockLSTM」に置き換えたモデルを組み立てて、パラメータをcheckpointから読み込んで推論させてみた。
結果は...うまく動かなかった。

どこに問題があるか

checkpointのパラメータに問題があったと判断。
https://github.com/mozilla/DeepSpeech/releases/download/v0.7.0/deepspeech-0.7.0-checkpoint.tar.gz

確認の方法は以下をご参照。
TensorFlowメモ(checkpointの中身を確認する) - ichou1のブログ

(参考)「deepspeech-0.7.0-checkpoint.tar.gz」に含まれる一式

-rw-r--r-- 1 ichou1 ichou1       329  4月 23 20:53 alphabet.txt
-rw-r--r-- 1 ichou1 ichou1 701047148  4月 23 19:33 best_dev-732522.data-00000-of-00001
-rw-r--r-- 1 ichou1 ichou1      1475  4月 23 19:33 best_dev-732522.index
-rw-r--r-- 1 ichou1 ichou1   8687981  4月 23 19:33 best_dev-732522.meta
-rw-r--r-- 1 ichou1 ichou1        87  4月 23 19:33 best_dev_checkpoint
-rw-r--r-- 1 ichou1 ichou1        87  4月 23 20:51 checkpoint
Layer1
-----------
[param name]:  layer_1/bias
[param shape]:  (2048,)
-----------
[param name]:  layer_1/bias/Adam
[param shape]:  (2048,)
-----------
[param name]:  layer_1/bias/Adam_1
[param shape]:  (2048,)
-----------
[param name]:  layer_1/weights
[param shape]:  (494, 2048)
-----------
[param name]:  layer_1/weights/Adam
[param shape]:  (494, 2048)
-----------
[param name]:  layer_1/weights/Adam_1
[param shape]:  (494, 2048)
Layer2, 3

optimizer分は省略。

-----------
[param name]:  layer_2/bias
[param shape]:  (2048,)
-----------
[param name]:  layer_2/weights
[param shape]:  (2048, 2048)
-----------
[param name]:  layer_3/bias
[param shape]:  (2048,)
-----------
[param name]:  layer_3/weights
[param shape]:  (2048, 2048)
Layer5, 6

optimizer分は省略。

-----------
[key name]:  layer_5/bias
[weight]:  (2048,)
-----------
[key name]:  layer_5/weights
[weight]:  (2048, 2048)
-----------
[key name]:  layer_6/bias
[weight]:  (29,)
-----------
[key name]:  layer_6/weights
[weight]:  (2048, 29)
Layer4 (LSTM)

optimizer分も記載。

以下は、GPUの場合の「CudnnLSTM」レイヤに該当するものと思われる。

-----------
[param name]:  cudnn_lstm/opaque_kernel
[param shape]:  (33570816,)
-----------
[param name]:  cudnn_lstm/opaque_kernel/Adam
[param shape]:  (33570816,)
-----------
[param name]:  cudnn_lstm/opaque_kernel/Adam_1
[param shape]:  (33570816,)


以下は、CPUの場合の「LSTMBlockFusedCell」レイヤに該当するものと思われるが、
optimizer分のデータがなく、トレーニングによって更新されていないと予想される。

-----------
[param name]:  cudnn_lstm/rnn/multi_rnn_cell/cell_0/cudnn_compatible_lstm_cell/bias
[param shape]:  (8192,)
-----------
[param name]:  cudnn_lstm/rnn/multi_rnn_cell/cell_0/cudnn_compatible_lstm_cell/kernel
[param shape]:  (4096, 8192)

checkpointに関してはバージョン「0.6.0」リリースドキュメントで記載がある。
https://github.com/mozilla/DeepSpeech/releaseshttps://github.com/mozilla/DeepSpeech/releases?after=v0.6.1-alpha.0

Checkpoints - With TF 1.14, we have added CuDNN RNN support to our training graph, which improves training performance significantly.
(中略)
The required training graph changes breaks loading older checkpoints, due to differences in the computation performed by CudnnLSTM.
Note that mixing CuDNN and non-CuDNN checkpoints requires some care: (以降、省略)

Fine-Tuning(転移学習)でトレーニング済みのパラメータを使おうとするなら、(GPUの)「CudnnLSTM」レイヤを使ってモデルを組み立てる必要がありそう。