偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何使用TensorFlow構(gòu)建、訓(xùn)練和改進循環(huán)神經(jīng)網(wǎng)絡(luò)

開發(fā) 開發(fā)工具
本文將提供一個有關(guān)如何使用 RNN 訓(xùn)練語音識別系統(tǒng)的簡短教程,其中包括代碼片段。

來自 Silicon Valley Data Science 公司的研究人員為我們展示了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)探索時間序列和開發(fā)語音識別模型的能力。目前有很多人工智能應(yīng)用都依賴于循環(huán)深度神經(jīng)網(wǎng)絡(luò),在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產(chǎn)品中都能看到RNN的身影。

然而,當我們開始著手構(gòu)建自己的 RNN 模型時,我們發(fā)現(xiàn)在使用神經(jīng)網(wǎng)絡(luò)處理語音識別這樣的任務(wù)上,幾乎沒有簡單直接的先例可以遵循。一些可以找到的例子功能非常強大,但非常復(fù)雜,如 Mozilla 的 DeepSpeech(基于百度的研究,使用 TensorFlow);抑或極其簡單抽象,無法應(yīng)用于實際數(shù)據(jù)。

本文將提供一個有關(guān)如何使用 RNN 訓(xùn)練語音識別系統(tǒng)的簡短教程,其中包括代碼片段。本教程的靈感來自于各類開源項目。

本項目 GitHub 地址:https://github.com/silicon-valley-data-science/RNN-Tutorial

首先,在開始閱讀本文以前,如果你對 RNN 還不了解,可以閱讀 Christopher Olah 的 RNN 長短期記憶網(wǎng)絡(luò)綜述:

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

一、語音識別:聲音和轉(zhuǎn)錄

直到 2010 年時,最優(yōu)秀的語音識別模型仍是基于語音學(xué)(Phonetics)的方法,它們通常包含拼寫、聲學(xué)和語言模型等單獨組件。不論是過去還是現(xiàn)在,語音識別技術(shù)都依賴于使用傅里葉變換將聲波分解為頻率和幅度,產(chǎn)生如下所示的頻譜圖:

語音識別:聲音和轉(zhuǎn)錄

在訓(xùn)練語音模型時,使用隱馬爾科夫模型(Hidden Markov Models,HMM)需要語音+文本數(shù)據(jù),同時還需要單詞與音素的詞典。HMM 用于順序數(shù)據(jù)的生成概率模型,通常使用萊文斯坦距離來評估(Levenshtein 距離,是編輯距離的一種。指兩個字串之間,由一個轉(zhuǎn)成另一個所需的最少編輯操作次數(shù)??梢赃M行的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符)。

這些模型可以被簡化或通過音素關(guān)聯(lián)數(shù)據(jù)的訓(xùn)練變得更準確,但那是一些乏味的手工任務(wù)。因為這個原因,音素級別的語音轉(zhuǎn)錄在大數(shù)據(jù)集的條件下相比單詞級別的轉(zhuǎn)錄更難以實現(xiàn)。有關(guān)語音識別工具和模型的更多內(nèi)容可以參考這篇博客:

https://svds.com/open-source-toolkits-speech-recognition/

二、連接時間分類(CTC)損失函數(shù)

幸運的是,當使用神經(jīng)網(wǎng)絡(luò)進行語音識別時,通過能進行字級轉(zhuǎn)錄的連接時間分類(Connectionist Temporal Classification,CTC)目標函數(shù),我們可以丟棄音素的概念。簡單地說,CTC 能夠計算多個序列的概率,而序列是語音樣本中所有可能的字符級轉(zhuǎn)錄的集合。神經(jīng)網(wǎng)絡(luò)使用目標函數(shù)來最大化字符序列的概率(即選擇最可能的轉(zhuǎn)錄),隨后把預(yù)測結(jié)果與實際進行比較,計算預(yù)測結(jié)果的誤差,以在訓(xùn)練中不斷更新網(wǎng)絡(luò)權(quán)重。

值得注意的是,CTC 損失函數(shù)中的字符級錯誤與通常被用于常規(guī)語音識別模型的萊文斯坦錯詞距離。對于字符生成 RNN 來說,字符和單詞錯誤距離在表音文字(phonetic language)中是相同的(如世界語、克羅地亞語),這些語言的不同發(fā)音對應(yīng)不同字符。與之相反的是,字符與單詞錯誤距離在其他拼音文字中(如英語)有著顯著不同。

如果你希望了解 CTC 的更多內(nèi)容和百度對它最新的研究,以下是一些鏈接:

  • http://suo.im/tkh2e
  • http://suo.im/3WuVwV
  • https://arxiv.org/abs/1703.00096

為了優(yōu)化算法,構(gòu)建傳統(tǒng)/深度語音識別模型,SVDS 的團隊開發(fā)了語音識別平臺:

SVDS 的團隊開發(fā)了語音識別平臺

三、數(shù)據(jù)的重要性

毫無疑問,訓(xùn)練一個將語音轉(zhuǎn)錄為文字的系統(tǒng)需要數(shù)字語音文件和這些錄音的轉(zhuǎn)錄文本。因為模型終將被用于解釋新的語音,所以越多的訓(xùn)練意味著越好的表現(xiàn)。SVDS 的研究人員使用了大量帶有轉(zhuǎn)錄的英文語音對模型進行訓(xùn)練;其中的一些數(shù)據(jù)包含 LibriSpeech(1000 小時)、TED-LIUM(118 小時)和 VoxForge(130 小時)。下圖展示了這些數(shù)據(jù)集的信息,包括時長,采樣率和注釋。

  • LibriSpeech:http://www.openslr.org/12/
  • TED-LIUM:http://www.openslr.org/7/
  • VoxForge:http://www.voxforge.org/

數(shù)據(jù)集的信息,包括時長,采樣率和注釋

為了讓模型更易獲取數(shù)據(jù),我們將所有數(shù)據(jù)存儲為同一格式。每條數(shù)據(jù)由一個.wav 文件和一個.txt 文件組成。例如:Librispeech 的『211-122425-0059』 在 Github 中對應(yīng)著 211-122425-0059.wav 與 211-122425-0059.txt。這些數(shù)據(jù)的文件使用數(shù)據(jù)集對象類被加載到 TensorFlow 圖中,這樣可以讓 TensorFlow 在加載、預(yù)處理和載入單批數(shù)據(jù)時效率更高,節(jié)省 CPU 和 GPU 內(nèi)存負載。數(shù)據(jù)集對象中數(shù)據(jù)字段的示例如下所示:

  1. class DataSet: 
  2.     def __init__(self, txt_files, thread_count, batch_size, numcep, numcontext): 
  3.         # ... 
  4.   
  5.     def from_directory(self, dirpath, start_idx=0limit=0sort=None): 
  6.         return txt_filenames(dirpath, start_idxstart_idx=start_idx, limitlimit=limit, sortsort=sort) 
  7.   
  8.     def next_batch(self, batch_size=None): 
  9.         idx_list = range(_start_idx, end_idx) 
  10.         txt_files = [_txt_files[i] for i in idx_list] 
  11.         wav_files = [x.replace('.txt', '.wav') for x in txt_files] 
  12.         # Load audio and text into memory 
  13.         (audio, text) = get_audio_and_transcript( 
  14.             txt_files, 
  15.             wav_files, 
  16.             _numcep, 
  17.             _numcontext) 

四、特征表示

為了讓機器識別音頻數(shù)據(jù),數(shù)據(jù)必須先從時域轉(zhuǎn)換為頻域。有幾種用于創(chuàng)建音頻數(shù)據(jù)機器學(xué)習(xí)特征的方法,包括任意頻率的 binning(如 100Hz),或人耳能夠感知的頻率的 binning。這種典型的語音數(shù)據(jù)轉(zhuǎn)換需要計算 13 位或 26 位不同倒譜特征的梅爾倒頻譜系數(shù)(MFCC)。在轉(zhuǎn)換之后,數(shù)據(jù)被存儲為時間(列)和頻率系數(shù)(行)的矩陣。

為了讓機器識別音頻數(shù)據(jù),數(shù)據(jù)必須先從時域轉(zhuǎn)換為頻域

因為自然語言的語音不是獨立的,它們與字母也不是一一對應(yīng)的關(guān)系,我們可以通過訓(xùn)練神經(jīng)網(wǎng)絡(luò)在聲音數(shù)據(jù)上的重疊窗口(前后 10 毫秒)來捕捉協(xié)同發(fā)音的效果(一個音節(jié)的發(fā)音影響了另一個)。以下代碼展示了如何獲取 MFCC 特征,以及如何創(chuàng)建一個音頻數(shù)據(jù)的窗口。

  1.  Load wav files 
  2. fs, audio = wav.read(audio_filename) 
  3.   
  4. # Get mfcc coefficients 
  5. orig_inputs = mfcc(audio, samplerate=fsnumcepnumcep=numcep) 
  6.   
  7. # For each time slice of the training set, we need to copy the context this makes 
  8. train_inputs = np.array([], np.float32) 
  9. train_inputs.resize((orig_inputs.shape[0], numcep + 2 * numcep * numcontext)) 
  10.   
  11. for time_slice in range(train_inputs.shape[0]): 
  12.     # Pick up to numcontext time slices in the past, 
  13.     # And complete with empty mfcc features 
  14.     need_empty_past = max(0, ((time_slices[0] + numcontext) - time_slice)) 
  15.     empty_source_past = list(empty_mfcc for empty_slots in range(need_empty_past)) 
  16.     data_source_past = orig_inputs[max(0, time_slice - numcontext):time_slice] 
  17.     assert(len(empty_source_past) + len(data_source_past) == numcontext) 
  18.     ... 

對于這個 RNN 例子來說,我們在每個窗口使用前后各 9 個時間點——共 19 個時間點。有 26 個倒譜系數(shù),在 25 毫秒的時間里共 494 個數(shù)據(jù)點。根據(jù)數(shù)據(jù)采樣率,我們建議在 16,000 Hz 上有 26 個倒譜特征,在 8,000 Hz 上有 13 個倒譜特征。以下是一個 8,000 Hz 數(shù)據(jù)的加載窗口:

一個 8,000 Hz 數(shù)據(jù)的加載窗口

如果你希望了解更多有關(guān)轉(zhuǎn)換數(shù)字音頻用于 RNN 語音識別的方法,可以看看 Adam Geitgey 的介紹:http://suo.im/Wkp8B

五、對語音的序列本質(zhì)建模

長短期記憶(LSTM)是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種,它適用于對依賴長期順序的數(shù)據(jù)進行建模。它對于時間序列數(shù)據(jù)的建模非常重要,因為這種方法可以在當前時間點保持過去信息的記憶,從而改善輸出結(jié)果,所以,這種特性對于語音識別非常有用。如果你想了解在 TensorFlow 中如何實例化 LSTM 單元,以下是受 DeepSpeech 啟發(fā)的雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(BiRNN)的 LSTM 層示例代碼:

  1. with tf.name_scope('lstm'): 
  2.     # Forward direction cell: 
  3.     lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_cell_dim, forget_bias=1.0, state_is_tuple=True
  4.     # Backward direction cell: 
  5.     lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_cell_dim, forget_bias=1.0, state_is_tuple=True
  6.   
  7.     # Now we feed `layer_3` into the LSTM BRNN cell and obtain the LSTM BRNN output. 
  8.     outputs, output_states = tf.nn.bidirectional_dynamic_rnn( 
  9.         cell_fw=lstm_fw_cell
  10.         cell_bw=lstm_bw_cell
  11.         # Input is the previous Fully Connected Layer before the LSTM 
  12.         inputs=layer_3
  13.         dtype=tf.float32, 
  14.         time_major=True
  15.         sequence_length=seq_length
  16.   
  17.     tf.summary.histogram("activations", outputs) 

關(guān)于 LSTM 網(wǎng)絡(luò)的更多細節(jié),可以參閱 RNN 與 LSTM 單元運行細節(jié)的概述:

  • http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  • http://colah.github.io/posts/2015-08-Understanding-LSTMs/

此外,還有一些工作探究了 RNN 以外的其他語音識別方式,如比 RNN 計算效率更高的卷積層:https://arxiv.org/abs/1701.02720

六、訓(xùn)練和監(jiān)測網(wǎng)絡(luò)

因為示例中的網(wǎng)絡(luò)是使用 TensorFlow 訓(xùn)練的,我們可以使用 TensorBoard 的可視化計算圖監(jiān)視訓(xùn)練、驗證和進行性能測試。在 2017 TensorFlow Dev Summit 上 Dandelion Mane 給出了一些有用的幫助:https://www.youtube.com/watch?v=eBbEDRsCmv4

我們利用 tf.name_scope 添加節(jié)點和層名稱,并將摘要寫入文件,其結(jié)果是自動生成的、可理解的計算圖,正如下面的雙向神經(jīng)網(wǎng)絡(luò)(BiRNN)所示。數(shù)據(jù)從左下角到右上角在不同的操作之間傳遞。為了清楚起見,不同的節(jié)點可以用命名空間進行標記和著色。在這個例子中,藍綠色 fc 框?qū)?yīng)于完全連接的層,綠色 b 和 h 框分別對應(yīng)于偏差和權(quán)重。

雙向神經(jīng)網(wǎng)絡(luò)(BiRNN)

我們利用 TensorFlow 提供的 tf.train.AdamOptimizer 來控制學(xué)習(xí)速度。AdamOptimizer 通過使用動量(參數(shù)的移動平均數(shù))來改善傳統(tǒng)梯度下降,促進超參數(shù)動態(tài)調(diào)整。我們可以通過創(chuàng)建標簽錯誤率的摘要標量來跟蹤丟失和錯誤率:

  1. Create a placeholder for the summary statistics 
  2. with tf.name_scope("accuracy"): 
  3.     # Compute the edit (Levenshtein) distance of the top path 
  4.     distance = tf.edit_distance(tf.cast(self.decoded[0], tf.int32), self.targets) 
  5.   
  6.     # Compute the label error rate (accuracy) 
  7.     self.ler = tf.reduce_mean(distance, name='label_error_rate'
  8.     self.ler_placeholder = tf.placeholder(dtype=tf.float32, shape=[]) 
  9.     self.train_ler_op = tf.summary.scalar("train_label_error_rate", self.ler_placeholder) 
  10.     self.dev_ler_op = tf.summary.scalar("validation_label_error_rate", self.ler_placeholder) 
  11.     self.test_ler_op = tf.summary.scalar("test_label_error_rate", self.ler_placeholder) 

七、如何改進 RNN

現(xiàn)在我們構(gòu)建了一個簡單的 LSTM RNN 網(wǎng)絡(luò),下一個問題是:如何繼續(xù)改進它?幸運的是,在開源社區(qū)里,很多大公司都開源了自己的最新語音識別模型。在 2016 年 9 月,微軟的論文《The Microsoft 2016 Conversational Speech Recognition System》展示了在 NIST 200 Switchboard 數(shù)據(jù)中單系統(tǒng)殘差網(wǎng)絡(luò)錯誤率 6.9% 的新方式。他們在卷積+循環(huán)神經(jīng)網(wǎng)絡(luò)上使用了幾種不同的聲學(xué)和語言模型。微軟的團隊和其他研究人員在過去 4 年中做出的主要改進包括:

  • 在基于字符的 RNN 上使用語言模型
  • 使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)從音頻中獲取特征
  • 使用多個 RNN 模型組合

值得注意的是,在過去幾十年里傳統(tǒng)語音識別模型獲得的研究成果,在目前的深度學(xué)習(xí)語音識別模型中仍然扮演著自己的角色。

如何改進 RNN

修改自: A Historical Perspective of Speech Recognition, Xuedong Huang, James Baker, Raj Reddy Communications of the ACM, Vol. 57 No. 1, Pages 94-103, 2014

八、訓(xùn)練你的第一個 RNN 模型

在本教程的 Github 里,作者提供了一些介紹以幫助讀者在 TensorFlow 中使用 RNN 和 CTC 損失函數(shù)訓(xùn)練端到端語音識別系統(tǒng)。大部分事例數(shù)據(jù)來自 LibriVox。數(shù)據(jù)被分別存放于以下文件夾中:

  • Train: train-clean-100-wav (5 examples)
  • Test: test-clean-wav (2 examples)
  • Dev: dev-clean-wav (2 examples)

當訓(xùn)練這些示例數(shù)據(jù)時,你會很快注意到訓(xùn)練數(shù)據(jù)的詞錯率(WER)會產(chǎn)生過擬合,而在測試和開發(fā)集中詞錯率則有 85% 左右。詞錯率不是 100% 的原因在于每個字母有 29 種可能性(a-z、逗號、空格和空白),神經(jīng)網(wǎng)絡(luò)很快就能學(xué)會:

  • 某些字符(e,a,空格,r,s,t)比其他的更常見
  • 輔音-元音-輔音是英文的構(gòu)詞特征
  • MFCC 輸入聲音信號振幅特征的增加只與字母 a-z 有關(guān)

使用 Github 中默認設(shè)置的訓(xùn)練結(jié)果如下:

使用 Github 中默認設(shè)置的訓(xùn)練結(jié)果

如果你想訓(xùn)練一個更強大的模型,你可以添加額外的.wav 和.txt 文件到這些文件夾里,或創(chuàng)建一個新的文件夾,并更新 configs / neural_network.ini 的文件夾位置。注意:幾百小時的音頻也需要大量時間來進行訓(xùn)練,即使你有一塊強大的 GPU。

 

原文:https://svds.com/tensorflow-rnn-tutorial/

【本文是51CTO專欄機構(gòu)機器之心的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】

 

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-08-29 13:50:03

TensorFlow深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-08-28 21:31:37

TensorFlow深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2018-08-27 17:05:48

tensorflow神經(jīng)網(wǎng)絡(luò)圖像處理

2018-03-22 13:34:59

TensorFlow神經(jīng)網(wǎng)絡(luò)

2023-05-12 14:58:50

Java神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)

2023-05-06 12:47:41

2017-09-28 16:15:12

神經(jīng)網(wǎng)絡(luò)訓(xùn)練多層

2017-12-22 08:47:41

神經(jīng)網(wǎng)絡(luò)AND運算

2022-07-28 09:00:00

深度學(xué)習(xí)網(wǎng)絡(luò)類型架構(gòu)

2023-01-06 19:19:16

TensorFlow

2017-08-25 14:23:44

TensorFlow神經(jīng)網(wǎng)絡(luò)文本分類

2017-08-04 14:23:04

機器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)TensorFlow

2017-11-24 08:00:06

深度學(xué)習(xí)TensorFlow預(yù)測股票

2017-06-19 15:12:30

Uber神經(jīng)網(wǎng)絡(luò)事件預(yù)測

2022-05-20 11:01:06

模型性能框架

2018-12-14 08:02:55

神經(jīng)網(wǎng)絡(luò)機器學(xué)習(xí)二值模型

2022-10-19 07:42:41

圖像識別神經(jīng)網(wǎng)絡(luò)

2018-07-29 06:46:07

神經(jīng)網(wǎng)絡(luò)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)

2020-08-06 10:11:13

神經(jīng)網(wǎng)絡(luò)機器學(xué)習(xí)算法

2017-09-26 10:09:55

EpochBatch Size神經(jīng)網(wǎng)絡(luò)
點贊
收藏

51CTO技術(shù)棧公眾號