第二周《卷積神經(jīng)網(wǎng)絡(luò)-實(shí)例探究》

P2.1為什么要進(jìn)行實(shí)例探究

就是列了一下提綱悯嗓,告訴我們我會講這些內(nèi)容,可能盡管你不是搞圖像方向的卸察,但是你可以借鑒里面的一些重要思想案!


P2.2經(jīng)典網(wǎng)絡(luò)

第一個是1980年的LeNet-5坑质,其中有幾個注意點(diǎn):

  • 當(dāng)時是沒有用ReLU的合武,用的是sigmod跟tanh作為非線性激活函數(shù);
  • 網(wǎng)絡(luò)的模式沿用至今:也就是(卷積+池化)+····+(卷積+池化)+全連接1+···+全連接n+輸出涡扼;
  • 可以發(fā)現(xiàn)隨著深度增加圖像的長寬變小稼跳,但是通道數(shù)確實(shí)增加的;
  • 當(dāng)時這個網(wǎng)咯的參數(shù)僅僅60K的樣子吃沪,現(xiàn)如今可是百萬級了疤郎啤!
  • 看論文的時候先看下第二節(jié)講的是系統(tǒng)架構(gòu)票彪,然后第三章有實(shí)驗(yàn)結(jié)果萎津,have fun!

第二個是AlexNet抹镊,由于是Alex最先發(fā)現(xiàn)的所以以之命名锉屈,其特點(diǎn)如下:

  • 卷積核很大,stride也大垮耳;
  • 參數(shù)很多60 millions(遠(yuǎn)大于LeNet-5的60K)颈渊;
  • 使用了ReLU非線性函數(shù)遂黍;
  • 當(dāng)時計(jì)算能力問題,曾設(shè)計(jì)把網(wǎng)絡(luò)給2個GPU進(jìn)行計(jì)算俊嗽,論文中有對如何分配雾家、GPU之間如何通信都有一定的論述(這個部分就很工程了);
  • 論文里提到的local response normalizations實(shí)際中驗(yàn)證效果并不好绍豁,未有沿用芯咧。


    圖片.png

第三個是VGG-16,一句話總結(jié)的話就是它使得網(wǎng)絡(luò)的結(jié)構(gòu)變簡潔了竹揍。

  • 使用的卷積核總是3*3的敬飒,stride總是為1,圖像保持為same(加padding)芬位;
  • 最大池化總為2*2无拗,stride=2不變,
  • VGG-16的16是指有16層昧碉,同理VGG-19就是19層英染,同樣有對應(yīng)論文的,但性能跟16層差不多被饿,所以使用VGG-16的人偏多四康;
  • 138millions的參數(shù);
  • 通過pooling來減少圖片尺寸狭握;
  • 作者認(rèn)為通過double卷積核數(shù)量可以更好的描述圖片箭养,同時到達(dá)512個卷積核已是最多了。


P2.3 殘差網(wǎng)絡(luò)

講到了深度神經(jīng)網(wǎng)絡(luò)會有各種問題哥牍,比如梯度消失啊梯度爆炸啊什么的!

之前有說到了喝检,由于sigmod激活函數(shù)的非線性會導(dǎo)致梯度消失或者爆炸;而是會消失還是會爆炸嗅辣,這由激活函數(shù)跟權(quán)值一起決定,因此這里就算將激活函數(shù)改為ReLU但是也還是存在梯度消失或者爆炸的問題的挠说,因此殘差網(wǎng)絡(luò)的出現(xiàn)對網(wǎng)絡(luò)深度地拓展具有重要意義澡谭。

殘差網(wǎng)絡(luò)的架構(gòu)如下圖所示,本來的深度模型就是輸入然后經(jīng)過:[線性操作(linear) + 激活函數(shù)(ReLU)]的疊加來構(gòu)成深度损俭,這樣子很容易發(fā)生梯度的問題蛙奖,原因上面也講了。

然后我們的殘差網(wǎng)絡(luò)結(jié)構(gòu)基本原理就是:把前面層的輸出直接短接到后面層那里去杆兵,需要注意的就是:插入的位置是在線性激活之后跟ReLU激活之前雁仲,如圖所示。

看到作者何凱明把這種接法叫short cut琐脏,還有種叫法是skip connection攒砖,其實(shí)這也好理解缸兔,你既然把信息傳遞到后面層,那么我很自然地想“我萌能不能把信息傳到后面的不同層呢吹艇?因?yàn)槲覀円膊恢谰唧w傳到哪層合適嘛6杳邸!受神!”

一般的殘差網(wǎng)絡(luò)如下圖所示:這里有5塊抛猖,每塊叫做殘差塊,這五塊疊加起來構(gòu)成了殘差網(wǎng)咯鼻听。


那你這個效果如何呢财著?

下圖表示的是:常規(guī)的深度網(wǎng)絡(luò),也就是plain精算,理論上是那條綠色的theory曲線瓢宦,然而實(shí)際上卻是藍(lán)色那條reality曲線,這說明深度網(wǎng)絡(luò)中的機(jī)理我們了解的還并不是特別清楚灰羽,某種程度上來說還是個黑盒子驮履;

而我們的ResNet網(wǎng)絡(luò)表現(xiàn)出來的效果卻是跟理論曲線是相近的,也就是說殘缺信息(層間信息)是深度網(wǎng)絡(luò)的一個重要特性傲馈玫镐!


P2.4 為什么殘缺網(wǎng)絡(luò)表現(xiàn)如此之好?

從圖中可知怠噪,假設(shè)輸入x經(jīng)過一個big NN大型網(wǎng)絡(luò)之后輸出a[l]恐似,那么我們再在后面給他加上兩層網(wǎng)絡(luò),而且這兩層通過加上short cut線來構(gòu)成殘缺網(wǎng)絡(luò)傍念,因此(假設(shè)非線性激活函數(shù)數(shù)ReLU矫夷,也就是說激活輸出的值全部都是大于等于0的)從這往上數(shù)第三張圖寫出了殘差網(wǎng)絡(luò)的激活函數(shù),于是有:

a[l+2] = g(z[l+2] + a[l]) = g(w[l+2]*a[l+1] + b[l+2] + a[l]) **
往我們對W或者b進(jìn)行L2正則化就可以使得其均取值為0憋槐,這樣子的話双藕,如圖所示最后的結(jié)果就是a[l],也就是說這個網(wǎng)絡(luò)直接就去掉了阳仔,這可是在深度增加的情況下忧陪,卻不增加計(jì)算量的啊近范!嘶摊,其實(shí)這里就是在學(xué)習(xí)一個恒等函數(shù)啊,也就是一個自編碼器捌谰亍叶堆!

這也就是為什么常規(guī)的深度學(xué)習(xí)網(wǎng)絡(luò)在一定程度上學(xué)習(xí)著學(xué)習(xí)著效果反而不好了!因?yàn)樗麄儗W(xué)恒等函數(shù)很難俺舛拧u蹇铡俯萌?

保證網(wǎng)絡(luò)功能(恒等函數(shù))的前提下提高效率(恒等函數(shù)參數(shù)為0,即減少參數(shù))上枕!

殘差網(wǎng)絡(luò)的卷積操作是same操作咐熙,維度不同的話是需要變維度的!


有個細(xì)節(jié)就是辨萍,ResNet(下圖中)中的3*3卷積都是same的棋恼,因此才有Z[l+2] + a[l]是同維度的。conv锈玉、pool爪飘、softmax這些都是有的。

P2.5 1*1卷積核的作用拉背?(網(wǎng)絡(luò)中的網(wǎng)絡(luò))

這玩意兒是啥师崎?

  • 1*1的卷積核作用在一個通道(深度)為1的輸入,表現(xiàn)出來的就是單單把這個通道做一些線性放大縮小的作用椅棺,沒啥意義襟沮;

  • 但是放到通道為32的輸入時焕蹄,效果就不一樣了,我們直觀的理解就是不同通道的統(tǒng)一位置都會經(jīng)歷一個縮放效果,直觀感受就是加強(qiáng)或者弱化某些通道的輸出丛忆。

  • 這個叫做network in network


這玩意的作用是啥辐棒?

  • 如下圖所示蚌铜,這玩意能在通道上降維(我們知道圖片大小的降維是通過pooling來實(shí)現(xiàn)的)匾嘱;
  • 我們的圖片是28*28*192的,我們的卷積核是1*1*192的勺美,因此選擇n個卷積核就輸出多大的通道递胧,這里選的是32通道,也就是最終實(shí)現(xiàn)通道降維的效果赡茸;
  • ps. 我們這里圖片大小是木有降維的哈缎脾!因?yàn)?*1啊L陈印!治筒!


P2.6 inception network(谷歌) motivation

  • 大概意思是我們選擇卷積核大小的時候可以選擇多種大小的共同使用屉栓,如1*3、3*3耸袜、3*5啊啥的友多!

  • 網(wǎng)絡(luò)的核心思想是:我們不去人工指定定卷積核的類型,也不去人工組合它們來使用堤框,而是全部拿出來域滥,甚至是直接max-pooling纵柿,讓網(wǎng)絡(luò)自動去學(xué)習(xí)最優(yōu)的組合參數(shù),哪些卷積核是重要的启绰,然后訓(xùn)練出參數(shù)來昂儒。

  • 注意的是:輸入是192個通道,卷積核大于1*1的記得是same(記得加padding)委可,然后將輸出疊加起來構(gòu)成輸出的通道渊跋。


硬傷是啥?

  • 計(jì)算量是硬傷白徘恪拾酝!,這僅取其中一小部分卡者,就5*5卷積核這個蒿囤,28*28的圖片大小,要對應(yīng)32個卷積核崇决;每個卷積核大小是5*5材诽,然后對應(yīng)的深度是192,因此全部乘起來就是120millions的計(jì)算量八宰岳守!這可是12億了啊碌冶!注意湿痢,這還只是一小部分啊扑庞!

我們加入1*1卷積核之后的計(jì)算量看看好多少譬重!

  • 下圖中有2個要點(diǎn),其一則解釋了為啥1*1卷積核叫做bottleneck layer罐氨,因?yàn)檫@玩意跟瓶子的脖子真的是長一模一樣巴喂妗!話說瓶頸的作用是啥栅隐?是限制流量吧塔嬉!放置一次性倒出太多,而我們這里則是限制計(jì)算量的白馇摹谨究!計(jì)算量即流量,限制一下流出來少點(diǎn)泣棋!
  • 這里算了一下計(jì)算量大概是12millions左右胶哲,是之前的整整十分之一啊潭辈!這效率杠杠的鸯屿!

思考:為什么不直接用32個1*1的卷積核得到28*28*32的輸出澈吨?我個人理解是,1*1主要的作用不是提取特征寄摆,而是進(jìn)行計(jì)算量壓縮的谅辣,因此必須要有個大一點(diǎn)的卷積核來提取特征啊冰肴!

小結(jié):inception module:當(dāng)你不想自己去選擇那些個卷積核類型合適的時候屈藐,say: let's do them all. and let's concatenate the results.

P2.7 inception網(wǎng)絡(luò)

inception模塊構(gòu)成如下圖所示,將前面激活函數(shù)的輸出熙尉,再組合出一些卷積核進(jìn)行輸出联逻,將這些輸出疊起來就是輸出啦!是按通道這個維度疊起來喲~

這個才是論文中描述的整個網(wǎng)絡(luò)結(jié)構(gòu)检痰,單單就其中某個block來說的話就是上面那個包归!

  • 中間有些池化層,是為了調(diào)整維度的铅歼;
  • 中間有兩路支路公壤,也是softmax直接輸出的,這個是用來做預(yù)測的椎椰,放置過擬合厦幅,個人認(rèn)為是硬件電路里面的測試點(diǎn)吧!
  • 該網(wǎng)絡(luò)是谷歌的輸出慨飘,叫g(shù)oogleLeNet是對LeNet的致敬确憨。

總結(jié):

  • Inception:注意是大寫開頭,這個是官方引用的電影梗瓤的!“我們需要進(jìn)入更深層次休弃!”
  • 版本更新成V2、V3圈膏、V4塔猾,還有個甚至是跳躍連接,效果不錯稽坤!

P2.8 我們不要自己重復(fù)造輪子丈甸!

用好github網(wǎng)站!

P2.9 遷移學(xué)習(xí)

  • 用別人訓(xùn)練好的模型尿褪,來作為我們模型的預(yù)訓(xùn)練部分睦擂,這相對于隨機(jī)初始化來說能更快收斂!
  • 數(shù)據(jù)集有ImageNet茫多、MS COCO祈匙、pascal

問題:我們目標(biāo)都不一樣的話還能隨便用別人的模型嘛忽刽?怎么使別人的模型適應(yīng)我們的任務(wù)天揖?具體細(xì)節(jié)是什么夺欲?

  • 比如要識別貓,如下圖所示今膊,我們我識別這兩個動物是不是貓些阅,有三種可能,Tigger是斑唬,misty是或者兩個都不是市埋,因此softmax輸出三個值;

  • 第一步我們先從github上下載代碼恕刘,最重要的是記得下載權(quán)值缤谎;

  • 第二步就是去掉他們的softmax函數(shù),然后加上自己的褐着!這個時候把別人的網(wǎng)絡(luò)給凍結(jié)起來不訓(xùn)練坷澡,而是只訓(xùn)練我們自己的softmax就好!這樣子的話可以實(shí)現(xiàn)用少量的數(shù)據(jù)樣本就可以獲得很好的效果含蓉;

  • 不同的框架有不同的凍結(jié)方式频敛,比如有的就是設(shè)置freeze = 1還有的就是trainableParameter = 0等等此類!

  • 由于別人這個網(wǎng)絡(luò)就是一個固定的函數(shù)了嘛馅扣!一個預(yù)訓(xùn)練的操作就是把圖片提前經(jīng)過這個函數(shù)斟赚,得到的是這個網(wǎng)絡(luò)輸出的特征嘛!我們把這個特征給存起來到硬盤差油,那么我們是不是只需要訓(xùn)練我們自己的softmax函數(shù)就好了呀拗军!這樣子能大大提高訓(xùn)練效率的啊厌殉!

  • 這里說道食绿,假如你的數(shù)據(jù)集很小,你可以把整個網(wǎng)絡(luò)凍結(jié)來訓(xùn)練公罕;但是假如你的數(shù)據(jù)集中等器紧,那么就不要浪費(fèi)了,因?yàn)槲覀兛梢杂?xùn)練出更有針對性的特診奥ゾ臁铲汪!因此,我們一般在中等數(shù)據(jù)集時只凍結(jié)前面的淺層特征部分罐柳,后面復(fù)雜特診部分你都要去訓(xùn)練掌腰,用別人已有的結(jié)構(gòu)也好,或者你自己構(gòu)建的結(jié)構(gòu)也好张吉,總之齿梁,不要把中等數(shù)據(jù)集里面的信息量給浪費(fèi)了!

  • 大數(shù)據(jù)集的時候,別人網(wǎng)絡(luò)的所有層都要去訓(xùn)練喲勺择!用別人的框架來訓(xùn)練自己的目標(biāo)创南!更有針對性!

P2.10 數(shù)據(jù)擴(kuò)充(數(shù)據(jù)增強(qiáng))

第一種:

  • 鏡像
  • 隨機(jī)截取部分圖像
  • 旋轉(zhuǎn)省核、剪切稿辙、局部扭曲····(操作麻煩,實(shí)際中使用較少)


第二種:

  • 色彩轉(zhuǎn)換:就是把RGB的值分別添加一個失真值气忠,實(shí)際中這個失真值是基于某種分布的(比如是對某些場景的覆蓋)邻储!這個其實(shí)不就是寫測試用例么?旧噪!用來測試我們模型的吨娜!
    PCA顏色增強(qiáng)(Alexnet論文中有):就是分析發(fā)現(xiàn)R、G的顏色占得比重多一點(diǎn)淘钟,B少一點(diǎn)萌壳,那么我就把R、G調(diào)少多一點(diǎn)日月,B調(diào)少少一點(diǎn)袱瓮,最終達(dá)到均衡,很容易理解的爱咬。

數(shù)據(jù)生成的軟件流程如下所示:開一個線程專門做數(shù)據(jù)產(chǎn)生的尺借,從硬盤讀數(shù)據(jù)然后構(gòu)造出我們要的數(shù)據(jù)(mini batch),然后送給其他線程或者GPU去執(zhí)行訓(xùn)練操作精拟。

總結(jié):圖像顏色失真大小燎斩、分布等這些是超參數(shù),隨機(jī)剪切大小蜂绎、模式也是超參數(shù)栅表,這些是需要我們?nèi)藶楦鶕?jù)實(shí)際場景來設(shè)計(jì)的,因此师枣,具體場景具體分析吧怪瓶!童鞋們!

P2.11計(jì)算機(jī)視覺現(xiàn)狀

數(shù)據(jù)量和手工工程的關(guān)系:
數(shù)據(jù)量少的時候我們需要人工構(gòu)建特征践美,數(shù)據(jù)量大(當(dāng)然在機(jī)器視覺領(lǐng)域我們從來不認(rèn)為數(shù)據(jù)量是足夠的)的時候就構(gòu)建復(fù)雜的網(wǎng)絡(luò)架構(gòu)來實(shí)現(xiàn)任務(wù)洗贰;

  • 當(dāng)我們有很多數(shù)據(jù)的時候,就不會花時間去建立手工特征陨倡,而是花時間去建立學(xué)習(xí)系統(tǒng)敛滋;

  • 當(dāng)我們擁有較少數(shù)據(jù)的時候,一般做法就是人工構(gòu)建很多很復(fù)雜的特怔或者叫做“超參數(shù)”兴革,但是其實(shí)還是有種學(xué)習(xí)系統(tǒng)是可以借用的绎晃,比如上面說到的遷移學(xué)習(xí):即用別人的模型來訓(xùn)練你的模型蜜唾,而本質(zhì)上則是利用==相似數(shù)據(jù)==來加速及提高你的學(xué)習(xí)系統(tǒng)

發(fā)論文的算法都是在一個標(biāo)準(zhǔn)測試集上的表現(xiàn),并不是在真實(shí)的生產(chǎn)環(huán)境中產(chǎn)生庶艾;

其中他們用到的一些小tips如下:

集成Ensembling:

  • 構(gòu)建好幾個神經(jīng)網(wǎng)絡(luò)模型灵妨,然后把輸出加權(quán)平均,這會使得你在基準(zhǔn)上的提高1%~2%的精度落竹;但是,由于計(jì)算量也加大了好幾倍货抄,因此這種只適合在競賽中使用述召,生產(chǎn)中使用就是浪費(fèi)了啊蟹地!

多剪切:

  • 就是把一張圖片進(jìn)行鏡像之后积暖,然后區(qū)域性剪切成小圖片,然后送入模型進(jìn)行訓(xùn)練怪与,也就是擴(kuò)充數(shù)據(jù)集岸嵝獭!
  • 10-corp法:把圖片鏡像為兩張圖分别,然后第一張取中心區(qū)域遍愿,然后基于此中心區(qū)域再次進(jìn)行取左上角、左下角耘斩、右上角沼填、右下角四個區(qū)域,因此一張圖最后得到5張剪切圖括授;鏡像的那張也類似坞笙,總共十張圖,因此叫10-crop荚虚。將之送進(jìn)模型進(jìn)行訓(xùn)練薛夜,并將十個輸出結(jié)果平均來作為最終的結(jié)果


使用開源代碼:

  • 使用論文中的網(wǎng)絡(luò)架構(gòu)版述;
  • 應(yīng)當(dāng)學(xué)習(xí)開源的模型框架梯澜,使用他們的代碼,因?yàn)樗麄円呀?jīng)把如學(xué)習(xí)率這樣的超參數(shù)調(diào)好了渴析,繁瑣的工作都幫你做好了腊徙!
  • 使用別人已經(jīng)訓(xùn)練好的模型,然后在你的數(shù)據(jù)集上進(jìn)行精調(diào)檬某,這可使得你的模型在應(yīng)用程序中運(yùn)行的更快撬腾。

總結(jié)

  • 大量的計(jì)算機(jī)視覺架構(gòu)的學(xué)習(xí),并大致說了一下為啥有效恢恼;
  • ···
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民傻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漓踢,老刑警劉巖牵署,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喧半,居然都是意外死亡奴迅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門挺据,熙熙樓的掌柜王于貴愁眉苦臉地迎上來取具,“玉大人,你說我怎么就攤上這事扁耐∠炯欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵婉称,是天一觀的道長块仆。 經(jīng)常有香客問我,道長王暗,這世上最難降的妖魔是什么悔据? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俗壹,結(jié)果婚禮上蜜暑,老公的妹妹穿的比我還像新娘。我一直安慰自己策肝,他們只是感情好肛捍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著之众,像睡著了一般拙毫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棺禾,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天缀蹄,我揣著相機(jī)與錄音,去河邊找鬼膘婶。 笑死缺前,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悬襟。 我是一名探鬼主播衅码,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脊岳!你這毒婦竟也來了逝段?” 一聲冷哼從身側(cè)響起垛玻,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奶躯,沒想到半個月后帚桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹黔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年账嚎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡蔓。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郭蕉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浙值,到底是詐尸還是另有隱情,我是刑警寧澤檩小,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布开呐,位于F島的核電站,受9級特大地震影響规求,放射性物質(zhì)發(fā)生泄漏筐付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一阻肿、第九天 我趴在偏房一處隱蔽的房頂上張望瓦戚。 院中可真熱鬧,春花似錦丛塌、人聲如沸较解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印衔。三九已至,卻和暖如春姥敛,著一層夾襖步出監(jiān)牢的瞬間奸焙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工彤敛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与帆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓墨榄,卻偏偏與公主長得像玄糟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袄秩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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