<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 六、TensorFlow 和 Keras 中的 RNN 在涉及有序數據序列的問題中,例如**時間序列預測**和**自然語言處理**,上下文對于預測輸出非常有價值。可以通過攝取整個序列而不僅僅是最后一個數據點來確定這些問題的上下文。因此,先前的輸出成為當前輸入的一部分,并且當重復時,最后的輸出結果是所有先前輸入的結果以及最后一個輸入。 **循環神經網絡**(**RNN**)架構是用于處理涉及序列的機器學習問題的解決方案。 **循環神經網絡**(**RNN**)是一種用于處理順序數據的專用神經網絡架構。順序數據可以是一段時間內的觀察序列,如時間序列數據,或字符序列,單詞和句子,如文本數據。 標準神經網絡的一個假設是,輸入數據的排列方式是一個輸入不依賴于另一個輸入。然而,對于時間序列數據和文本數據,該假設不成立,因為序列中稍后出現的值通常受到之前出現的值的影響。 為了實現這一目標,RNN 通過以下方式擴展了標準神經網絡: * 通過在計算圖中添加循環或循環,RNN 增加了將一個層的輸出用作相同或前一層的輸入的特性。 * RNN 添加存儲器單元以存儲可在當前計算中使用的先前輸入和輸出。 在本章中,我們將介紹以下有關 RNN 的主題: * 簡單的循環神經網絡 * RNN 變種 * LSTM * GRU * TensorFlow 中的 RNN * Keras 中的 RNN * Keras 中用于 MNIST 數據的 RNN 接下來的兩章將介紹在 TensorFlow 和 Keras 中為時間序列和文本(NLP)數據構建 RNN 模型的實際示例。 # 簡單循環神經網絡 這是一個帶循環的簡單神經網絡: ![](https://img.kancloud.cn/6c/cd/6ccdfdf3d073036df12a431546313814_280x146.png)RNN Network 在該圖中,神經網絡`N`接受輸入`x[t]`以產生輸出`y[t]`。由于循環,在下一步`t+1`,輸入`y[t]`和輸入`x[t+1]`產生輸出`y[t+1]`。在數學上,我們將其表示為以下等式: ![](https://img.kancloud.cn/02/13/0213a112b9db125c789b6de48176f976_2620x250.png) 當我們展開循環時,RNN 架構在時間步`t1`看起來如下: ![](https://img.kancloud.cn/81/d5/81d5ac11c8bc4b4bde6d467c71a04c4a_246x149.png) 隨著時間步長的發展,這個循環在時間步驟 5 展開如下: ![](https://img.kancloud.cn/57/67/57678316931ad2b0ce2f8c54d3cef8df_830x136.png) 在每個時間步驟,使用相同的學習函數`φ(·)`和相同的參數,`w`和`b`。 輸出`y`并不總是在每個時間步產生。相反,在每個時間步產生輸出`h`,并且對該輸出`h`應用另一個激活函數以產生輸出`y`。 RNN 的等式現在看起來像這樣: ![](https://img.kancloud.cn/68/c9/68c96ded17fab656e505dc7bf0972912_3010x250.png) ![](https://img.kancloud.cn/13/b4/13b4e64c26ade55217d23ab964bb2220_1870x250.png) 其中, * `w(hx)`是連接到隱藏層的`x`輸入的權重向量 * `w(hh)`是來自前一時間步的`h`的值的權重向量 * `w(yh)`是連接隱藏層和輸出層的層的權重向量 * 用于`h[t]`的函數通常是非線性函數,例如 tanh 或 ReLU 在 RNN 中,在每個時間步使用相同的參數`w(hx), w(hh), w(yh), b(h), b(y)`。這一事實大大減少了我們需要學習的基于序列模型的參數數量。 由此, RNN 在時間步`t5`如下展開,假設輸出`y`僅在時間步`t5`產生: ![](https://img.kancloud.cn/08/5a/085a42ea3df1f086d525f43e7078db5f_835x289.png) 簡單的 RNN 由 Elman 在 1990 年引入,因此它也被稱為 Elman 網絡。然而,簡單的 RNN 無法滿足我們今天的處理需求,因此我們將在下一節中了解 RNN 的變體。 閱讀 Elman 的原始研究論文,了解 RNN 架構的起源: ``` J. L. Elman, Finding Structure in Time, Cogn. Sci., vol. 14, no. 2, pp. 179–211, 1990. ``` # RNN 變種 RNN 架構已經以多種方式擴展,以適應某些問題中的額外需求,并克服簡單 RNN 模型的缺點。我們列出了下面的 RNN 架構的一些主要擴展。 * **雙向 RNN**(**BRNN**)用于輸出依賴于序列的前一個和后一個元素的情況。 BRNN 通過堆疊兩個 RNN(稱為前向和后向層)來實現,輸出是前向和后向層 RNN 的隱藏狀態的結果。在前向層中,存儲器狀態 h 從時間步長`t`流向時間步長`t + 1`,并且在后向層中,存儲器狀態從時間步長`t`流出。到時間步`t-1`。兩個層在時間步`t`時采用相同的輸入`x[t]`,但它們在時間步`t`共同產生輸出。 * **深雙向 RNN**(**DBRNN**)通過添加多個層進一步擴展 BRNN。 BRNN 在時間維度上隱藏了層或單元。但是,通過堆疊 BRNN,我們可以在 DBRNN 中獲得分層表示。其中一個顯著差異是,在 BRNN 中,我們對同一層中的每個單元使用相同的參數,但在 DBRNN 中,我們對每個堆疊層使用不同的參數。 * **長短期記憶**(**LSTM**)網絡通過使用涉及多個非線性函數而不是一個簡單非線性函數的架構來擴展 RNN 隱藏狀態。 LSTM 由稱為**單元**的黑盒組成,取三個輸入:時間`t-1`的工作記憶(`h[t-1]`),當前輸入(`x[t]`)和時間`t-1`的長期記憶(`c[t-1]`),并產生兩個輸出:更新的工作記憶(`h[t]`)和長期記憶(`c[t]`)。單元使用稱為門的函數來決定從記憶中選擇性地保存和擦除的內容。我們在下面的部分中詳細描述了 LSTM。 閱讀以下關于 LSTM 的研究論文,以獲得有關 LSTM 起源的更多信息: ``` S. Hochreiter and J. Schmidhuber, Long Short-Term Memory, Neural Comput., vol. 9, no. 8, pp. 1735–1780, 1997.http://www.bioinf.jku.at/publications/older/2604.pdf ``` * **門控循環單元**(**GRU**)網絡是 LSTM 的簡化變體。 結合遺忘和輸入的功能,在更簡單的更新門中進行門控。它還將隱藏狀態和單元狀態組合成一個單一狀態。因此,與 LSTM 相比,GRU 在計算上更便宜。 我們在下面的部分中詳細描述了 GRU。 閱讀以下研究論文以探索 GRU 的更多細節: ``` K. Cho, B. van Merrienboer, C. Gulcehre, D. Bahdanau, F. Bougares, H. Schwenk, and Y. Bengio, Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation, 2014.https://arxiv.org/abs/1406.1078 J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling, pp. 1–9, 2014.?https://arxiv.org/abs/1412.3555 ``` * **seq2seq** 模型將編碼器 - 解碼器架構與 RNN 架構相結合。在 Seq2Seq 架構中,模型訓練數據序列,例如文本數據或時間序列數據,然后該模型用于生成輸出序列。例如,在英文文本上訓練模型,然后從模型生成西班牙文本。 Seq2Seq 模型由編碼器和解碼器模型組成,它們都使用 RNN 架構構建。可以堆疊 Seq2Seq 模型以構建分層多層模型。 # LSTM 網絡 當 RNN 在很長的數據序列上進行訓練時,梯度往往變得非常大或非常小,它們會消失到幾乎為零。 **長短期記憶**(**LSTM**)網絡通過添加用于控制對過去信息的訪問的門,來解決消失/爆炸梯度問題。 LSTM 概念最初由 Hochreiter 和 Schmidhuber 在 1997 年引入。 閱讀以下關于 LSTM 的研究論文,以獲得有關 LSTM 起源的更多信息: ``` S. Hochreiter and J. Schmidhuber, Long Short-Term Memory, Neural Comput., vol. 9, no. 8, pp. 1735–1780, 1997.?http://www.bioinf.jku.at/publications/older/2604.pdf ``` 在 RNN 中,使用重復使用的學習函數`φ`的單個神經網絡層,而在 LSTM 中,使用由四個主要函數組成的重復模塊。構建 LSTM 網絡的模塊稱為**單元**。 LSTM 單元通過選擇性地學習或擦除信息,有助于在長序列通過時更有效地訓練模型。組成單元的函數也稱為門,因為它們充當傳入和傳出單元的信息的網守。 LSTM 模型有兩種記憶: * 用`h`(隱藏狀態)表示的工作記憶 * 用`c`(單元狀態)表示的長期記憶。 單元狀態或長期記憶僅在兩個線性相互作用下從一個單元流向另一個單元。 LSTM 將信息添加到長期記憶中,或通過門從長期記憶中刪除信息。 下圖描繪了 LSTM 單元: ![](https://img.kancloud.cn/bb/13/bb13365db9fef1090fb56aff3cedcfd2_585x294.png)The LSTM Cell 通過 LSTM 單元中的門的內部流動如下: 1. **遺忘門(或記憶門)`f()`**:`h[t-1]`和`x[t]`按照以下等式作為輸入流向`f()`門: ![](https://img.kancloud.cn/8a/65/8a655dbd361fb199051c2b4e738cc25b_3110x250.png) 遺忘門的功能是決定忘記哪些信息以及要記住哪些信息。這里使用`sigmoid`激活函數,因此輸出 1 表示信息被轉移到單元內的下一步驟,輸出 0 表示信息被選擇性地丟棄。 2. **輸入門(或保存門)`i()`**:`h[t-1]`和`x[t]`按照以下等式作為輸入流向`i()`門: ![](https://img.kancloud.cn/a7/be/a7be20576686a8cfa6101f3b4605dbc3_2990x250.png) 輸入門的功能是決定是保存還是丟棄輸入。輸入功能還允許單元了解要保留或丟棄的候選存儲器的哪個部分。 3. **候選長期記憶**:候選長期記憶由`h[t-1]`和`x[t]`使用激活函數計算,主要是`tanh`,按照下式: ![](https://img.kancloud.cn/8f/aa/8faa3cba23f7a8e89a9644ec2aa19506_3400x250.png) 4. 接下來,組合前面的三個計算以得到更新長期記憶,由`c[t]`表示,如下式所示: ![](https://img.kancloud.cn/3c/b4/3cb432ab4024ee2294430dfbdb87610d_2250x210.png) 5. **輸出門(或聚焦/關注門)`o()`**:`h[t-1]`和`x[t]`按照以下等式作為輸入流向`o()`門: ![](https://img.kancloud.cn/b1/7b/b17ba5e7e9d25622887b6725664ee1ca_3070x250.png) 輸出門的功能是決定多少信息可用于更新工作記憶。 6. 接下來,工作記憶`h[t]`從長期記憶`c[t]`和焦點/注意力向量更新,如下式所示: ![](https://img.kancloud.cn/ae/54/ae54ee2485b5b339b7268acf6ac25f3b_1350x210.png) 其中`φ(·)`是激活函數,通常是`tanh`。 # GRU 網絡 LSTM 網絡的計算成本很高,因此,研究人員發現了一種幾乎同樣有效的 RNN 配置,稱為**門控循環單元**(**GRU**)架構。 在 GRU 中,不使用工作和長期記憶,只使用一種記憶,用`h`(隱藏狀態)表示。 GRU 單元通過**復位**和**更新**門,將信息添加到此狀態存儲器,或從該狀態存儲器中刪除信息。 下圖描繪了 GRU 單元(說明如下圖): ![](https://img.kancloud.cn/15/9d/159d9a967f41dc73fe775808a432ac9c_367x295.png)The GRU Cell GRU 單元中通過門的內部流量如下: 1. **更新門`u()`**:輸入`h[t-1]`和`x[t]`按照以下公式流向`u()`門: ![](https://img.kancloud.cn/15/a9/15a9e40cb90b47037bb48a82abcc31a1_3120x250.png) 2. **復位門`r()`**:輸入`h[t-1]`和`x[t]`按照以下公式流向`r()`門: ![](https://img.kancloud.cn/8b/e9/8be9f122f2bc514ab1158b26dcb0d74b_3050x250.png) 1. **候選狀態記憶**:候選長期記憶是根據`r()`門,`h[t-1]`和`x[t]`的輸出計算出來的,按照下列公式: ![](https://img.kancloud.cn/b5/fa/b5fa80aadfa8816c89cfd326e85a433d_3830x270.png) 2. 接下來,組合前面的三個計算以得到更新的狀態存儲器,由`h[t]`,表示,如下式所示: ![](https://img.kancloud.cn/89/6e/896e27b367dda345bf3df35c60e8ff17_2530x240.png) 閱讀以下研究論文以探索 GRU 的更多細節: ``` K. Cho, B. van Merrienboer, C. Gulcehre, D. Bahdanau, F. Bougares, H. Schwenk, and Y. Bengio, Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation, 2014.?https://arxiv.org/abs/1406.1078 J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling, pp. 1–9, 2014.?https://arxiv.org/abs/1412.3555 ``` # TensorFlow RNN 在低級 TensorFlow 庫中創建 RNN 模型的基本工作流程與 MLP 幾乎相同: * 首先創建形狀的輸入和輸出占位符`(None, #TimeSteps, #Features)`或`(批量大小, #TimeSteps, #Features)` * 從輸入占位符中,創建一個長度為`#TimeSteps`的列表,其中包含形狀的張量`(None, #特征)`或`(批量大小, #特征)` * 從`tf.rnn.rnn_cell`模塊創建所需 RNN 類型的單元 * 使用先前創建的單元和輸入張量列表來創建靜態或動態 RNN * 創建輸出權重和偏差變量,并定義損失和優化器函數 * 對于所需的周期數,使用損失和優化器函數訓練模型 這個基本工作流程將在下一章的示例代碼中演示。讓我們看看可用于支持先前工作流程的各種類。 # TensorFlow RNN 單元類 `tf.nn.rnn_cell`模塊包含以下用于在 TensorFlow 中創建不同類型單元的類: | **類** | **描述** | | --- | --- | | `BasicRNNCell` | 提供 RNN 單元的實現 | | `BasicLSTMCell` | 提供 LSTM RNN 單元的實現,基于[這個頁面](http://arxiv.org/abs/1409.2329) | | `LSTMCell` | 提供 LSTM RNN 單元,基于[這個頁面](http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf)和[這個頁面](https://research.google.com/pubs/archive/43905.pdf) | | `GRUCell` | 提供 GRU RNN 單元,基于[這個頁面](http://arxiv.org/abs/1406.1078) | | `MultiRNNCell` | 提供由連續連接的多個簡單單元組成的 RNN 單元 | `tf.contrib.rnn`模塊提供以下額外的類用于在 TensorFlow 中創建不同類型的單元: | **類** | **描述** | | --- | --- | | `LSTMBlockCell` | 提供塊 LSTM RNN 單元,基于[這個頁面](http://arxiv.org/abs/1409.2329) | | `LSTMBlockFusedCell` | 提供塊融合 LSTM RNN 單元,基于[這個頁面](http://arxiv.org/abs/1409.2329) | | `GLSTMCell` | 提供分組 LSTM 單元,基于[這個頁面](https://arxiv.org/abs/1703.10722) | | `GridLSTMCell` | 提供網格 LSTM RNN 單元,基于[這個頁面](http://arxiv.org/abs/1507.01526) | | `GRUBlockCell` | 提供塊 GRU RNN 單元,基于[這個頁面](http://arxiv.org/abs/1406.1078) | | `BidirectionalGridLSTMCell` | 僅在頻率上而不是在時間上提供雙向網格 LSTM | | `NASCell` | 提供神經架構搜索 RNN 單元,基于[這個頁面](https://arxiv.org/abs/1611.01578) | | `UGRNNCell` | 提供更新門 RNN 單元,基于[這個頁面](https://arxiv.org/abs/1611.09913) | # TensorFlow RNN 模型構建類 TensorFlow 提供了從 RNN 單元對象創建 RNN 模型的類。靜態 RNN 類在編譯時為時間步驟添加展開的單元,而動態 RNN 類在運行時添加展開的單元用于時間步長。 * `tf.nn.static_rnn` * `tf.nn.static_state_saving_rnn` * `tf.nn.static_bidirectional_rnn` * `tf.nn.dynamic_rnn` * `tf.nn.bidirectional_dynamic_rnn` * `tf.nn.raw_rnn` * `tf.contrib.rnn.stack_bidirectional_dynamic_rnn` # TensorFlow RNN 單元包裝器類 TensorFlow 還提供包裝其他單元類的類: * `tf.contrib.rnn.LSTMBlockWrapper` * `tf.contrib.rnn.DropoutWrapper` * `tf.contrib.rnn.EmbeddingWrapper` * `tf.contrib.rnn.InputProjectionWrapper` * `tf.contrib.rnn.OutputProjectionWrapper` * `tf.contrib.rnn.DeviceWrapper` * `tf.contrib.rnn.ResidualWrapper` 有關 TensorFlow 中 RNN 的最新文檔,[請訪問此鏈接](https://www.tensorflow.org/api_guides/python/contrib.rnn)。 # Keras 中的 RNN 與 TensorFlow 相比,在 Keras 中創建 RNN 要容易得多。正如您在第 3 章中學到的,Keras 提供了用于創建循環網絡的函數式和順序 API。要構建 RNN 模型,您必須從`kera.layers.recurrent`模塊添加層。 Keras 在`keras.layers.recurrent`模塊中提供以下類型的循環層: * `SimpleRNN` * LSTM * GRU **有狀態模型** Keras 循環層還支持 RNN 模型,可在批次之間保存狀態。您可以通過將`stateful`參數作為`True`傳遞來創建有狀態 RNN,LSTM 或 GRU 模型。對于有狀態模型,為輸入指定的批量大小必須是固定值。在有狀態模型中,從訓練批次中學到的隱藏狀態將重新用于下一批。如果您想在訓練期間的某個時刻重置記憶,可以通過調用`model.reset_states()`或`layer.reset_states()`函數使用額外的代碼來完成。 我們將在下一章中看到使用 Keras 構建 RNN 的示例。 [有關 Keras 循環層的最新文檔可在此鏈接中找到](https://keras.io/layers/recurrent/)。 # RNN 的應用領域 RNN 更頻繁使用的一些應用領域如下: * **自然語言模型**:RNN 模型已用于自然語言處理(NLP),用于自然語言理解和自然語言生成任務。在 NLP 中,RNN 模型被給予一系列單詞并且它預測另一個單詞序列。因此,訓練的模型可用于生成單詞序列,稱為文本生成的字段。例如,生成故事和劇本。 NLP 的另一個領域是語言翻譯,其中給定一種語言的一系列單詞,該模型預測另一種語言的單詞序列。 * **語音和語音識別**:RNN 模型非常適用于構建模擬音頻數據的模型。在語音識別中,RNN 模型被給予音頻數據并且它預測一系列語音片段。它可用于訓練模型以識別語音命令,甚至用于與基于語音的聊天機器人的對話。 * **圖像/視頻描述或字幕生成**:RNN 模型可與 CNN 結合使用,以生成圖像和視頻中找到的元素的描述。這些描述也可用于生成圖像和視頻的標題。 * **時間序列數據**:最重要的是,RNN 對時間序列數據非常有用。大多數傳感器和系統生成時間順序很重要的數據。 RNN 模型非常適合于查找模式和預測此類數據。 通過此鏈接了解有關 RNN 的更多信息: <http://karpathy.github.io/2015/05/21/rnn-effectiveness/> <http://colah.github.io/posts/2015-08-Understanding-LSTMs/> <http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/> <https://r2rt.com/written-memories-understanding-deriving-and-extending-the-lstm.html> # Keras 中的用于 MNIST 數據的 RNN 雖然 RNN 主要用于序列數據,但它也可用于圖像數據。我們知道圖像具有最小的兩個維度 - 高度和寬度。現在將其中一個維度視為時間步長,將其他維度視為特征。對于 MNIST,圖像大小為`28 x 28`像素,因此我們可以將 MNIST 圖像視為具有 28 個時間步長,每個時間步長具有 28 個特征。 我們將在下一章中提供時間序列和文本數據的示例,但讓我們為 Keras 中的 MNIST 構建和訓練 RNN,以快速瀏覽構建和訓練 RNN 模型的過程。 您可以按照 Jupyter 筆記本中的代碼`ch-06_RNN_MNIST_Keras`。 導入所需的模塊: ```py import keras from keras.models import Sequential from keras.layers import Dense, Activation from keras.layers.recurrent import SimpleRNN from keras.optimizers import RMSprop from keras.optimizers import SGD ``` 獲取 MNIST 數據并將數據從 1D 中的 784 像素轉換為 2D 中的`28 x 28`像素: ```py from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets(os.path.join(datasetslib.datasets_root, 'mnist'), one_hot=True) X_train = mnist.train.images X_test = mnist.test.images Y_train = mnist.train.labels Y_test = mnist.test.labels n_classes = 10 n_classes = 10 X_train = X_train.reshape(-1,28,28) X_test = X_test.reshape(-1,28,28) ``` 在 Keras 構建`SimpleRNN`模型: ```py # create and fit the SimpleRNN model model = Sequential() model.add(SimpleRNN(units=16, activation='relu', input_shape=(28,28))) model.add(Dense(n_classes)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=0.01), metrics=['accuracy']) model.summary() ``` 該模型如下: ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= simple_rnn_1 (SimpleRNN) (None, 16) 720 _________________________________________________________________ dense_1 (Dense) (None, 10) 170 _________________________________________________________________ activation_1 (Activation) (None, 10) 0 ================================================================= Total params: 890 Trainable params: 890 Non-trainable params: 0 _________________________________________________________________ ``` 訓練模型并打印測試數據集的準確率: ```py model.fit(X_train, Y_train, batch_size=100, epochs=20) score = model.evaluate(X_test, Y_test) print('\nTest loss:', score[0]) print('Test accuracy:', score[1]) ``` 我們得到以下結果: ```py Test loss: 0.520945608187 Test accuracy: 0.8379 ``` # 總結 在本章中,我們了解了循環神經網絡(RNN)。我們了解了 RNN 的各種變體,并詳細描述了其中的兩個:長短期記憶(LSTM)網絡和門控循環單元(GRU)網絡。我們還描述了可用于在 TensorFlow 和 Keras 中構建 RNN 單元,模型和層的類。我們構建了一個簡單的 RNN 網絡,用于對 MNIST 數據集的數字進行分類。 在下一章中,我們將學習如何構建和訓練時間序列數據的 RNN 模型。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看