論文研讀-圖像分類AlexNet-<<ImageNet Classification with Deep Convolutional Neural Networks>>

<<ImageNet Classification with Deep Convolutional Neural Networks>>

大名鼎鼎的AlexNet,2012年ImageNet比賽的冠軍织阳,可以說是近年深度學(xué)習(xí)浪潮的開山之作愈诚,發(fā)表在了2012年的NIPS上.

作者Alex Krizhevsky,也是Hinton大佬的學(xué)生

ImageNet Classification with Deep Convolutional Neural Networks

Abstract

  • 性能: 在包含1000個(gè)類別抑党,120萬張圖片的ImageNet LSVRC-2010訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò),在test data上達(dá)到了SOTA的效果峻凫,top-1, top-5 error達(dá)到了37.5%, 17%
  • 網(wǎng)絡(luò)結(jié)構(gòu):包含5個(gè)卷積層(部分包含max-pooling),3個(gè)全連接層,最后接一個(gè)1000類的softmax做歸一化.
  • 其他細(xì)節(jié)貢獻(xiàn):
    • 實(shí)現(xiàn)了convolution的GPU版本
    • 在全連接層使用了Dropout來避免overfitting.

Introduction

更大的數(shù)據(jù)集矮湘,更強(qiáng)的學(xué)習(xí)能力的模型

為什么要更大的數(shù)據(jù)集?

現(xiàn)在主流識(shí)別任務(wù)的方法都是基于machine-learning的醋寝,要提升這類方法的性能搞挣,需要很大的數(shù)據(jù)集,學(xué)到更強(qiáng)表達(dá)能力的模型音羞,并且使用一些更好的技術(shù)去避免模型的Overfitting(機(jī)器學(xué)習(xí)繞不開的問題)

現(xiàn)有的數(shù)據(jù)集都很小囱桨,在這種小的數(shù)據(jù)集上,比如Mnist手寫數(shù)字識(shí)別任務(wù),模型得到的結(jié)果甚至已經(jīng)比人還好。但是真實(shí)世界的場(chǎng)景遠(yuǎn)比這復(fù)雜嗅绰,因此我們需要更大的數(shù)據(jù)集(對(duì)數(shù)據(jù)集大小提出要求)舍肠,比如ImageNet搀继。

為什么要更強(qiáng)學(xué)習(xí)能力的模型 - 為什么選擇CNN?

即使是有了ImageNet這樣龐大的數(shù)據(jù)集,識(shí)別任務(wù)也不可能被完全的解決翠语,模型同樣需要有一些很強(qiáng)的先驗(yàn)知識(shí)來補(bǔ)充數(shù)據(jù)當(dāng)中沒有的東西(對(duì)模型的選擇提出了更高的要求)

  • Convolutional neural networks的優(yōu)勢(shì)

    • 容量可調(diào) : 可以通過修改網(wǎng)絡(luò)的Depth, breadth來調(diào)整網(wǎng)絡(luò)的大小(學(xué)習(xí)能力)
    • 對(duì)自然圖像有準(zhǔn)確的先驗(yàn)假定 : stationarity of statistics and locality of pixel dependencies(統(tǒng)計(jì)上的平穩(wěn)性和像素依賴的位置性)
    • 和類似結(jié)構(gòu)的feedforward網(wǎng)絡(luò)相比叽躯,CNN有更少的鏈接和參數(shù),可以更好的學(xué)習(xí)肌括,又不會(huì)損失太多的性能

因此CNN其實(shí)有吸引人的特點(diǎn)险毁,Convolution這種Local的結(jié)構(gòu)也非常的高效

GPU版本的Convolution實(shí)現(xiàn)讓CNN訓(xùn)練加快,ImageNet標(biāo)注數(shù)據(jù)的出現(xiàn)讓模型避免了過度的Overfitting

Contributions

  1. 在ILSVRC-2010,ILSVRC-2012比賽中们童,利用相應(yīng)的ImageNet的子集訓(xùn)練了一個(gè)CNN網(wǎng)絡(luò)獲得了冠軍。
  2. 完成了Convolution鲸鹦,其他層的GPU版本實(shí)現(xiàn)慧库,并訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò)。
  3. 網(wǎng)絡(luò)包含一些小的Feature,能提升訓(xùn)練速度和性能
  4. 即使是在這么大的數(shù)據(jù)集上馋嗜,我們的網(wǎng)絡(luò)參數(shù)量也有可能會(huì)Overfitting,因此采用了一些技術(shù)來避免Overfitting
  5. 提出了一個(gè)5卷積-3全連接的CNN網(wǎng)絡(luò)齐板,表示卷積層不能少,少了性能會(huì)降

作者也解釋了一下網(wǎng)絡(luò)模型和訓(xùn)練受限于GPU的發(fā)展葛菇,有更好的GPU可以加快訓(xùn)練(這是不是也是沒嘗試更深的網(wǎng)絡(luò)的原因呢甘磨?)

ImageNet Dataset

介紹了以下ImageNet和ILSVRC比賽,沒啥好說的眯停。

主要關(guān)注以下網(wǎng)絡(luò)數(shù)據(jù)輸入的預(yù)處理

數(shù)據(jù)預(yù)處理

圖像Resize

ImageNet的圖像是不同分辨率的济舆,而AlexNet只能接收固定大小的圖像(因?yàn)槿B接層的參數(shù)直接和輸入數(shù)據(jù)量相關(guān))

因此需要對(duì)圖片進(jìn)行預(yù)處理,做法是downsample到固定256*256的大小

具體的Downsample做法:

給定一張圖像莺债,按短邊resize到256的比例resize整個(gè)圖像滋觉,然后crop這張圖像中心的256*256的patch.

去均值

沒啥好說的,會(huì)計(jì)算所有像素的RGB均值齐邦,做去均值的操作椎侠,輸入數(shù)據(jù)就是原始的RGB值

Netwotrk Architecture

整體網(wǎng)絡(luò)結(jié)構(gòu)包含5 conv + 3 fc層,網(wǎng)絡(luò)結(jié)構(gòu)如下圖:

AlexNet Architecture

Noval Features to improve performance

作者也提出了一些新的點(diǎn)去幫助加快訓(xùn)練措拇,提升性能

ReLU Nonlinearity

第一個(gè)最重要的也就是ReLU激活函數(shù),如下

relu activation function

傳統(tǒng)的激活函數(shù)tanh和sigmoid,作為軟飽和的激活函數(shù)我纪,一旦落入飽和區(qū),梯度更新會(huì)趨向于0丐吓,導(dǎo)致梯度消失浅悉,變得很難訓(xùn)練。

而ReLU作為一種在負(fù)半軸抑制汰蜘,正半軸是線性的激活函數(shù)仇冯,這種結(jié)構(gòu)表達(dá)了非線性的篩選能力,又能解決梯度消失的問題族操,是一種比較好的選擇(也有問題苛坚,神經(jīng)元死亡)

當(dāng)然上面這段都是自己加上去的比被,在這篇文章里作者并沒有過多分析,而是直接替換了Relu, 認(rèn)為在CNN中運(yùn)用Relu可以加快訓(xùn)練速度泼舱。

作者用4層的神經(jīng)網(wǎng)絡(luò)在CIFAR-10數(shù)據(jù)集上訓(xùn)練比較了tanh和Relu分別作為激活函數(shù)的訓(xùn)練速度等缀,發(fā)現(xiàn)要達(dá)到25% train error,Relu激活函數(shù)花費(fèi)更少的時(shí)間,如下圖:

Compare Relu tanh in CNN as activation function

因此在更大的網(wǎng)絡(luò)和數(shù)據(jù)集上娇昙,我們應(yīng)該也可以得到類似的結(jié)論尺迂,因此作者認(rèn)為在更復(fù)雜的CNN中用Relu替代tanh和sigmoid可以顯著加快網(wǎng)絡(luò)訓(xùn)練。

Training on Multiple GPUs

Multi-GPUs的訓(xùn)練冒掌,可以加快速度噪裕,屬于工程問題,這里不提了股毫。

Local Response Normalization

局部相應(yīng)歸一化層膳音,作者認(rèn)為做這樣的歸一化可以提升性能,把top1,top5 error分別降低了1.4%和1.2%

思想就是對(duì)于一個(gè)卷積層的輸出铃诬,考慮各個(gè)channel通道的每個(gè)像素位置祭陷,單個(gè)channel通道上的每個(gè)像素位置的值,根據(jù)該像素位置在所有通道上的平方和來做歸一化趣席,公式如下:

Local Response Normalization

Overlapping Pooling

Pooling的時(shí)候兵志,會(huì)有stride,kernel_size兩個(gè)參數(shù)。

如果kernel_size = stride,就是Non-Overlapping的Pooling

如果kernel-size > stride,就是Overlapping的Pooling宣肚,Pooling后的圖像上想罕,每個(gè)像素點(diǎn)與附近的像素點(diǎn)之間是有信息的Overlap的。

作者發(fā)現(xiàn)這種Overlapping的Pooling可以增加準(zhǔn)確率钉寝,top1,top5 error各自降低了0.4%,0.3%個(gè)點(diǎn)弧呐。

作者認(rèn)為這種Overlapping的Pooling在訓(xùn)練的時(shí)候可以輕微降低Overfitting

Overall Architecture

看一下整個(gè)網(wǎng)絡(luò)結(jié)構(gòu),這里好像因?yàn)榉至薓ulti-GPUs還特地把網(wǎng)絡(luò)分開來了。嵌纲。真蛋疼俘枫,我們就當(dāng)做一個(gè)網(wǎng)絡(luò),統(tǒng)一的參數(shù)看

這里結(jié)合了一下Caffe版本的具體Code看,會(huì)比較清楚:
Alexnet_train_prototxt

  • input: 224x224x3的輸入圖像逮走,前面說預(yù)處理是256x256,為什么鸠蚪?其實(shí)是因?yàn)楹竺孀鰀ata augmentation最終得到224x224的圖,所以前面的256x256是保證可以做crop师溅,真正的網(wǎng)絡(luò)輸入還是224x224x3
  • conv1_relu_lrn_maxpooling: 單個(gè)kernel的size=11x11x3,stride=4,kernel數(shù)量96個(gè)茅信,后面接relu,lrn,和3x3 stride=2的max-pooling.
  • conv2_relu_lrn_maxpooling: 單個(gè)kernel的size=5x5x96,stride=1,kernel數(shù)量256個(gè),后面接relu,lrn,和3x3 stride=2的max-pooling.
  • conv3_relu: 單個(gè)kernel的size=3x3x256,stride=1,kernel數(shù)量384個(gè)墓臭,后面接relu
  • conv4_relu: 單個(gè)kernel的size=3x3x384,stride=1,kernel數(shù)量384個(gè)蘸鲸,后面接relu
  • conv5_relu_maxpooling: 單個(gè)kernel的size=3x3x384,stride=1,kernel數(shù)量256個(gè),后面接relu窿锉,和3x3 stride=2的max-pooling
  • fc6_4096_relu_dropout:將上一層得到的結(jié)果拉成1xn的向量,過全連接層輸出1x4096的向量酌摇,過relu,訓(xùn)練時(shí)候過ratio=0.5的dropout
  • fc7_4096_relu_dropout:同理,過全連接層輸出1x4096的向量膝舅,過relu,訓(xùn)練時(shí)候過ratio=0.5的dropout
  • fc8_1000:過全連接輸出1x1000的向量,再過softmax就可以得到歸一化的1x1000的向量窑多,每個(gè)點(diǎn)代表屬于對(duì)應(yīng)label的概率仍稀。一般實(shí)現(xiàn)的時(shí)候train把softmax和交叉熵?fù)p失函數(shù)放在一起,test的時(shí)候用softmax得到歸一化概率埂息。

可以看到網(wǎng)絡(luò)結(jié)構(gòu)如果拋開那些細(xì)節(jié)的話技潘,就是11x11,5x5,3x3,3x3,4x4卷積,4096全連接千康,4096全連接享幽,1000分類概率。

以現(xiàn)在的眼光看拾弃,對(duì)于圖像級(jí)的分類問題琉闪,不太好的地方在哪里呢?

主要是前面的卷積層有優(yōu)化的地方砸彬,我們一般叫做CNN特征提取層,AlexNet這樣5層的CNN特征提取斯入,能提取出較好地對(duì)于圖像分類問題的feature嗎砂碉?

對(duì)于分類問題,最后用全連接可以考慮全局的信息刻两,但是也破壞了相應(yīng)的localization的信息增蹭,是不是有弊端呢?

Reducing Overfitting

機(jī)器學(xué)習(xí)問題無法避免Overfitting,但是好的模型要盡可能有較好的泛化能力磅摹,因此模型如何減緩Overfitting是很重要的一部分滋迈。

作者也提出了一些減少Overfitting的辦法。

Data Augmentation

數(shù)據(jù)增廣大概是從數(shù)據(jù)角度我們最郴模考慮的辦法饼灿,做法是對(duì)原圖做一些簡(jiǎn)單的變化。

這里其實(shí)可以有兩種做法

  • 事先增廣好帝美,存在磁盤里:好處是降低訓(xùn)練時(shí)候的運(yùn)算(雖然是在CPU上的)碍彭,壞處是會(huì)增大磁盤的存儲(chǔ)量
  • 在訓(xùn)練的同時(shí)增廣:好處是降低了磁盤的存儲(chǔ)量,壞處是可能有一些CPU運(yùn)算的開銷悼潭。

作者似乎選的是第二種.

增廣的方式

  • 隨機(jī)Crop+水平翻轉(zhuǎn):在256x256的圖像上隨機(jī)Crop得到224x224的圖像庇忌,并且得到他水平翻轉(zhuǎn)的圖像,這樣2048倍增加了數(shù)據(jù)集的量舰褪,不做的話會(huì)Overfitting.問題是皆疹,這樣怎么對(duì)256x256的圖像做test,作者的做法是提取圖像的中心patch+四個(gè)角落patch,再做水平翻轉(zhuǎn)占拍,得到一共10個(gè)patch分別過網(wǎng)絡(luò)略就,得到這些patch預(yù)測(cè)得到的概率的平均值捎迫,最大的平均值對(duì)應(yīng)的類別為圖像的分類結(jié)果。

  • PCA Jittering:先計(jì)算RGB通道的均值和方差残制,進(jìn)行歸一化立砸,然后在整個(gè)訓(xùn)練集上計(jì)算協(xié)方差矩陣,進(jìn)行特征分解初茶,得到特征向量和特征值(這里其實(shí)就是PCA分解)颗祝,在分解后的特征空間上對(duì)特征值做隨機(jī)的微小擾動(dòng),根據(jù)下式計(jì)算得到需要對(duì)R,G,B擾動(dòng)的值恼布,把它加回到RGB上去螺戳,作者認(rèn)為這樣的做法可以獲得自然圖像的一些重要屬性,把top-1 error又降低了1%

    PCA Jittering也算是比較常見的一種Data Augmentation的做法

PCA_Jittering

Dropout

作者認(rèn)為一種好的避免過擬合的做法是做模型的Ensemble,類似傳統(tǒng)機(jī)器學(xué)習(xí)里的做法折汞,但是網(wǎng)絡(luò)的Ensemble會(huì)耗費(fèi)大量的資源倔幼,因此比較好的做法是在訓(xùn)練的時(shí)候,在網(wǎng)絡(luò)內(nèi)部實(shí)現(xiàn)Ensemble爽待。

作者用了他人提到的一種dropout的方法损同,通過50%的概率隨機(jī)地在訓(xùn)練的時(shí)候?qū)⑸窠?jīng)元的輸出置為0,讓他對(duì)forward和backward失效鸟款。

這樣可以使得每次訓(xùn)練的時(shí)候膏燃,網(wǎng)絡(luò)都會(huì)sample出一個(gè)model,但是所有sample出來的model共享一個(gè)全局的model。作者認(rèn)為這種方法可以減少?gòu)?fù)雜系統(tǒng)下神經(jīng)元之間的依賴性何什,因?yàn)槲覀儾幌M粋€(gè)神經(jīng)元依賴于某個(gè)特定的神經(jīng)元组哩。

這樣可以強(qiáng)迫網(wǎng)絡(luò)在后面其他部分的神經(jīng)元每次都在隨機(jī)變化的情況下,卷積部分可以學(xué)到更加魯邦的feature

在測(cè)試的時(shí)候处渣,會(huì)打開所有全連接層的神經(jīng)元伶贰,但是會(huì)對(duì)輸出乘0.5,這是取了預(yù)測(cè)分布的幾何平均,是一種比較合理的實(shí)現(xiàn)方案罐栈。

作者在FC6,FC7用了全連接黍衙,顯著地降低了Overfitting,但是會(huì)使得網(wǎng)絡(luò)的訓(xùn)練時(shí)間增加到兩倍荠诬。

Details of learning

一些基本的參數(shù)

batch_size=128, 用的SGD, momentum給了0.9, weight_decay給了0.0005

參數(shù)初始化

所有的層用高斯隨機(jī)初始化们豌,mean=0, var=0.01

conv2,4,5和fc層的bias初始化為1,這樣做加速了網(wǎng)絡(luò)早起的訓(xùn)練(給了Relu正的輸入),其它層的bias初始化為0

學(xué)習(xí)率調(diào)整策略

base_lr給的是0.01,一旦在validation集上不下降了就降低10倍浅妆,在結(jié)束前最多降低三次望迎。

Result

結(jié)果沒啥好說的,下圖是在ILSVRC-2010上的結(jié)果凌外,比傳統(tǒng)方法都好了辩尊,開啟了深度學(xué)習(xí)刷榜的年代。

AlexNet Result on ILSVRC-2010

我的總結(jié)

AlexNet作為CNN在圖像領(lǐng)域應(yīng)用康辑,并取得顯著成功的開山之作摄欲,以現(xiàn)在的眼光來看還是有很多值得借鑒的點(diǎn)轿亮。

比如

  1. Relu作為激活函數(shù)解決tanh,sigmoid這些軟激活函數(shù)落入飽和區(qū)會(huì)梯度消失的問題,加快訓(xùn)練速度,現(xiàn)在還是最主流的激活函數(shù)胸墙。
  2. 提出Dropout在全連接層的時(shí)候我注,在單個(gè)網(wǎng)絡(luò)內(nèi)部模擬模型的ensemble,降低神經(jīng)元之間的關(guān)聯(lián)性迟隅,加強(qiáng)了耦合度但骨,在降低Overfitting的同時(shí)而不增加參數(shù)量, 雖然現(xiàn)在因?yàn)槿矸e網(wǎng)絡(luò)的出現(xiàn)在一些問題里用的越來越少了。
  3. 提出了Data Augmentation的方法智袭,random crop, flip, PCA Jittering現(xiàn)在都還是比較主流的做法奔缠,都被沿用了下來。
  4. 像overlapping pooling吼野,是現(xiàn)在網(wǎng)絡(luò)標(biāo)準(zhǔn)的pooling做法校哎。
  5. 提出了這樣一個(gè)conv,relu,maxpooling...conv,relu,maxpooling......fc,fc的分類網(wǎng)絡(luò)框架,單層看作為局部特征的提取瞳步,全局看是一個(gè)低維到高維空間的映射闷哆,fc做高維信息的整合來做分類,是后面分類網(wǎng)絡(luò)非常主流的一個(gè)框架单起。

當(dāng)然也有一些以現(xiàn)在的眼光去看值得改進(jìn)的地方,

1.比如LRN后來就很少用了阳准。

2.網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)上一些細(xì)節(jié)處現(xiàn)在也有更好的做法,比如用小kernel替代大的kernel

3.AlexNet整體還是比較淺的馏臭,深度網(wǎng)絡(luò)現(xiàn)在可以越做越深。不知道當(dāng)時(shí)沒做深有沒有硬件的限制讼稚。括儒。

Anyway,深度學(xué)習(xí)的浪潮因?yàn)锳lexNet的出現(xiàn)正式到來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锐想,一起剝皮案震驚了整個(gè)濱河市帮寻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赠摇,老刑警劉巖固逗,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異藕帜,居然都是意外死亡烫罩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門洽故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贝攒,“玉大人,你說我怎么就攤上這事时甚“祝” “怎么了哈踱?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)梨熙。 經(jīng)常有香客問我开镣,道長(zhǎng),這世上最難降的妖魔是什么咽扇? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任邪财,我火速辦了婚禮,結(jié)果婚禮上肌割,老公的妹妹穿的比我還像新娘卧蜓。我一直安慰自己,他們只是感情好把敞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布弥奸。 她就那樣靜靜地躺著,像睡著了一般奋早。 火紅的嫁衣襯著肌膚如雪盛霎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天耽装,我揣著相機(jī)與錄音愤炸,去河邊找鬼。 笑死掉奄,一個(gè)胖子當(dāng)著我的面吹牛规个,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姓建,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诞仓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了速兔?” 一聲冷哼從身側(cè)響起墅拭,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涣狗,沒想到半個(gè)月后谍婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镀钓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年穗熬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁溅。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡死陆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情措译,我是刑警寧澤别凤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站领虹,受9級(jí)特大地震影響规哪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塌衰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一诉稍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧最疆,春花似錦杯巨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至获诈,卻和暖如春仍源,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舔涎。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工笼踩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡嫌。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓嚎于,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挟冠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子于购,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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