:基于 mfcc_op 的 12 標簽 TFLite 量化訓練與評估指南)
kws_streaming 關鍵詞喚醒模型量化實戰(zhàn)基于 mfcc_op 的 12 標簽 TFLite 量化訓練與評估指南【免費下載鏈接】google-researchGoogle Research項目地址: https://gitcode.com/gh_mirrors/go/google-research導讀本文是 Google Research kws_streaming 項目中量化版 12 標簽關鍵詞喚醒KWS模型實驗指南的完整解讀對應倉庫文檔為 kws_experiments_quantized_12_labels.md。該文檔基于論文Streaming keyword spotting on mobile devicesarXiv:2005.06720的模型體系展示了如何通過--feature_type mfcc_op讓語音特征提取器以 TFLite 原生算子參與模型構建從而支持端到端的訓練后量化PTQ并在 Speech Commands V2 數(shù)據集上復現(xiàn) svdf、lstm_peep、crnn、crnn_state、dnn、att_mh_rnn 六類模型的 float/quant/stream 精度、模型大小與延遲指標。讀完本文你將掌握從環(huán)境搭建、數(shù)據集準備、TFLite 基準工具編譯到逐模型訓練評估與量化結果解讀的完整流程。一、背景為什么量化版實驗要切換到 mfcc_op1.1 mfcc_tf 與 mfcc_op 的數(shù)值差異原始論文實驗使用--feature_type mfcc_tf其特征提取基于 DFT 與 DCT二者通過矩陣乘法實現(xiàn)。這種方式雖然與任何推理引擎兼容但 DFT 權重會直接成為模型的一部分顯著增加模型體積且對這類模型做訓練后量化會帶來明顯的精度損失。量化版實驗改用--feature_type mfcc_op語音 MFCC 特征提取器改為調用 TFLite 內部算子內部通過 FFT 執(zhí)行 DFT/DCT數(shù)值上與 mfcc_tf 存在差異。文檔明確提示由于沒有針對 mfcc_op 重新做超參數(shù)優(yōu)化精度可能出現(xiàn)一定下降。同時 mfcc_op 會調用audio_spectrogram()與mfcc()后者期望輸入為平方后的 FFT 幅度因此所有命令中都必須顯式設置--fft_magnitude_squared 1該參數(shù)在 model_flags.py 中被轉換為布爾值。1.2 端到端模型preprocess raw本文檔中的所有模型都同時指定--feature_type mfcc_op語音 MFCC 特征提取器使用 TFLite 內部算子--preprocess raw模型接收原始音頻特征提取器作為模型的一部分。這樣構建出的模型是端到端自包含的推理時只需向模型喂入原始音頻即可直接得到分類結果無需在外部單獨維護特征提取管線極大簡化了移動端部署與測試。這一點在 svdf.py、att_mh_rnn.py 的源碼中可以看到一致的實現(xiàn)模式當flags.preprocess raw時模型輸入后直接接入speech_features.SpeechFeatures層。二、環(huán)境搭建與數(shù)據集準備2.1 獲取 kws_streaming 代碼# create main folder mkdir test # set path to a main folder KWS_PATH$PWD/test cd $KWS_PATH# copy content of kws_streaming to a folder /tmp/test/kws_streaming git clone https://github.com/google-research/google-research.git mv google-research/kws_streaming .2.2 安裝 TensorFlow 與依賴# set up virtual env pip install virtualenv virtualenv --system-site-packages -p python3 ./venv3 source ./venv3/bin/activate # install TensorFlow, correct TensorFlow version is important pip install --upgrade pip pip install tf_nightly pip install tensorflow_addons pip install tensorflow_model_optimization # was tested on tf_nightly-2.3.0.dev20200515-cp36-cp36m-manylinux2010_x86_64.whl # install libs: pip install pydot pip install graphviz pip install numpy pip install absl-py文檔特別強調TensorFlow 版本必須正確其驗證過的版本為tf_nightly-2.3.0.dev20200515。tensorflow_model_optimization用于支持量化感知訓練等高級量化方案見 README.md 中關于 functional API 與 subclass API 的 QAT 示例。2.3 數(shù)據集Speech Commands V22018kws_streaming 支持兩版數(shù)據集V1 2017 與 V2 2018本文檔統(tǒng)一使用 V2# download and set up path to data set V2 and set it up wget https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz mkdir data2 mv ./speech_commands_v0.02.tar.gz ./data2 cd ./data2 tar -xf ./speech_commands_v0.02.tar.gz cd ../ # path to data sets V2 DATA_PATH$KWS_PATH/data22.4 模型輸出目錄# set up path for model training mkdir $KWS_PATH/models2_q # models trained on data V2 MODELS_PATH$KWS_PATH/models2_q完成上述步驟后KWS_PATH主目錄下應包含如下結構kws_streaming/ colab/ data/ experiments/ ... data2 _background_noise_/ bed/ ... models2_q/ svdf/ ...2.5 編譯 TFLite 基準測試工具Android若需在手機上評測延遲需使用 bazel 編譯 TFLite 基準測試二進制# build benchmarking binary bazel build -c opt --configandroid_arm64 --cxxopt--stdc17 \ third_party/tensorflow/lite/tools/benchmark:benchmark_model # check that phone is connected adb devices # copy benchmarking binary to phone adb push bazel-bin/third_party/tensorflow/lite/tools/benchmark/benchmark_model /data/local/tmp # allow executing benchmarking file as a program adb shell chmod x /data/local/tmp/benchmark_model # build benchmarking binary - for a case if Flex is used by neural network model bazel build -c opt --configandroid_arm64 --cxxopt--stdc17 \ third_party/tensorflow/lite/tools/benchmark:benchmark_model_plus_flex # check that phone is connected adb devices # copy benchmarking binary to phone adb push bazel-bin/third_party/tensorflow/lite/tools/benchmark/benchmark_model_plus_flex /data/local/tmp # allow executing benchmarking file as a program adb shell chmod x /data/local/tmp/benchmark_model_plus_flex當模型用到 Flex 算子時需要使用benchmark_model_plus_flex變體。三、訓練與評估的統(tǒng)一入口所有模型都通過 model_train_eval.py 統(tǒng)一驅動它注冊了各模型的子解析器見 models.py 中MODELS字典與 model_train_eval.py 中按模型名注冊model_parameters的代碼。兩種運行方式# CMD_TRAINbazel run -c opt --copt-mavx2 kws_streaming/train:model_train_eval -- CMD_TRAINpython -m kws_streaming.train.model_train_eval關鍵運行規(guī)則與 model_train_eval.py 的main()邏輯對應--train 1從頭訓練并評估若模型已訓練好可設--train 0僅評估并生成 TFLite 精度報告重新訓練時需刪除$MODELS_PATH下對應的模型子文件夾否則會因目錄已存在而報錯訓練結束后腳本會輸出flags.json完整訓練參數(shù)快照、TF/TFLite 非流式與流式模型精度報告、量化模型等產物。四、六大量化模型的完整訓練命令與結果下文所有命令均省略統(tǒng)一前綴--data_url 、--data_dir $DATA_PATH/、--alsologtostderr等公共參數(shù)完整命令見 kws_experiments_quantized_12_labels.md這里給出每個模型的完整可執(zhí)行命令。4.1 svdf參數(shù)量354Kfloat精度 96.0模型 1003KB延遲 2msquant精度 96.0模型 369KB延遲 1.6msstream float精度 96.0模型 1003KB延遲 0.4msstream quant精度 96.0模型 406KB延遲 0.4ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/svdf/ \ --mel_upper_edge_hertz 7600 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 80 \ --dct_num_features 30 \ --resample 0.15 \ --alsologtostderr \ --time_shift_ms 100 \ --train 1 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ svdf \ --svdf_memory_size 4,10,10,10,10,10 \ --svdf_units1 256,256,256,256,256,256 \ --svdf_act relu,relu,relu,relu,relu,relu \ --svdf_units2 128,128,128,128,128,-1 \ --svdf_dropout 0.0,0.0,0.0,0.0,0.0,0.0 \ --svdf_pad 0 \ --dropout1 0.0 \ --units2 \ --act2 svdf 各參數(shù)含義與默認值可在 svdf.py 的model_parameters中查到--svdf_memory_size表示各 SVDF 層在時間維保留的歷史步數(shù)--svdf_units1/--svdf_units2分別表示 SVDF 模塊前半部分與投影部分的單元數(shù)-1表示該層無投影--svdf_pad 0時使用 valid padding置 1 則用 causal padding源碼中padding causal if flags.svdf_pad else valid流式模式更推薦 causal。4.2 lstm_peep參數(shù)量545Kfloat精度 97.3模型 2200KB延遲 10msquant精度 97.3模型 723KB延遲 3.8ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/lstm_peep/ \ --mel_upper_edge_hertz 7600 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 40 \ --dct_num_features 20 \ --resample 0.15 \ --alsologtostderr \ --train 1 \ --lr_schedule exp \ --use_spec_augment 1 \ --time_masks_number 2 \ --time_mask_max_size 10 \ --frequency_masks_number 2 \ --frequency_mask_max_size 5 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ lstm \ --lstm_units 500 \ --return_sequences 0 \ --use_peepholes 1 \ --num_proj 200 \ --dropout1 0.3 \ --units1 \ --act1 \ --stateful 0該模型啟用 peephole 連接的 LSTM--use_peepholes 1并帶投影--num_proj 200同時啟用 SpecAugment--use_spec_augment 12 個時間掩碼最大 10、2 個頻率掩碼最大 5提升魯棒性。4.3 crnn參數(shù)量467Kfloat精度 97.4模型 1800KB延遲 7msquant精度 97.0模型 593KB延遲 2.6ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/crnn/ \ --mel_upper_edge_hertz 7600 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 40 \ --dct_num_features 20 \ --resample 0.15 \ --alsologtostderr \ --train 1 \ --lr_schedule exp \ --use_spec_augment 1 \ --time_masks_number 2 \ --time_mask_max_size 10 \ --frequency_masks_number 2 \ --frequency_mask_max_size 5 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ crnn \ --cnn_filters 16,16 \ --cnn_kernel_size (3,3),(5,3) \ --cnn_act relu,relu \ --cnn_dilation_rate (1,1),(1,1) \ --cnn_strides (1,1),(1,1) \ --gru_units 256 \ --return_sequences 0 \ --dropout1 0.1 \ --units1 128,256 \ --act1 linear,relu \ --stateful 0crnn 由兩段卷積16/16 個濾波器核尺寸 (3,3) 與 (5,3)疊加 256 單元 GRU 構成最后接兩段全連接層。4.4 crnn_state參數(shù)量467Kfloat精度 97.1模型 1800KB延遲 7.1msquant精度 96.9模型 593KB延遲 2.6msstream float精度 96.3模型 1700KB延遲 0.2msstream quant精度 95.8模型 472KB延遲 0.1ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/crnn_state/ \ --mel_upper_edge_hertz 7600 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 40 \ --dct_num_features 20 \ --resample 0.15 \ --alsologtostderr \ --train 1 \ --lr_schedule exp \ --use_spec_augment 1 \ --time_masks_number 2 \ --time_mask_max_size 10 \ --frequency_masks_number 2 \ --frequency_mask_max_size 5 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ crnn \ --cnn_filters 16,16 \ --cnn_kernel_size (3,3),(5,3) \ --cnn_act relu,relu \ --cnn_dilation_rate (1,1),(1,1) \ --cnn_strides (1,1),(1,1) \ --gru_units 256 \ --return_sequences 0 \ --dropout1 0.1 \ --units1 128,256 \ --act1 linear,relu \ --stateful 1crnn_state 與 crnn 拓撲相同唯一區(qū)別是--stateful 1有狀態(tài) GRU因此可以轉換為流式推理模式20ms 音頻包延遲低至 0.1–0.2ms是流式場景的代表模型。4.5 dnn參數(shù)量447Kfloat精度 90.4模型 1700KB延遲 1.2msquant精度 90.2模型 443KB延遲 1.1ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/dnn/ \ --mel_upper_edge_hertz 7600 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 40 \ --dct_num_features 20 \ --resample 0.15 \ --alsologtostderr \ --train 1 \ --lr_schedule exp \ --use_spec_augment 1 \ --time_masks_number 2 \ --time_mask_max_size 10 \ --frequency_masks_number 2 \ --frequency_mask_max_size 5 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ dnn \ --units1 64,128 \ --act1 relu,relu \ --pool_size 2 \ --strides 2 \ --dropout1 0.1 \ --units2 128,256 \ --act2 linear,reludnn 是純全連接基線模型精度最低90.4/90.2但模型量化后體積從 1700KB 壓縮到 443KB適合對精度要求不高的低資源場景。4.6 att_mh_rnn多注意力 BiRNN不可流式參數(shù)量700Kfloat精度 97.9模型 3400KB延遲 8msquant精度 97.8模型 1300KB延遲 4ms$CMD_TRAIN \ --data_url \ --data_dir $DATA_PATH/ \ --train_dir $MODELS_PATH/att_mh_rnn/ \ --mel_upper_edge_hertz 8000 \ --how_many_training_steps 20000,20000,20000,20000 \ --learning_rate 0.001,0.0005,0.0001,0.00002 \ --window_size_ms 40.0 \ --window_stride_ms 20.0 \ --mel_num_bins 40 \ --dct_num_features 20 \ --resample 0.15 \ --alsologtostderr \ --train 1 \ --lr_schedule exp \ --use_spec_augment 1 \ --time_masks_number 2 \ --time_mask_max_size 10 \ --frequency_masks_number 2 \ --frequency_mask_max_size 5 \ --feature_type mfcc_op \ --fft_magnitude_squared 1 \ att_mh_rnn \ --cnn_filters 10,1 \ --cnn_kernel_size (5,1),(5,1) \ --cnn_act relu,relu \ --cnn_dilation_rate (1,1),(1,1) \ --cnn_strides (1,1),(1,1) \ --rnn_layers 2 \ --rnn_type gru \ --rnn_units 128 \ --heads 4 \ --dropout1 0.2 \ --units2 64,32 \ --act2 relu,linearatt_mh_rnn 在六類模型中精度最高97.9/97.8結構為卷積 雙向 RNN 多頭注意力--heads 4即論文中的 multihead self-attention參數(shù)定義見 att_mh_rnn.py。由于使用雙向 RNN該模型不可流式化model_train_eval.py 中將att_mh_rnn、att_rnn、tc_resnet顯式列入non_streamable_models因此無 stream 指標。注意其--mel_upper_edge_hertz為 8000與其余模型不同。五、結果解讀與量化收益分析5.1 指標總覽模型參數(shù)量float 精度quant 精度float 模型/延遲quant 模型/延遲stream quant 精度/延遲svdf354K96.096.01003KB / 2ms369KB / 1.6ms96.0 / 0.4mslstm_peep545K97.397.32200KB / 10ms723KB / 3.8ms—crnn467K97.497.01800KB / 7ms593KB / 2.6ms—crnn_state467K97.196.91800KB / 7.1ms593KB / 2.6ms95.8 / 0.1msdnn447K90.490.21700KB / 1.2ms443KB / 1.1ms—att_mh_rnn700K97.997.83400KB / 1.3ms1300KB / 4ms—5.2 訓練后量化的實現(xiàn)機制量化在評估腳本中由 TFLite 完成README.md 明確指出對應 model_train_eval.py 中的轉換邏輯。從源碼看name2opt字典為不量化與quantize_opt_for_size_tf.lite.Optimize.DEFAULT兩條路徑分別生成tflite_non_stream與quantize_opt_for_size_tflite_non_stream兩套模型若未提供校準數(shù)據TFLite 會退化為混合量化int/float 混合運算提供校準數(shù)據后則為全整數(shù)量化轉換入口為 test.py 的convert_model_tflite它加載best_weights后調用utils.model_to_tflite生成指定模式非流式 / 外部狀態(tài)流式的 TFLite 模型流式模型會額外生成tflite_stream_state_external_model_accuracy_reset0.txt狀態(tài)不重置模擬長時運行與reset1狀態(tài)重置等價于非流式兩份精度報告。5.3 關鍵結論量化精度損失極小得益于 mfcc_op六類模型量化后精度下降普遍不超過 0.5 個百分點svdf、lstm_peep 甚至無損驗證了文檔中mfcc_op 下量化精度損失可忽略的判斷體積大幅壓縮如 att_mh_rnn 從 3400KB 降至 1300KB約 -62%dnn 從 1700KB 降至 443KB約 -74%且模型體積僅由神經網絡權重決定不含特征提取器權重流式量化進一步降低延遲crnn_state 從非流式 7.1ms 降至流式 0.1ms20ms 音頻包粒度svdf 流式 float/quant 均為 0.4ms適用于實時喚醒詞檢測。六、注意事項與適用前提版本依賴以上命令基于文檔驗證的tf_nightly-2.3.0.dev20200515環(huán)境使用其他 TensorFlow 版本可能需要調整例如tf.compat.v1相關的會話/圖模式 API見 model_train_eval.pymfcc_op 的數(shù)值差異與論文使用的 mfcc_tf 相比存在數(shù)值差異且未做超參優(yōu)化如需更高的絕對精度可參考論文原版實驗 kws_experiments_paper_12_labels.md 與最新實驗 kws_experiments_12_labels.md后者在相同數(shù)據集上達到 96.4%–98.4% 精度不可流式模型att_mh_rnn雙向 RNN 全局注意力與 att_rnn、tc_resnet 無法轉換為流式推理使用前需確認模型的可流式屬性完整模型清單見 README.md訓練產物解讀每個模型的$MODELS_PATH/model/目錄會生成flags.json訓練參數(shù)快照、labels.txt、model_summary.txt、TF/TFLite 各模式精度報告與模型文件詳細目錄結構說明見 README.md更多實驗量化版文檔聚焦 12 標簽 Speech Commands V230K 參數(shù)量小模型見 kws_experiments_30k_12_labels.md35 標簽自定義數(shù)據訓練見 kws_experiments_35_labels.md。結語本文完整復現(xiàn)了 kws_streaming 量化版 12 標簽關鍵詞喚醒實驗以mfcc_oppreprocess raw構建端到端可量化模型在 Speech Commands V2 上逐模型給出可復制的訓練命令并結合源碼說明了 TFLite 訓練后量化、流式狀態(tài)管理與不可流式模型判定的底層實現(xiàn)。無論是驗證論文結論、為移動端部署選型還是作為自定義關鍵詞數(shù)據集的起點這份指南都提供了完整的可操作路徑。【免費下載鏈接】google-researchGoogle Research項目地址: https://gitcode.com/gh_mirrors/go/google-research創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考