用淺層神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)(1)

用淺層神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)

神經(jīng)網(wǎng)絡(luò)擅長擬合功能延刘。 實(shí)際上,有證據(jù)表明极谊,相當(dāng)簡單的神經(jīng)網(wǎng)絡(luò)可以滿足任何實(shí)際功能诡右。
例如,假設(shè)您有一家健康診所的數(shù)據(jù)轻猖。 您想要設(shè)計(jì)一個(gè)網(wǎng)絡(luò)帆吻,該網(wǎng)絡(luò)可以根據(jù)13個(gè)解剖測量結(jié)果預(yù)測一個(gè)人的體內(nèi)脂肪百分比。 您總共有252個(gè)示例人員咙边,您為其擁有這13項(xiàng)數(shù)據(jù)及其相關(guān)的體內(nèi)脂肪百分比猜煮。
您可以通過兩種方式解決此問題:

?使用圖形用戶界面nftool,如第1-36頁的“使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序”中所述败许。
?使用命令行功能王带,如第1-51頁的“使用命令行功能”中所述。

通常最好先從GUI開始市殷,然后使用GUI自動(dòng)生成命令行腳本愕撰。 使用任何一種方法之前,請先通過選擇數(shù)據(jù)集來定義問題醋寝。 每個(gè)GUI都可以訪問許多示例數(shù)據(jù)集搞挣,您可以使用這些示例數(shù)據(jù)來試用工具箱(請參閱“淺層神經(jīng)網(wǎng)絡(luò)的示例數(shù)據(jù)集”)。 如果您有要解決的特定問題音羞,可以將自己的數(shù)據(jù)加載到工作區(qū)中囱桨。 下一節(jié)描述數(shù)據(jù)格式。

  1. 定義問題
    要定義工具箱的擬合問題嗅绰,請將一組Q輸入向量排列為矩陣中的列舍肠。 然后,將另一組Q目標(biāo)向量(每個(gè)輸入向量的正確輸出向量)排列到第二矩陣中(有關(guān)靜態(tài)和時(shí)序數(shù)據(jù)的數(shù)據(jù)格式的詳細(xì)說明办陷,請參見“數(shù)據(jù)結(jié)構(gòu)”)貌夕。 例如,您可以為布爾AND門定義擬合問題民镜,該邏輯與門具有四組兩元素輸入向量和一個(gè)元素目標(biāo)啡专,如下所示:
inputs = [0 1 0 1; 0 0 1 1]; 
targets = [0 0 0 1];

下一部分顯示了如何使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序nftool訓(xùn)練網(wǎng)絡(luò)以擬合數(shù)據(jù)集。 本示例使用工具箱隨附的身體脂肪數(shù)據(jù)集制圈。

使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用

1 使用以下命令打開神經(jīng)網(wǎng)絡(luò)啟動(dòng)GUI:

nnstart
image.png

2單擊配件應(yīng)用程序以打開神經(jīng)網(wǎng)絡(luò)配件應(yīng)用程序们童。 (您也可以使用命令nftool畔况。)


image.png

3單擊“下一步”繼續(xù)。


image.png

4在“選擇數(shù)據(jù)”窗口中慧库,單擊“加載示例數(shù)據(jù)集”跷跪。 擬合數(shù)據(jù)集選擇器窗口打開。

注意當(dāng)需要從MATLAB工作區(qū)加載數(shù)據(jù)時(shí)齐板,請使用“選擇數(shù)據(jù)”窗口中的“輸入和目標(biāo)”選項(xiàng)吵瞻。
image.png

5選擇 Chemical,然后單擊import甘磨。 這將使您返回“選擇數(shù)據(jù)”窗口橡羞。
6單擊“下一步”以顯示“驗(yàn)證和測試數(shù)據(jù)”窗口,如下圖所示济舆。
驗(yàn)證和測試數(shù)據(jù)集分別設(shè)置為原始數(shù)據(jù)的15%卿泽。


image.png

通過這些設(shè)置,輸入向量和目標(biāo)向量將被隨機(jī)分為三組滋觉,如下所示:
?70%用于訓(xùn)練签夭。
?15%將用于驗(yàn)證網(wǎng)絡(luò)是否泛化,并在過度擬合之前停止訓(xùn)練椎侠。
?最后的15%將用作網(wǎng)絡(luò)泛化的完全獨(dú)立測試第租。
7 單擊下一步。
用于功能擬合的標(biāo)準(zhǔn)網(wǎng)絡(luò)是兩層前饋網(wǎng)絡(luò)肺蔚,在隱藏層具有S型傳遞函數(shù)煌妈,在輸出層具有線性傳遞函數(shù)儡羔。 隱藏神經(jīng)元的默認(rèn)數(shù)量設(shè)置為10宣羊。如果網(wǎng)絡(luò)訓(xùn)練性能較差,則可能需要稍后增加該數(shù)量汰蜘。


image.png

8單擊“下一步”仇冯。
image.png

9選擇一種訓(xùn)練算法,然后單擊“訓(xùn)練”族操。
對于大多數(shù)問題苛坚,建議使用Levenberg-Marquardt(trainlm),但對于某些嘈雜和小問題色难,建議使用貝葉斯正則化(trainbr)花費(fèi)更長的時(shí)間泼舱,但可以獲得更好的解決方案。 但是枷莉,對于大問題娇昙,建議使用比例共軛梯度(trainscg),因?yàn)樗褂锰荻扔?jì)算笤妙,比其他兩種算法使用的雅可比計(jì)算的存儲效率更高冒掌。 本示例使用默認(rèn)的LevenbergMarquardt噪裕。 (這是一些計(jì)算梯度的方法)
訓(xùn)連持續(xù)進(jìn)行,直到驗(yàn)證錯(cuò)誤未能減少六次迭代(驗(yàn)證停止)為止股毫。
image.png

10在“plots”下膳音,單擊“Regression”。 這用于驗(yàn)證網(wǎng)絡(luò)性能铃诬。
以下回歸圖顯示了針對訓(xùn)練祭陷,驗(yàn)證和測試集目標(biāo)的網(wǎng)絡(luò)輸出。 為了達(dá)到最佳擬合趣席,數(shù)據(jù)應(yīng)沿著45度線落下颗胡,網(wǎng)絡(luò)輸出應(yīng)等于目標(biāo)。 對于此問題吩坝,所有數(shù)據(jù)集的擬合度都相當(dāng)好毒姨,R值分別為0.93或更高。 如果需要更準(zhǔn)確的結(jié)果钉寝,則可以通過在nftool中單擊“Retrain”來重新訓(xùn)練網(wǎng)絡(luò)弧呐。 這將改變網(wǎng)絡(luò)的初始權(quán)重和偏差,并且在重新訓(xùn)練后可以產(chǎn)生改進(jìn)的網(wǎng)絡(luò)嵌纲。 在以下窗格中提供了其他選項(xiàng)俘枫。


image.png

1 查看錯(cuò)誤直方圖以獲得網(wǎng)絡(luò)性能的其他驗(yàn)證。
在“plot”窗格下逮走,單擊“Error Histogram”鸠蚪。

image.png

藍(lán)色條形代表訓(xùn)練數(shù)據(jù),綠色條形代表驗(yàn)證數(shù)據(jù)师溅,紅色條形代表測試數(shù)據(jù)茅信。 直方圖可以為您提供離群值的指示,離群值是擬合度明顯比大多數(shù)數(shù)據(jù)差的數(shù)據(jù)點(diǎn)墓臭。 在這種情況下蘸鲸,您可以看到雖然大多數(shù)錯(cuò)誤都在-5到5之間,但是有一個(gè)訓(xùn)練點(diǎn)的錯(cuò)誤值為17窿锉,而驗(yàn)證點(diǎn)的錯(cuò)誤值為12和13酌摇。
這些異常值在測試回歸圖上也可見。 第一個(gè)對應(yīng)于該點(diǎn)的目標(biāo)是50嗡载,輸出接近33窑多。最好檢查異常值以確定數(shù)據(jù)是否不好,或者這些數(shù)據(jù)點(diǎn)是否與其余數(shù)據(jù)集不同洼滚。 如果離群值是有效數(shù)據(jù)點(diǎn)埂息,但與其余數(shù)據(jù)不同,則網(wǎng)絡(luò)將為這些點(diǎn)外推。 您應(yīng)該收集更多看起來像異常值的數(shù)據(jù)耿芹,然后重新訓(xùn)練網(wǎng)絡(luò)崭篡。

2在“神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序”中單擊“下一步”以評估網(wǎng)絡(luò)。


image.png

此時(shí)吧秕,您可以針對新數(shù)據(jù)測試網(wǎng)絡(luò)琉闪。

如果您對原始或新數(shù)據(jù)的網(wǎng)絡(luò)性能不滿意,可以執(zhí)行以下操作之一:
?再次訓(xùn)練砸彬。
?增加神經(jīng)元的數(shù)量颠毙。
?獲得更大的訓(xùn)練數(shù)據(jù)集。

如果訓(xùn)練集的性能良好砂碉,但測試集的性能卻明顯較差蛀蜜,這可能表明過擬合,那么減少神經(jīng)元數(shù)量可以改善結(jié)果增蹭。 如果訓(xùn)練效果不佳滴某,則可能需要增加神經(jīng)元的數(shù)量。
3 如果您對網(wǎng)絡(luò)性能滿意滋迈,請單擊“下一步”霎奢。
4 使用此面板生成用于模擬神經(jīng)網(wǎng)絡(luò)的MATLAB函數(shù)或Simulink?圖。 您可以使用生成的代碼或圖表更好地了解神經(jīng)網(wǎng)絡(luò)如何計(jì)算輸入的輸出饼灿,或者使用MATLAB Compiler?工具和其他MATLAB代碼生成工具來部署網(wǎng)絡(luò)幕侠。


image.png

5 使用此屏幕上的按鈕來生成腳本或保存結(jié)果。


image.png

?您可以單擊“Simple Script”或“Advanced Script”來創(chuàng)建MATLAB代碼碍彭,該代碼可用于從命令行重現(xiàn)之前的所有步驟晤硕。如果您想學(xué)習(xí)如何使用工具箱的命令行功能來自定義訓(xùn)練過程,創(chuàng)建MATLAB代碼可能會(huì)有所幫助庇忌。 在第1-51頁的“使用命令行功能”中舞箍,您將更詳細(xì)地研究生成的腳本。
?您也可以將網(wǎng)絡(luò)另存為工作區(qū)中的網(wǎng)絡(luò)漆枚。 您可以對其執(zhí)行其他測試创译,也可以將其用于新輸入抵知。

6創(chuàng)建MATLAB代碼并保存結(jié)果后墙基,單擊Finish。

使用命令行功能

學(xué)習(xí)如何使用工具箱的命令行功能的最簡單方法是從GUI生成腳本刷喜,然后對其進(jìn)行修改以自定義網(wǎng)絡(luò)訓(xùn)練残制。
作為示例,請看在上一節(jié)的步驟14中創(chuàng)建的簡單腳本掖疮。

% Solve an Input-Output Fitting problem with a Neural Network % Script generated by NFTOOL % % This script assumes these variables are defined: % % houseInputs - input data.
% houseTargets - target data.

inputs = houseInputs; 
targets = houseTargets; 
% Create a Fitting Network 
hiddenLayerSize = 10; 
net = fitnet(hiddenLayerSize); % Set up Division of Data for Training, Validation, Testing 

net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; 

% Train the Network 
[net,tr] = train(net,inputs,targets); 

% Test the Network 
outputs = net(inputs); 
errors = gsubtract(outputs,targets); 
performance = perform(net,targets,outputs) 
% View the Network 
view(net) 
% Plots 
% Uncomment these lines to enable various plots.
% figure, plotperform(tr) 
% figure, plottrainstate(tr) 
% figure, plotfit(targets,outputs)

您可以保存腳本初茶,然后從命令行運(yùn)行它以重現(xiàn)上一個(gè)GUI會(huì)話的結(jié)果。 您還可以編輯腳本以自定義訓(xùn)練過程浊闪。 在這種情況下恼布,請按照腳本中的每個(gè)步驟進(jìn)行操作螺戳。

  1. 該腳本假定輸入向量和目標(biāo)向量已經(jīng)加載到工作空間中。 如果未加載數(shù)據(jù)折汞,則可以按以下方式加載它們:
load bodyfat_dataset 
inputs = bodyfatInputs;
targets = bodyfatTargets;

此數(shù)據(jù)集是工具箱中一部分的示例數(shù)據(jù)集(請參閱第1-137頁的“淺層神經(jīng)網(wǎng)絡(luò)的示例數(shù)據(jù)集”)倔幼。 通過輸入命令help nndatasets,可以查看所有可用數(shù)據(jù)集的列表爽待。 load命令還允許您使用自己的變量名從任何這些數(shù)據(jù)集中加載變量损同。 例如,命令

[inputs,targets] = bodyfat_dataset;

將人體脂肪輸入加載到數(shù)組輸入中鸟款,并將人體脂肪目標(biāo)加載到數(shù)組目標(biāo)中膏燃。

2創(chuàng)建一個(gè)網(wǎng)絡(luò)。 函數(shù)擬合(或回歸)問題的默認(rèn)網(wǎng)絡(luò)fitnet是前饋網(wǎng)絡(luò)何什,在隱藏層具有默認(rèn)的tan-Sigmoid傳遞函數(shù)组哩,在輸出層具有線性傳遞函數(shù)。 您為上一節(jié)中的一個(gè)隱藏層分配了十個(gè)神經(jīng)元(有些隨意)处渣。 該網(wǎng)絡(luò)具有一個(gè)輸出神經(jīng)元禁炒,因?yàn)槊總€(gè)輸入向量只有一個(gè)目標(biāo)值。

hiddenLayerSize = 10; 
net = fitnet(hiddenLayerSize);

注意:更多的神經(jīng)元需要更多的計(jì)算霍比,并且當(dāng)數(shù)字設(shè)置得太高時(shí)幕袱,它們傾向于使數(shù)據(jù)過擬合,但是它們使網(wǎng)絡(luò)能夠解決更復(fù)雜的問題悠瞬。 更多的層需要更多的計(jì)算们豌,但是它們的使用可能會(huì)導(dǎo)致網(wǎng)絡(luò)更有效地解決復(fù)雜的問題。 要使用多個(gè)隱藏層浅妆,請?jiān)趂itnet命令中輸入隱藏層大小作為數(shù)組的元素望迎。
3設(shè)置數(shù)據(jù)劃分。

net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;

通過這些設(shè)置凌外,輸入向量和目標(biāo)向量將被隨機(jī)劃分辩尊,其中70%用于訓(xùn)練,15%用于驗(yàn)證康辑,而15%用于測試摄欲。 (有關(guān)數(shù)據(jù)劃分過程的更多討論,請參見“劃分?jǐn)?shù)據(jù)”疮薇。)

4訓(xùn)練網(wǎng)絡(luò)胸墙。 網(wǎng)絡(luò)使用默認(rèn)的Levenberg-Marquardt算法(trainlm)進(jìn)行訓(xùn)練。 對于Levenberg-Marquardt無法獲得所需的準(zhǔn)確結(jié)果的問題按咒,或者對于大數(shù)據(jù)問題迟隅,請考慮分別將網(wǎng)絡(luò)訓(xùn)練功能設(shè)置為貝葉斯正則化(trainbr)或縮放共軛梯度(trainscg),

net.trainFcn = 'trainbr'; 
net.trainFcn = 'trainscg';

要訓(xùn)??練網(wǎng)絡(luò),請輸入:

[net, tr] = train(net, inputs, targets);

在訓(xùn)練期間智袭,將打開以下訓(xùn)練窗口奔缠。 該窗口顯示訓(xùn)練進(jìn)度,并允許您通過單擊“停止訓(xùn)練”隨時(shí)中斷訓(xùn)練吼野。


image.png

5測試網(wǎng)絡(luò)添坊。 訓(xùn)練完網(wǎng)絡(luò)后,您可以使用它來計(jì)算網(wǎng)絡(luò)輸出箫锤。 以下代碼計(jì)算網(wǎng)絡(luò)輸出贬蛙,錯(cuò)誤和整體性能。

outputs = net(inputs); 
errors = gsubtract(targets, outputs); 
performance = perform(net, targets, outputs)

通過使用位于訓(xùn)練記錄中的測試索引谚攒,也可以僅在測試集上計(jì)算網(wǎng)絡(luò)性能阳准。

tInd = tr.testInd;
tstOutputs = net(inputs(:, tInd)); 
tstPerform = perform(net,targets(tInd),tstOutputs)

對網(wǎng)絡(luò)響應(yīng)進(jìn)行一些分析。 如果在訓(xùn)練窗口中單擊Regression馏臭,則可以在網(wǎng)絡(luò)輸出和相應(yīng)目標(biāo)之間執(zhí)行線性回歸野蝇。
下圖顯示了結(jié)果。


image.png

輸出可以很好地跟蹤目標(biāo)以進(jìn)行訓(xùn)練括儒,測試和驗(yàn)證绕沈,并且總響應(yīng)的R值超過0.96。 如果需要更精確的結(jié)果帮寻,則可以嘗試以下任何一種方法:?使用init將初始網(wǎng)絡(luò)權(quán)重和偏差重置為新值乍狐,然后再次進(jìn)行訓(xùn)練(請參閱“初始化權(quán)重”(init))。
?增加隱藏神經(jīng)元的數(shù)量固逗。
?增加訓(xùn)練向量的數(shù)量浅蚪。
?如果有更多相關(guān)信息,請?jiān)黾虞斎胫档臄?shù)量烫罩。
?嘗試其他訓(xùn)練算法(請參閱“訓(xùn)練算法”)惜傲。
在這種情況下,網(wǎng)絡(luò)響應(yīng)令人滿意贝攒,您現(xiàn)在可以將網(wǎng)絡(luò)用于新輸入盗誊。
7查看網(wǎng)絡(luò)圖。

view(net)
image.png

要獲得更多有關(guān)命令行操作的經(jīng)驗(yàn)隘弊,請嘗試以下一些任務(wù):?在訓(xùn)練過程中哈踱,打開一個(gè)繪圖窗口(例如回歸繪圖),并觀看其動(dòng)畫长捧。
?使用諸如plotfit嚣鄙,plotregression,plottrainstate和plotperform之類的功能從命令行進(jìn)行打印串结。 (有關(guān)使用這些功能的更多信息,請參見其參考頁。)另外肌割,從命令行進(jìn)行培訓(xùn)時(shí)卧蜓,請參閱高級腳本以獲取更多選項(xiàng)。
每次訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)把敞,由于不同的初始權(quán)重和偏差值以及對訓(xùn)練弥奸,驗(yàn)證和測試集。 結(jié)果奋早,針對相同問題訓(xùn)練的不同神經(jīng)網(wǎng)絡(luò)可以為相同輸入提供不同的輸出盛霎。 為了確保找到了精度較高的神經(jīng)網(wǎng)絡(luò),請重新訓(xùn)練幾次耽装。
如果需要更高的精度愤炸,還有幾種其他技術(shù)可以改善初始解決方案。 有關(guān)更多信息掉奄,請參見“改善淺層神經(jīng)網(wǎng)絡(luò)泛化并避免過度擬合”规个。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姓建,隨后出現(xiàn)的幾起案子诞仓,更是在濱河造成了極大的恐慌,老刑警劉巖速兔,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墅拭,死亡現(xiàn)場離奇詭異,居然都是意外死亡涣狗,警方通過查閱死者的電腦和手機(jī)帜矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屑柔,“玉大人屡萤,你說我怎么就攤上這事〉穑” “怎么了死陆?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唧瘾。 經(jīng)常有香客問我措译,道長,這世上最難降的妖魔是什么饰序? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任领虹,我火速辦了婚禮,結(jié)果婚禮上求豫,老公的妹妹穿的比我還像新娘塌衰。我一直安慰自己诉稍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布最疆。 她就那樣靜靜地躺著杯巨,像睡著了一般努酸。 火紅的嫁衣襯著肌膚如雪仍源。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天昼伴,我揣著相機(jī)與錄音价涝,去河邊找鬼色瘩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钢颂,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼钱豁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谤碳?” 一聲冷哼從身側(cè)響起漩仙,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡进统,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年掉分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了华坦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枫耳,死狀恐怖凄硼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情预皇,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布婉刀,位于F島的核電站吟温,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏突颊。R本人自食惡果不足惜鲁豪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望律秃。 院中可真熱鬧爬橡,春花似錦、人聲如沸棒动。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽船惨。三九已至柜裸,卻和暖如春缕陕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疙挺。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工扛邑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铐然。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓蔬崩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锦爵。 傳聞我的和親對象是個(gè)殘疾皇子舱殿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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