<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 6種卷積神經(jīng)網(wǎng)絡(luò )壓縮方法

6種卷積神經(jīng)網(wǎng)絡(luò )壓縮方法

發(fā)布人:數據派THU 時(shí)間:2023-04-24 來(lái)源:工程師 發(fā)布文章
神經(jīng)網(wǎng)絡(luò )的壓縮算法是,旨在將一個(gè)龐大而復雜的預訓練模型(pre-trained model)轉化為一個(gè)精簡(jiǎn)的小模型。


按照壓縮過(guò)程對網(wǎng)絡(luò )結構的破壞程度,我們將模型壓縮技術(shù)分為 “前端壓縮” 和 “后端壓縮” 兩部分。

  • 前端壓縮,是指在不改變原網(wǎng)絡(luò )結構的壓縮技術(shù),主要包括知識蒸餾、輕量級網(wǎng)絡(luò )(緊湊的模型結構設計)以及濾波器(filter)層面的剪枝(結構化剪枝)等;
  • 后端壓縮,是指包括低秩近似、未加限制的剪枝(非結構化剪枝 / 稀疏)、參數量化以及二值網(wǎng)絡(luò )等,目標在于盡可能減少模型大小,會(huì )對原始網(wǎng)絡(luò )結構造成極大程度的改造。

總結:前端壓縮幾乎不改變原有網(wǎng)絡(luò )結構(僅僅只是在原模型基礎上減少了網(wǎng)絡(luò )的層數或者濾波器個(gè)數),后端壓縮對網(wǎng)絡(luò )結構有不可逆的大幅度改變,造成原有深度學(xué)習庫、甚至硬件設備不兼容改變之后的網(wǎng)絡(luò )。其維護成本很高。
一、低秩近似
簡(jiǎn)單理解就是,卷積神經(jīng)網(wǎng)絡(luò )的權重矩陣往往稠密且巨大,從而計算開(kāi)銷(xiāo)大,有一種辦法是采用低秩近似的技術(shù)將該稠密矩陣由若干個(gè)小規模矩陣近似重構出來(lái),這種方法歸類(lèi)為低秩近似算法。
一般地,行階梯型矩陣的秩等于其 “臺階數”- 非零行的行數。
低秩近似算法能減小計算開(kāi)銷(xiāo)的原理如下:
圖片
基于以上想法,Sindhwani 等人提出使用結構化矩陣來(lái)進(jìn)行低秩分解的算法,具體原理可自行參考論文。另一種比較簡(jiǎn)便的方法是使用矩陣分解來(lái)降低權重矩陣的參數,如 Denton 等人提出使用奇異值分解(Singular Value Decomposition,簡(jiǎn)稱(chēng) SVD)分解來(lái)重構全連接層的權重。
1.1 總結
低秩近似算法在中小型網(wǎng)絡(luò )模型上,取得了很不錯的效果,但其超參數量與網(wǎng)絡(luò )層數呈線(xiàn)性變化趨勢,隨著(zhù)網(wǎng)絡(luò )層數的增加與模型復雜度的提升,其搜索空間會(huì )急劇增大,目前主要是學(xué)術(shù)界在研究,工業(yè)界應用不多。
二、剪枝與稀疏約束
給定一個(gè)預訓練好的網(wǎng)絡(luò )模型,常用的剪枝算法一般都遵從如下操作:
  1. 衡量神經(jīng)元的重要程度;
  2. 移除掉一部分不重要的神經(jīng)元,這步比前 1 步更加簡(jiǎn)便,靈活性更高;
  3. 對網(wǎng)絡(luò )進(jìn)行微調,剪枝操作不可避免地影響網(wǎng)絡(luò )的精度,為防止對分類(lèi)性能造成過(guò)大的破壞,需要對剪枝后的模型進(jìn)行微調。對于大規模行圖像數據集(如 ImageNet)而言,微調會(huì )占用大量的計算資源,因此對網(wǎng)絡(luò )微調到什么程度,是需要斟酌的;
  4. 返回第一步,循環(huán)進(jìn)行下一輪剪枝。

基于以上循環(huán)剪枝框架,不同學(xué)者提出了不同的方法,Han 等人提出首先將低于某個(gè)閾值的權重連接全部剪除,之后對剪枝后的網(wǎng)絡(luò )進(jìn)行微調以完成參數更新的方法,這種方法的不足之處在于,剪枝后的網(wǎng)絡(luò )是非結構化的,即被剪除的網(wǎng)絡(luò )連接在分布上,沒(méi)有任何連續性,這種稀疏的結構,導致 CPU 高速緩沖與內存頻繁切換,從而限制了實(shí)際的加速效果。
基于此方法,有學(xué)者嘗試將剪枝的粒度提升到整個(gè)濾波器級別,即丟棄整個(gè)濾波器,但是如何衡量濾波器的重要程度是一個(gè)問(wèn)題,其中一種策略是基于濾波器權重本身的統計量,如分別計算每個(gè)濾波器的 L1 或 L2 值,將相應數值大小作為衡量重要程度標準。
利用稀疏約束來(lái)對網(wǎng)絡(luò )進(jìn)行剪枝也是一個(gè)研究方向,其思路是在網(wǎng)絡(luò )的優(yōu)化目標中加入權重的稀疏正則項,使得訓練時(shí)網(wǎng)絡(luò )的部分權重趨向于 0 ,而這些 0 值就是剪枝的對象。
2.1 總結


總體而言,剪枝是一項有效減小模型復雜度的通用壓縮技術(shù),其關(guān)鍵之處在于如何衡量個(gè)別權重對于整體模型的重要程度。剪枝操作對網(wǎng)絡(luò )結構的破壞程度極小,將剪枝與其他后端壓縮技術(shù)相結合,能夠達到網(wǎng)絡(luò )模型最大程度壓縮,目前工業(yè)界有使用剪枝方法進(jìn)行模型壓縮的案例。
三、參數量化


相比于剪枝操作,參數量化則是一種常用的后端壓縮技術(shù)。所謂 “量化”,是指從權重中歸納出若干 “代表”,由這些 “代表” 來(lái)表示某一類(lèi)權重的具體數值?!按怼?被存儲在碼本(codebook)之中,而原權重矩陣只需記錄各自 “代表” 的索引即可,從而極大地降低了存儲開(kāi)銷(xiāo)。這種思想可類(lèi)比于經(jīng)典的詞包模型(bag-of-words model)。常用量化算法如下:
  1. 標量量化(scalar quantization)。
  2. 標量量化會(huì )在一定程度上降低網(wǎng)絡(luò )的精度,為避免這個(gè)弊端,很多算法考慮結構化的向量方法,其中一種是乘積向量(Product Quantization, PQ),詳情咨詢(xún)查閱論文。
  3. 以 PQ 方法為基礎,Wu 等人設計了一種通用的網(wǎng)絡(luò )量化算法:QCNN (quantized CNN),主要思想在于 Wu 等人認為最小化每一層網(wǎng)絡(luò )輸出的重構誤差,比最小化量化誤差更有效。

圖片
圖片
這樣,只需將 kk 個(gè)聚類(lèi)中心(cjcj,標量)存儲在碼本中,而原權重矩陣則只負責記錄各自聚類(lèi)中心在碼本中索引。如果不考慮碼本的存儲開(kāi)銷(xiāo),該算法能將存儲空間減少為原來(lái)的 log2 (k)/32log2(k)/32?;?kk 均值算法的標量量化在很多應用中非常有效。參數量化與碼本微調過(guò)程圖如下:
圖片
這三類(lèi)基于聚類(lèi)的參數量化算法,其本質(zhì)思想在于將多個(gè)權重映射到同一個(gè)數值,從而實(shí)現權重共享,降低存儲開(kāi)銷(xiāo)的目的。
3.1 總結
參數量化是一種常用的后端壓縮技術(shù),能夠以很小的性能損失實(shí)現模型體積的大幅下降,不足之處在于,量化的網(wǎng)絡(luò )是 “固定” 的,很難對其做任何改變,同時(shí)這種方法通用性差,需要配套專(zhuān)門(mén)的深度學(xué)習庫來(lái)運行網(wǎng)絡(luò )。
這里,權重參數從浮點(diǎn)轉定點(diǎn)、二值化等方法都是是試圖避免浮點(diǎn)計算耗時(shí)而引入的方法,這些方法能加快運算速率,同時(shí)減少內存和存儲空間的占用,并保證模型的精度損失在可接受的范圍內,因此這些方法的應用是有其現實(shí)價(jià)值的。
更多參數量化知識,請參考此 github 倉庫:https://github.com/Ewenwan/MVision/blob/master/CNN/Deep_Compression/quantization/readme.md
四、二值化網(wǎng)絡(luò )


1. 二值化網(wǎng)絡(luò )可以視為量化方法的一種極端情況:所有的權重參數取值只能為 ±1±1 ,也就是使用 1bit 來(lái)存儲 Weight 和 Feature。在普通神經(jīng)網(wǎng)絡(luò )中,一個(gè)參數是由單精度浮點(diǎn)數來(lái)表示的,參數的二值化能將存儲開(kāi)銷(xiāo)降低為原來(lái)的 1/32。
2. 二值化神經(jīng)網(wǎng)絡(luò )以其高的模型壓縮率和在前傳中計算速度上的優(yōu)勢,近幾年格外受到重視和發(fā)展,成為神經(jīng)網(wǎng)絡(luò )模型研究中的非常熱門(mén)的一個(gè)研究方向。但是,第一篇真正意義上將神經(jīng)網(wǎng)絡(luò )中的權重值和激活函數值同時(shí)做到二值化的是 Courbariaux 等人 2016 年發(fā)表的名為《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》的一篇論文。這篇論文第一次給出了關(guān)于如何對網(wǎng)絡(luò )進(jìn)行二值化和如何訓練二值化神經(jīng)網(wǎng)絡(luò )的方法。
3.CNN 網(wǎng)絡(luò )一個(gè)典型的模塊是由卷積 (Conv)-> 批標準化 (BNorm)-> 激活 (Activ)-> 池化 (Pool) 這樣的順序操作組成的。對于異或神經(jīng)網(wǎng)絡(luò ),設計出的模塊是由批標準化 (BNorm)-> 二值化激活 (BinActiv)-> 二值化卷積 (BinConv)-> 池化 (Pool) 的順序操作完成。這樣做的原因是批標準化以后,保證了輸入均值為 0,然后進(jìn)行二值化激活,保證了數據為 -1 或者 +1,然后進(jìn)行二值化卷積,這樣能最大程度上減少特征信息的損失。二值化殘差網(wǎng)絡(luò )結構定義實(shí)例代碼如下:












def residual_unit(data, num_filter, stride, dim_match, num_bits=1): """殘差塊 Residual Block 定義    """    bnAct1 = bnn.BatchNorm(data=data, num_bits=num_bits)    conv1 = bnn.Convolution(data=bnAct1, num_filter=num_filter, kernel=(3, 3), stride=stride, pad=(1, 1))    convBn1 = bnn.BatchNorm(data=conv1, num_bits=num_bits)    conv2 = bnn.Convolution(data=convBn1, num_filter=num_filter, kernel=(3, 3), stride=(1, 1), pad=(1, 1)) if dim_match:        shortcut = data else:        shortcut = bnn.Convolution(data=bnAct1, num_filter=num_filter, kernel=(3, 3), stride=stride, pad=(1, 1)) return conv2 + shortcut

4.1 二值網(wǎng)絡(luò )的梯度下降


現在的神經(jīng)網(wǎng)絡(luò )幾乎都是基于梯度下降算法來(lái)訓練的,但是二值網(wǎng)絡(luò )的權重只有 ±1±1,無(wú)法直接計算梯度信息,也無(wú)法進(jìn)行權重更新。為解決這個(gè)問(wèn)題,Courbariaux 等人提出二值連接(binary connect)算法,該算法采取單精度與二值結合的方式來(lái)訓練二值神經(jīng)網(wǎng)絡(luò ),這是第一次給出了關(guān)于如何對網(wǎng)絡(luò )進(jìn)行二值化和如何訓練二值化神經(jīng)網(wǎng)絡(luò )的方法。過(guò)程如下:
1. 權重 weight 初始化為浮點(diǎn)。2. 前向傳播 Forward Pass:
    • 利用決定化方式(sign (x) 函數)把 Weight 量化為 +1/-1, 以 0 為閾值。
    • 利用量化后的 Weight (只有 + 1/-1) 來(lái)計算前向傳播,由二值權重與輸入進(jìn)行卷積運算(實(shí)際上只涉及加法),獲得卷積層輸出。
3. 反向傳播 Backward Pass:
    • 把梯度更新到浮點(diǎn)的 Weight 上(根據放松后的符號函數,計算相應梯度值,并根據該梯度的值對單精度的權重進(jìn)行參數更新)。
    • 訓練結束:把 Weight 永久性轉化為 +1/-1, 以便 inference 使用。

4.2 兩個(gè)問(wèn)題


網(wǎng)絡(luò )二值化需要解決兩個(gè)問(wèn)題:如何對權重進(jìn)行二值化和如何計算二值權重的梯度。
1. 如何對權重進(jìn)行二值化?
權重二值化一般有兩種選擇:
  • 直接根據權重的正負進(jìn)行二值化:xb=sign (x)xb=sign(x)。符號函數 sign (x) 定義如下:

圖片
  • 進(jìn)行隨機的二值化,即對每一個(gè)權重,以一定概率取 ±1±1。

2. 如何計算二值權重的梯度?
二值權重的梯度為 0,無(wú)法進(jìn)行參數更新。為解決這個(gè)問(wèn)題,需要對符號函數進(jìn)行放松,即用 Htanh (x)=max (?1,min (1,x))Htanh(x)=max(?1,min(1,x)) 來(lái)代替 sinx (x)sinx(x)。當 x 在區間 [-1,1] 時(shí),存在梯度值 1,否則梯度為 0 。
4.3 二值連接算法改進(jìn)


之前的二值連接算法只對權重進(jìn)行了二值化,但是網(wǎng)絡(luò )的中間輸出值依然是單精度的,于是 Rastegari 等人對此進(jìn)行了改進(jìn),提出用單精度對角陣與二值矩陣之積來(lái)近似表示原矩陣的算法,以提升二值網(wǎng)絡(luò )的分類(lèi)性能,彌補二值網(wǎng)絡(luò )在精度上弱勢。該算法將原卷積運算分解為如下過(guò)程:
圖片圖片
可以看到的是權重二值化神經(jīng)網(wǎng)絡(luò )(BWN)和全精度神經(jīng)網(wǎng)絡(luò )的精確度幾乎一樣,但是與異或神經(jīng)網(wǎng)絡(luò )(XNOR-Net)相比而言,Top-1 和 Top-5 都有 10+% 的損失。
相比于權重二值化神經(jīng)網(wǎng)絡(luò ),異或神經(jīng)網(wǎng)絡(luò )將網(wǎng)絡(luò )的輸入也轉化為二進(jìn)制值,所以,異或神經(jīng)網(wǎng)絡(luò )中的乘法加法 (Multiplication and ACcumulation) 運算用按位異或 (bitwise xnor) 和數 1 的個(gè)數 (popcount) 來(lái)代替。
4.4 二值網(wǎng)絡(luò )設計注意事項


  • 不要使用 kernel = (1, 1) 的 Convolution (包括 resnet 的 bottleneck):二值網(wǎng)絡(luò )中的 weight 都為 1bit, 如果再是 1x1 大小, 會(huì )極大地降低表達能力。
  • 增大 Channel 數目 + 增大 activation bit 數 要協(xié)同配合:如果一味增大 channel 數, 最終 feature map 因為 bit 數過(guò)低, 還是浪費了模型容量。同理反過(guò)來(lái)也是。
  • 建議使用 4bit 及以下的 activation bit, 過(guò)高帶來(lái)的精度收益變小, 而會(huì )顯著(zhù)提高 inference 計算量。

五、知識蒸餾
本文只簡(jiǎn)單介紹這個(gè)領(lǐng)域的開(kāi)篇之作 - Distilling the Knowledge in a Neural Network,這是蒸 "logits" 方法,后面還出現了蒸 “features” 的論文。想要更深入理解,中文博客可參考這篇文章 - 知識蒸餾是什么?一份入門(mén)隨筆。
知識蒸餾(knowledge distillation),是遷移學(xué)習(transfer learning)的一種,簡(jiǎn)單來(lái)說(shuō)就是訓練一個(gè)大模型(teacher)和一個(gè)小模型(student),將龐大而復雜的大模型學(xué)習到的知識,通過(guò)一定技術(shù)手段遷移到精簡(jiǎn)的小模型上,從而使小模型能夠獲得與大模型相近的性能。
圖片
所以,可以知道 student 模型最終的損失函數由兩部分組成:
  • 第一項是由小模型的預測結果與大模型的 “軟標簽” 所構成的交叉熵(cross entroy);
  • 第二項為預測結果與普通類(lèi)別標簽的交叉熵。

這兩個(gè)損失函數的重要程度可通過(guò)一定的權重進(jìn)行調節,在實(shí)際應用中,T 的取值會(huì )影響最終的結果,一般而言,較大的 T 能夠獲得較高的準確度,T(蒸餾溫度參數) 屬于知識蒸餾模型訓練超參數的一種。T 是一個(gè)可調節的超參數、T 值越大、概率分布越軟(論文中的描述),曲線(xiàn)便越平滑,相當于在遷移學(xué)習的過(guò)程中添加了擾動(dòng),從而使得學(xué)生網(wǎng)絡(luò )在借鑒學(xué)習的時(shí)候更有效、泛化能力更強,這其實(shí)就是一種抑制過(guò)擬合的策略。知識蒸餾的整個(gè)過(guò)程如下圖:
圖片
student 模型的實(shí)際模型結構和小模型一樣,但是損失函數包含了兩部分,分類(lèi)網(wǎng)絡(luò )的知識蒸餾 mxnet 代碼示例如下:



















# -*-coding-*-  : utf-8  """本程序沒(méi)有給出具體的模型結構代碼,主要給出了知識蒸餾 softmax 損失計算部分。"""import mxnet as mxdef get_symbol(data, class_labels, resnet_layer_num,Temperature,mimic_weight,num_classes=2):    backbone = StudentBackbone(data) # Backbone 為分類(lèi)網(wǎng)絡(luò ) backbone 類(lèi)    flatten = mx.symbol.Flatten(data=conv1, name="flatten") fc_class_score_s = mx.symbol.FullyConnected(data=flatten, num_hidden=num_classes, name='fc_class_score')    softmax1 = mx.symbol.SoftmaxOutput(data=fc_class_score_s, label=class_labels, name='softmax_hard') import symbol_resnet # Teacher model fc_class_score_t = symbol_resnet.get_symbol(net_depth=resnet_layer_num, num_class=num_classes, data=data) s_input_for_softmax=fc_class_score_s/Temperature t_input_for_softmax=fc_class_score_t/Temperature t_soft_labels=mx.symbol.softmax(t_input_for_softmax, name='teacher_soft_labels')    softmax2 = mx.symbol.SoftmaxOutput(data=s_input_for_softmax, label=t_soft_labels, name='softmax_soft',grad_scale=mimic_weight)    group=mx.symbol.Group([softmax1,softmax2]) group.save('group2-symbol.json') return group

tensorflow 代碼示例如下:













# 將類(lèi)別標簽進(jìn)行one-hot編碼one_hot = tf.one_hot(y, n_classes,1.0,0.0) # n_classes為類(lèi)別總數, n為類(lèi)別標簽# one_hot = tf.cast(one_hot_int, tf.float32)teacher_tau = tf.scalar_mul(1.0/args.tau, teacher) # teacher為teacher模型直接輸出張量, tau為溫度系數Tstudent_tau = tf.scalar_mul(1.0/args.tau, student) # 將模型直接輸出logits張量student處于溫度系數Tobjective1 = tf.nn.sigmoid_cross_entropy_with_logits(student_tau, one_hot)objective2 = tf.scalar_mul(0.5, tf.square(student_tau-teacher_tau))"""student模型最終的損失函數由兩部分組成:第一項是由小模型的預測結果與大模型的“軟標簽”所構成的交叉熵(cross entroy);第二項為預測結果與普通類(lèi)別標簽的交叉熵。"""tf_loss = (args.lamda*tf.reduce_sum(objective1) + (1-args.lamda)*tf.reduce_sum(objective2))/batch_size

tf.scalar_mul 函數為對 tf 張量進(jìn)行固定倍率 scalar 縮放函數。一般 T 的取值在 1 - 20 之間,這里我參考了開(kāi)源代碼,取值為 3。我發(fā)現在開(kāi)源代碼中 student 模型的訓練,有些是和 teacher 模型一起訓練的,有些是 teacher 模型訓練好后直接指導 student 模型訓練。
六、淺層 / 輕量網(wǎng)絡(luò )
淺層網(wǎng)絡(luò ):通過(guò)設計一個(gè)更淺(層數較少)結構更緊湊的網(wǎng)絡(luò )來(lái)實(shí)現對復雜模型效果的逼近,但是淺層網(wǎng)絡(luò )的表達能力很難與深層網(wǎng)絡(luò )相匹敵。因此,這種設計方法的局限性在于只能應用解決在較為簡(jiǎn)單問(wèn)題上。如分類(lèi)問(wèn)題中類(lèi)別數較少的 task。
輕量網(wǎng)絡(luò ):使用如 MobilenetV2、ShuffleNetv2 等輕量網(wǎng)絡(luò )結構作為模型的 backbone 可以大幅減少模型參數數量。
參考資料:
  1. 神經(jīng)網(wǎng)絡(luò )模型壓縮和加速之知識蒸餾
  2. https://github.com/chengshengchan/model_compression/blob/master/teacher-student.py
  3. https://github.com/dkozlov/awesome-knowledge-distillation
  4. XNOR-Net
  5. 解析卷積神經(jīng)網(wǎng)絡(luò ) - 深度學(xué)習實(shí)踐手冊
  6. 知識蒸餾(Knowledge Distillation)簡(jiǎn)述(一)
來(lái)源 | OSCHINA 社區作者 | 華為云開(kāi)發(fā)者聯(lián)盟-嵌入式視覺(jué)整理 | 機器學(xué)習研習院原文鏈接:https://my.oschina.net/u/4526289/blog/7119041


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>