一文讀懂物體分類AI算法:LeNet-5 AlexNet VGG Inception ResNet MobileNet

摘要:當(dāng)前深度學(xué)習(xí)十分火熱,深度學(xué)習(xí)網(wǎng)絡(luò)模型對(duì)于降低錯(cuò)誤率的重要作用不言而喻。深度學(xué)習(xí)應(yīng)用場景主要分為三類:物體識(shí)別與分類,物體檢測,自然語言處理。在物體識(shí)別與分類領(lǐng)域,隨著AlexNet在2012年一炮走紅,深度學(xué)習(xí)重新燃起了一片熱情。從Lenet5第一次使用卷積開始,經(jīng)歷了AlexNet VGG Inception ResNet等各種模型,錯(cuò)誤率也一再降低。ResNet-152

1 引言

當(dāng)前深度學(xué)習(xí)十分火熱,深度學(xué)習(xí)網(wǎng)絡(luò)模型對(duì)于降低錯(cuò)誤率的重要作用不言而喻。深度學(xué)習(xí)應(yīng)用場景主要分為三類:物體識(shí)別與分類,物體檢測,自然語言處理。在物體識(shí)別與分類領(lǐng)域,隨著AlexNet在2012年一炮走紅,深度學(xué)習(xí)重新燃起了一片熱情。從Lenet5第一次使用卷積開始,經(jīng)歷了AlexNet VGG Inception ResNet等各種模型,錯(cuò)誤率也一再降低。ResNet-152 top-5錯(cuò)誤率僅為3%左右,遠(yuǎn)低于人眼的5.1%。本文主要講解各種網(wǎng)絡(luò)模型的結(jié)構(gòu),他們的特點(diǎn),以及這些特點(diǎn)為何能減少訓(xùn)練時(shí)間和降低錯(cuò)誤率。

2 LeNet-5

LeNet-5的出現(xiàn)標(biāo)志著CNN卷積神經(jīng)網(wǎng)絡(luò)在AI領(lǐng)域的出現(xiàn),CNN以視覺感受野和權(quán)值共享的思想,大大減少了模型參數(shù),使得深度學(xué)習(xí)模型訓(xùn)練成為了可能。但由于誕生于1998年,GPU的概念都還沒有提出,CPU的性能又是極其低下,而且LetNet-5只能使用在手寫字識(shí)別等很簡單的應(yīng)用場景,故一直沒有火起來。但作為CNN應(yīng)用的開山鼻祖,學(xué)習(xí)CNN勢必先從學(xué)習(xí)LetNet-5開始。LeNet-5網(wǎng)絡(luò)結(jié)構(gòu)如下圖

LeNet-5輸入為32x32的二維像素矩陣,由于是灰度圖,輸入通道為1,其正向傳播步驟為

先經(jīng)過一層5x5的卷積,feature map為6,也就是輸出通道為6。由于沒有在圖片四周加padding,像素矩陣大小變?yōu)榱?8x28。這一層參數(shù)量為(5x5+1)x6 = 156。

然后經(jīng)過一層2x2的平均值池化層進(jìn)行下采樣。像素矩陣大小變?yōu)榱?4x14

再經(jīng)過一層5x5的卷積,feature map為16。像素矩陣大小變?yōu)榱?0x10。這一層參數(shù)量為(5x5x6+1)x16 = 2416

然后經(jīng)過一層2x2的最大值池化層。像素矩陣大小變?yōu)榱?x5

在經(jīng)過一層5x5的卷積,feature map為120。像素矩陣大小變?yōu)榱?x1。這一層參數(shù)量為(5x5x16+1)x120 = 48120

然后經(jīng)過一層全連接層, 輸出為84.故這一層參數(shù)量為84x120 = 10080

最后一層為Gaussian Connections輸出層,輸出0~9共10個(gè)分類。目前主流輸出層已經(jīng)由softmax來代替

LeNet-5的特點(diǎn)如下

使用了卷積來提取特征,結(jié)構(gòu)單元一般為卷積 - 池化 -非線性激活

已經(jīng)加入了非線性激活,激活函數(shù)采用了tanh和sigmoid,目前大多數(shù)情況下我們使用的是relu

池化層使用的是平均值池化,目前大多數(shù)情況下我們使用最大值池化

分類器使用了Gaussian Connections,目前已經(jīng)被softmax替代

3 AlexNet

AlexNet在2012年以16.4%的顯著優(yōu)勢問鼎ILSVRC的冠軍,重新燃起了人們對(duì)于深度學(xué)習(xí)研究的熱情。它第一次采用了relu,dropout,GPU加速等技巧,參數(shù)量為6000萬,模型大小240M左右。其網(wǎng)絡(luò)結(jié)構(gòu)如下

AlexNet輸入圖片為224x224, 輸入為RGB三通道。正向傳播共5個(gè)卷積層和3個(gè)全連接層,步驟為

conv1-relu1-pool1-lrn1: 11x11的卷積,步長為4, 輸出通道96,也就是96個(gè)特征圖。分為兩組,每組48個(gè)通道。然后通過一層relu的非線性激活。在經(jīng)過一層最大值池化,池化核大小3x3, 步長為2。最后再經(jīng)過一層LRN,局部響應(yīng)歸一化。第一層運(yùn)算后圖片大小為27x27x96

conv2-relu2-pool2-lrn2: 第二層的輸入即為第一層的輸出,也就是27x27x96的像素矩陣。96個(gè)feature map分成兩組,分別在兩個(gè)GPU中進(jìn)行運(yùn)算。卷積核大小為5x5, 步長為1,輸出通道為128. 然后進(jìn)過一層relu非線性激活。再經(jīng)過一層最大值池化,池化核大小仍然為3x3, 步長為2. 最后再經(jīng)過一層LRN。第二層運(yùn)算后為兩組13x13x128的圖片

conv3-relu3: 第三層的輸入為第二層的輸出,也就是13x13x128的像素矩陣。先經(jīng)過卷積核大小為3x3x192的卷積運(yùn)算,步長為1。然后就是relu非線性激活。注意這一層沒有max-pooling和LRN。第三層運(yùn)算后為兩組13x13x192

conv4-relu4: 第四層先經(jīng)過卷積核大小為3x3, 步長為1的卷積運(yùn)算,然后經(jīng)過relu非線性激活。第四層運(yùn)算后尺寸仍然為兩組13x13x192的圖片

conv5-relu5-pool5:第五層先經(jīng)過卷積核大小為3x3, 輸出通道128,步長為1的卷積運(yùn)算,然后經(jīng)過relu非線性激活。最后經(jīng)過一層大小為3x3, 步長為2的max-pooling, 第五層運(yùn)算后為兩組6x6x128的圖片

fc6-relu6-dropout6: 第六層為全連接層,輸入為兩組6x6x128, 組合在一起也就是6x6x256。輸出通道為4096。經(jīng)過relu和dropout后輸出。輸出為4096的一維向量

fc7-relu7-dropout7: 第七層為全連接層,輸入為4096的一維向量,輸出也為4096的一維向量,也就是4096x4096的全連接。然后通過relu和dropout輸出。輸出為4096的一維向量。

fc8: 第八層為全連接層,輸入為4096的一維向量,輸出為1000的一維向量,對(duì)應(yīng)1000個(gè)分類的輸出。也就是4096x1000的全連接。輸出為1000的一維向量。經(jīng)過這一層后就可以通過softmax得到1000個(gè)分類的分類結(jié)果了。

AlexNet的結(jié)構(gòu)特點(diǎn)為

采用relu替代了tanh和sigmoid激活函數(shù)。relu具有計(jì)算簡單,不產(chǎn)生梯度彌散等優(yōu)點(diǎn),現(xiàn)在已經(jīng)基本替代了tanh和sigmoid

全連接層使用了dropout來防止過擬合。dropout可以理解為是一種下采樣方式,可以有效降低過擬合問題。

卷積-激活-池化后,采用了一層LRN,也就是局部響應(yīng)歸一化。將一個(gè)卷積核在(x,y)空間像素點(diǎn)的輸出,和它前后的幾個(gè)卷積核上的輸出做權(quán)重歸一化。

使用了重疊的最大值池化層。3x3的池化核,步長為2,因此產(chǎn)生了重疊池化效應(yīng),使得一個(gè)像素點(diǎn)在多個(gè)池化結(jié)果中均有輸出,提高了特征提取的豐富性

使用CUDA GPU硬件加速。訓(xùn)練中使用了兩塊GPU進(jìn)行并行加速,使得模型訓(xùn)練速度大大提高。

數(shù)據(jù)增強(qiáng)。隨機(jī)的從256x256的原始圖片中,裁剪得到224x224的圖片,從而使一張圖片變?yōu)榱?256-224)^2張圖片。并對(duì)圖片進(jìn)行鏡像,旋轉(zhuǎn),隨機(jī)噪聲等數(shù)據(jù)增強(qiáng)操作,大大降低了過擬合現(xiàn)象。

4 VGG

VGG為ILSVRC 2014年第二名,它探索了卷積網(wǎng)絡(luò)深度和性能,準(zhǔn)確率之間的關(guān)系。通過反復(fù)堆疊3x3卷積和2x2的池化,得到了最大19層的深度。VGG19模型大概508M,錯(cuò)誤率降低到7.3%。VGG模型不復(fù)雜,只有3x3這一種卷積核,卷積層基本就是卷積-relu-池化的結(jié)構(gòu),沒有使用LRN,結(jié)構(gòu)如下圖。

VGG的特點(diǎn)如下

采用了較深的網(wǎng)絡(luò),最多達(dá)到19層,證明了網(wǎng)絡(luò)越深,高階特征提取越多,從而準(zhǔn)確率得到提升。

串聯(lián)多個(gè)小卷積,相當(dāng)于一個(gè)大卷積。VGG中使用兩個(gè)串聯(lián)的3x3卷積,達(dá)到了一個(gè)5x5卷積的效果,但參數(shù)量卻只有之前的9/25。同時(shí)串聯(lián)多個(gè)小卷積,也增加了使用relu非線性激活的概率,從而增加了模型的非線性特征。

VGG-16中使用了1x1的卷積。1x1的卷積是性價(jià)比最高的卷積,可以用來實(shí)現(xiàn)線性變化,輸出通道變換等功能,而且還可以多一次relu非線性激活。

VGG有11層,13層,16層,19層等多種不同復(fù)雜度的結(jié)構(gòu)。使用復(fù)雜度低的模型的訓(xùn)練結(jié)果,來初始化復(fù)雜度高模型的權(quán)重等參數(shù),這樣可以加快收斂速度。

5 Google Inception

Google Inception是一個(gè)大家族,包括inceptionV1 inceptionV2 inceptionV3 inceptionV4等結(jié)構(gòu)。它主要不是對(duì)網(wǎng)絡(luò)深度的探索,而是進(jìn)行了網(wǎng)絡(luò)結(jié)構(gòu)的改進(jìn)。inceptionV1擊敗了VGG,奪得2014年ILSVRC冠軍。之后Google又對(duì)其網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了諸多改進(jìn),從而形成了一個(gè)大家族。

5.1 InceptionV1

inceptionV1是一個(gè)設(shè)計(jì)十分精巧的網(wǎng)絡(luò),它有22層深,只有500萬左右的參數(shù)量,模型大小僅為20M左右,但錯(cuò)誤率卻只有6.7%。它的網(wǎng)絡(luò)結(jié)構(gòu)特點(diǎn)如下

去除了最后的全連接層,而使用全局平均池化來代替。這是模型之所以小的原因。AlexNet和VGG中全連接幾乎占據(jù)了90%的參數(shù)量。而inceptionV1僅僅需要1000個(gè)參數(shù),大大降低了參數(shù)量

inception module的使用。借鑒與Network in Network的思想,提出了inception module的概念,允許通道并聯(lián)來組合特征。其結(jié)構(gòu)如下

inception module分為并聯(lián)的四路,分別為單獨(dú)的1x1卷積,1x1并聯(lián)3x3, 1x1并聯(lián)5x5, 池化后1x1卷積。使用不同的卷積結(jié)構(gòu)來提取不同特征,然后將他們組合在一起來輸出。

使用了1x1,3x3,5x5等不同尺寸的卷積,增加了提取特征面積的多樣性,從而減小過擬合

5.2 inceptionV2

inceptionV2和V1網(wǎng)絡(luò)結(jié)構(gòu)大體相似,其模型大小為40M左右,錯(cuò)誤率僅4.8%,低于人眼識(shí)別的錯(cuò)誤率5.1%。主要改進(jìn)如下

使用兩個(gè)串聯(lián)3x3卷積來代替5x5卷積,從而降低參數(shù)量,并增加relu非線性。這一點(diǎn)參考了VGG的設(shè)計(jì)

提出了Batch Normalization。在卷積池化后,增加了這一層正則化,將輸出數(shù)據(jù)歸一化到0~1之間,從而降低神經(jīng)元分布的不一致性。這樣訓(xùn)練時(shí)就可以使用相對(duì)較大的學(xué)習(xí)率,從而加快收斂速度。在達(dá)到之前的準(zhǔn)確率之后還能繼續(xù)訓(xùn)練,從而提高準(zhǔn)確率。V2達(dá)到V1的準(zhǔn)確率時(shí),迭代次數(shù)僅為V1的1/14, 從而使訓(xùn)練時(shí)間大大減少。最終錯(cuò)誤率僅4.8%

5.3 inceptionV3

inceptionV3的網(wǎng)絡(luò)結(jié)構(gòu)也沒太大變化,其模型大小96M左右。主要改進(jìn)如下

使用非對(duì)稱卷積。用1x3+3x1的卷積來代替一個(gè)3x3的卷積,降低了參數(shù)的同時(shí),提高了卷積的多樣性

分支中出現(xiàn)了分支。如下圖


5.4 inceptionV4

inceptionV4主要是借鑒了resNet殘差網(wǎng)絡(luò)的思想,可以看做是inceptionV3和resNet的結(jié)合。inceptionV4模型大小163M,錯(cuò)誤率僅僅為3.08%。主要在ResNet網(wǎng)絡(luò)中講解

6 ResNet

6.1 ResNetV1

ResNet由微軟提出,并奪得了2015年ILSVRC大賽的冠軍。它以152層的網(wǎng)絡(luò)深度,將錯(cuò)誤率降低到只有3.57%,遠(yuǎn)遠(yuǎn)低于5.1%的人眼識(shí)別錯(cuò)誤率。它同樣利用全局平均池化來代替全連接層,使得152層網(wǎng)絡(luò)的模型不至于太大。網(wǎng)絡(luò)中使用了1x1 3x3 5x5 7x7等不同尺寸的卷積核,從而提高卷積的多樣性。resNetV1_152模型大小為214M,不算太大。

ResNet提出了殘差思想,將輸入中的一部分?jǐn)?shù)據(jù)不經(jīng)過神經(jīng)網(wǎng)絡(luò),而直接進(jìn)入到輸出中。這樣來保留一部分原始信息,防止反向傳播時(shí)的梯度彌散問題,從而使得網(wǎng)絡(luò)深度一舉達(dá)到152層。當(dāng)前有很多人甚至訓(xùn)練了1000多層的網(wǎng)絡(luò),當(dāng)然我們實(shí)際使用中100多層的就遠(yuǎn)遠(yuǎn)足夠了。殘差網(wǎng)絡(luò)如下圖

ResNet的主要特點(diǎn),就一個(gè)字,深!

6.2 ResNetV2

ResNetV2相對(duì)于V1的最大變化,就是借鑒了inceptionV2的BN歸一化思想,這樣來減少模型訓(xùn)練時(shí)間。

7 MobileNet

為了能將模型部署在終端上,需要在保證準(zhǔn)確率的前提下,減小模型體積,并降低預(yù)測時(shí)的計(jì)算時(shí)間,以提高實(shí)時(shí)性。為了能到達(dá)這一目的,Google提出了mobileNet框架。最終mobileNetV1_1.0_224模型以16M的大小,可以達(dá)到90%的top-5準(zhǔn)確率。模型甚至可以壓縮得更小,mobileNetV1_0.25_128只有10M左右,仍然能達(dá)到80%的準(zhǔn)確率。

7.1 mobileNet depthwise原理

mobileNet模型的核心是,將一個(gè)普通的卷積拆分成了一個(gè)depthwise卷積和一個(gè)1x1的普通卷積(也叫pointwise卷積)。depthwise卷積層的每個(gè)卷積只和輸入的某一個(gè)channel進(jìn)行計(jì)算,而combining則由1x1的卷積來負(fù)責(zé)。如下圖

對(duì)于卷積核dk*dk,輸入通道為M,輸出通道為N的普通卷積,每個(gè)輸出通道都是由M個(gè)卷積分別和輸入通道做計(jì)算,然后累加出來,所以需要的參數(shù)量為dk x dk x M x N。而對(duì)于depthwise卷積,每個(gè)卷積只和輸入通道的某一個(gè)通道發(fā)生計(jì)算,并且不需要累加操作,其卷積后的輸出通道和輸入通道相等,仍然為M。然后再經(jīng)過一層1x1的普通卷積。故其參數(shù)為dk x dk x M + 1 x 1 x M x N。

mobileNet參數(shù)量比原來減少了多少呢,我們由下面的計(jì)算可以得出

? (dk x dk x M + 1 x 1 x M x N) / (dk x dk x M x N) = 1/N + 1/(dk^2)

由于輸出通道一般都比較大,為48 96 甚至4096, 故一般取1/(dk^2), 對(duì)于最常見的3x3卷積,mobileNet參數(shù)量可以降低為原來的1/9.

7.2 mobileNet網(wǎng)絡(luò)結(jié)構(gòu)

mobileNet一共包含28層,第一層的卷積為普通卷積,之后的卷積為分解的3x3 depthwise卷積和1x1 pointwise卷積。另外,最后有一個(gè)全局平均池化層和全連接層。并利用softmax得到分類結(jié)果。如下圖所示

7.3 mobileNet可裁剪化

為了得到更小的模型,mobileNet還可以進(jìn)行輸入通道和分辨率的剪裁,稱為Width Multiplier 和 Resolution Multiplier。Width Multiplier 表示輸入通道變?yōu)閎aseline的多少倍, Resolution Multiplier表示輸入圖像縮小為多少。經(jīng)過剪裁后的mobileNetV1_0.25_128模型,只有10M左右,準(zhǔn)確率仍然可達(dá)到80%左右。作為端上圖像預(yù)處理完全足夠。下面是Width Multiplier 和 Resolution Multiplier的結(jié)果

8 總結(jié)

CNN已經(jīng)廣泛應(yīng)用在物體識(shí)別和分類領(lǐng)域,短短幾年間就出現(xiàn)了AlexNet VGG inception ResNet等優(yōu)秀的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),并且每隔幾個(gè)月就問世一種優(yōu)秀網(wǎng)絡(luò)結(jié)構(gòu),可以說是百花齊放。這要?dú)w功于TensorFlow等框架的成熟和GPU等硬件性能的提升,使得網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)和驗(yàn)證日趨平民化。各種網(wǎng)絡(luò)結(jié)構(gòu),其實(shí)本質(zhì)上也是在解決神經(jīng)網(wǎng)絡(luò)的幾大痛點(diǎn)問題,如下

減少模型參數(shù)量,降低模型體積

加快訓(xùn)練收斂速度,減少訓(xùn)練耗時(shí)

加快模型預(yù)測計(jì)算時(shí)間,提高實(shí)時(shí)性。這主要還是通過減少參數(shù)量來達(dá)到

減少過擬合問題

減少網(wǎng)絡(luò)層級(jí)過深時(shí)的梯度彌散問題

學(xué)習(xí)網(wǎng)絡(luò)模型,不應(yīng)該去死記硬背,因?yàn)橛性丛床粩嗟木W(wǎng)絡(luò)結(jié)構(gòu)涌現(xiàn)。我們應(yīng)該重點(diǎn)掌握每個(gè)模型的特點(diǎn),以及他們是如何來解決上面列舉的這些神經(jīng)網(wǎng)絡(luò)痛點(diǎn)的。

原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容