lesson7 part3 GAN

回到圖像修復(fù) [52:01]

lesson7-superres-gan.ipynb

要創(chuàng)建可以把差圖片變成好圖片的模型,我們需要有包含好圖片和差圖片的數(shù)據(jù)集疫赎。最簡單的方式乙帮,就是找到好圖片扑媚,再把它們變差饵筑。


image.png

把它們變差的方式是創(chuàng)建一個叫crappify()的函數(shù)埃篓,里面包含了你把圖片變差的邏輯。我的是這樣的翻翩,你可以自己寫一個:

打開好圖片

  • 調(diào)整大小都许,變成小的96x96分辨率,使用雙線性插值
  • 然后取一個10到70隨機(jī)數(shù)
  • 把這個數(shù)畫到圖片隨機(jī)的位置
  • 然后用這個隨機(jī)數(shù)作為JPEG畫質(zhì)保存圖片
  • 如果JPEG畫質(zhì)是10嫂冻,圖片看起來就是垃圾胶征,如果是質(zhì)量數(shù)是70則說明質(zhì)量不錯。如


    image

    可以看下這個(最后一行)桨仿,這里有個數(shù)字睛低。它是翻轉(zhuǎn)變形后的。你不會總是看到這樣的數(shù)字服傍,這是我們隨機(jī)添加的钱雷,很多時候,它是沒有的吹零。

我們要演示怎樣把這樣有文字的罩抗、畫質(zhì)非常差的、故意制作的圖片變成右邊的這樣高質(zhì)量的圖灿椅。我使用是牛津的寵物數(shù)據(jù)集套蒂。我們在第一課用的那個。其它的畫質(zhì)都不如這些貓和狗的圖片茫蛹。

parallel并行 [53:48]

crappify()函數(shù)的處理可能需要花挺長時間操刀,但fastai有一個叫parallel的函數(shù),如果你給parallel()傳入一個函數(shù)名,然后還有一連串東西來運(yùn)行這個函數(shù)婴洼,這樣可以運(yùn)行的非彻强樱快。
image.png

這次作業(yè)里一件有意思的事就是寫這個函數(shù)柬采,試一試想想怎么寫一個有趣的殘次化函數(shù)欢唾,可以用來做你想做的事。如果你想為黑白圖片著色警没,你可以用殘次化函數(shù)來把圖像變成黑白的匈辱。如果你想對圖像做大塊地切割,并把它們替換成幻覺圖片亡脸,你可以在這里加一個黑箱。
image.png

如果你想處理舊家庭照片掃描圖树酪,那種已經(jīng)折起來浅碾,起皺了的圖片。你可以嘗試找到方法续语,來給圖片增加落灰垂谢,起皺了的折痕,等等疮茄。任何你沒有添加在殘次化函數(shù)里的東西滥朱,你的模型不會去學(xué)習(xí)怎樣修復(fù)它根暑。因為每次它在你的輸入和輸出照片上看到的都是一樣的, 所以它認(rèn)為這不是它需要修復(fù)的東西徙邻。

現(xiàn)在我們想創(chuàng)建這樣一個模型排嫌,可以輸入左邊這樣的照片,輸出右邊這樣的照片缰犁。
image

顯然淳地,我們要用U-Net,因為我們已經(jīng)知道U-Net可以做這樣的事帅容。我們把數(shù)據(jù)傳到U-Net里颇象。

image.png

我們的data就是這兩個文件夾里的這些圖片的文件名,

image.png

做一些數(shù)據(jù)轉(zhuǎn)化并徘,數(shù)據(jù)堆歸一化遣钳,或者使用imagenet_stats。因為我們將用預(yù)處理模型饮亏。為什么我們用預(yù)訓(xùn)練模型耍贾?因為如果我們想去掉這個46,你需要知道這可能是什么路幸,你需要知道這是一個什么的圖片荐开。不然,怎樣知道它原本應(yīng)該是什么樣子简肴?所以我們要用預(yù)訓(xùn)練模型晃听,它知道如何處理這些東西。

我們用這些數(shù)據(jù)創(chuàng)建U-Net砰识,架構(gòu)是ResNet34能扒。這三個東西(blur, norm_type, self_attention)是重要的、有意義的辫狼、有用的初斑,
image.png

但我要把它們放在課程第二部分講,如果你要用U-net解決這樣的問題的話膨处,這三者要一直保留见秤。

這部分東西我叫它生成器,它將生成模型真椿。這不是它們的正式定義鹃答,但基本意思是這樣的。我們輸出的是實物突硝,這個例子里就是一個圖像测摔,而不只是數(shù)字。我們將生成一個生成學(xué)習(xí)器(generator learner),也就是這個U-Net learner锋八,然后我們可以fit浙于,我們使用了Mse損失函數(shù),即均方差挟纱,也就是實際像素值和我們的預(yù)測的像素值間的均方差路媚。MSE 損失通常要兩個向量。這里樊销,我們有兩個圖片,我們有一個MSE Loss Flat版本(MSC扁平損失)脏款,也就是將那些圖像扁平化成一個長向量围苫。’沒有理由不這樣做撤师,即使你只有一個向量剂府,它也可以用,如果你沒有向量剃盾,它也會工作得很好腺占。

image.png

所以關(guān)于像素值,均方誤差已經(jīng)下降到了0.05痒谴,用了1分35秒衰伯。這個結(jié)果還可以接受。像fastai里的所有東西一樣表現(xiàn)不錯积蔚。因為我們默認(rèn)做遷移學(xué)習(xí)意鲸,當(dāng)你創(chuàng)建這個時,

image.png

它會凍結(jié)預(yù)訓(xùn)練部分尽爆。U-Net的預(yù)處理部分是這個下采樣部分怎顾。

image.png

就是用了ResNet在的地方。

image.png

所以我給這部分解凍漱贱,再訓(xùn)練一下槐雾,看看結(jié)果!用4分鐘的訓(xùn)練幅狮,我們得到了可以完美去除數(shù)字的模型募强。


image

它的上采樣做得不好,但也挺好了彪笼。有時它在去除數(shù)字時钻注,它可能會留下一點(diǎn)殘跡。但也已經(jīng)做得很好的了配猫。所以如果我們想做的是幅恋,去除水印,這已經(jīng)結(jié)束了泵肄。

但是我們還沒有完成捆交,因為我們想讓中間的圖更像右邊的圖淑翼。怎樣做到呢?我們沒有做到這個品追,是因為我們的損失函數(shù)沒有體現(xiàn)我們想要的是什么樣的玄括。因為實際上,中間圖片和右邊圖片的像素均方差非常小肉瓦。大多數(shù)像素都非常接近正確的顏色了遭京,但我們還缺了枕頭的紋理,以及幾乎整個眼球的部分泞莉。我們還缺少了毛發(fā)質(zhì)感的部分哪雕。所以我們想要一些能比MSE效果更好的損失函數(shù)。比如說鲫趁,這是不是一個優(yōu)質(zhì)圖片斯嚎。

生成對抗網(wǎng)絡(luò)(Generative Adversarial Network) [59:23]

這有一個比較普遍的,回答這個問題的方法挨厚。它叫做生成對抗網(wǎng)絡(luò)(Generative Adversarial Network)堡僻,也就是GAN。GAN用一個損失函數(shù)來解決這個問題疫剃,這個函數(shù)實際上調(diào)用了另外一個模型钉疫。


image

我們拿到了差的圖片(crappy image),而我們已經(jīng)建立了一個生成器巢价,然后它產(chǎn)生了這樣的預(yù)測(中間圖片)彤委。我們把一個高分辨率的照片(右邊圖片)愤炸,和用基于像素的均方誤差指標(biāo)生成的預(yù)測來比較。

我們也可以訓(xùn)練另外一個模型,我們可以叫它discriminator(辨別器)或者critic(鑒別器)状答,這都是相同的東西后德。我會叫它c(diǎn)ritic根悼。我們構(gòu)建一個二分類模型彤叉,比較所有生成圖像和相應(yīng)的真實的高分辨率圖像,并學(xué)習(xí)分類棉胀。區(qū)分生成和真實的圖像法瑟。當(dāng)你看一些圖片,然后問“嘿唁奢,你怎么看霎挟,這是一個高分辨率的貓還是一個生成的貓?這個呢麻掸?是一個高分辨率的貓還是一個生成的貓酥夭?”這就是一個普通的標(biāo)準(zhǔn)二分類交叉熵分類器。我們已經(jīng)知道怎樣做這個二分類分類器了。如果我們有這兩者之一(Discriminator/Critic)熬北,我們可以訓(xùn)練微調(diào)生成器疙描,


image.png

不再使用像素均方差做損失度,損失度可以是我們騙過判別器的程度作為損失讶隐,能否生成出判別器認(rèn)為是真實的圖片起胰。

這是一個很好的方案,因為如果做到了這個巫延,如果損失函數(shù)是“我能不能騙過critic”效五,它會學(xué)習(xí)生成critic分辨不出真假的圖片。我們可以像這樣訓(xùn)練幾個批次炉峰。但是critic表現(xiàn)并不是那么好火俄,因為要分辨它們不是很難。這些圖片太差了讲冠,所以要分辨出來很簡單。所以适瓦,在用這個critic做損失函數(shù)竿开,訓(xùn)練了一段時間后,這個生成器變得很擅長騙過critic〔N酰現(xiàn)在我們要停止訓(xùn)練generator否彩,我們要用這些新生成的圖片再訓(xùn)練critic。現(xiàn)在這個generator更好了嗦随,對critic來說列荔,要判斷哪個是真的哪個是假的變得更難了。我們要多訓(xùn)練一下判別器枚尼。一旦完成贴浙,這個critic現(xiàn)在又很擅長識別出生成的圖片和原始圖片的區(qū)別,我們要回過頭來署恍,再用這個更好的critic作為損失函數(shù)微調(diào)generator崎溃。

我們這樣來回做。這就是一個GAN盯质。這是我們的GAN版本袁串。我不知道有沒有人寫過這個,我們做了一個新版本的GAN呼巷,它和原始的GAN很像囱修,但是我們有個精妙的技巧,我們用了預(yù)訓(xùn)練的generator和critic王悍。GAN經(jīng)常上新聞破镰。是很是時尚的工具,如果你見過它們,你可能聽說過訓(xùn)練起來很難啤咽。但我們發(fā)現(xiàn)晋辆,最難的是在開始。如果你沒有預(yù)訓(xùn)練的generator宇整,也沒有預(yù)訓(xùn)練的critic瓶佳,那基本是盲人騎瞎馬。generator要生成能騙過critic的東西鳞青,但critic什么都不知道霸饲,所以沒有什么事可做。然后critic試著判斷是生成的圖片是不是真的臂拓,這很明顯厚脉,所以它直接就做了決斷。所以它們都沒有進(jìn)步胶惰。等到他們終于上道了傻工,進(jìn)展就很迅速了。

所以如果你找到一種無須GAN來生成圖片的方法孵滞,比如基于像素的均方誤差損失中捆,不用GAN模型而去做判別,比如在第一代生成器上預(yù)測坊饶,你就可以有很大的進(jìn)展泄伪。

創(chuàng)建一個critic/discriminator [1:04:04]

我們來創(chuàng)建critic。要創(chuàng)建一個完全標(biāo)準(zhǔn)的fastai分類模型匿级,我們需要兩個文件夾蟋滴,一個放高分辨率的圖片,一個放生成的圖片痘绎。我們已經(jīng)有了存高分辨率圖片的文件夾津函,我們只需要保存生成的圖片。

image.png

這是做這個的一小段代碼孤页。我們要創(chuàng)建一個叫image_gen的目錄球散,賦值給path_gen的變量里。一個叫save_preds的小函數(shù)散庶,它接收一個data loader蕉堰。我們?nèi)〕鏊械奈募σ粋€item list來說悲龟,如果它是一個image item list屋讶,.items里存的是文件名。這個data loader的dataset里是文件名⌒虢蹋現(xiàn)在皿渗,我們看看data loader里的每一個batch的數(shù)據(jù)斩芭,我們?nèi)〕鲆粋€Batch的預(yù)測,reconstruct=True代表它會為batch里的每一個東西創(chuàng)建fastai圖片對象乐疆。我們遍歷每個預(yù)測值划乖,保存它們。我們用和原始文件一樣的名字挤土,但是會把它放到新目錄里琴庵。

就是這樣。這樣保存預(yù)測結(jié)果仰美∶缘睿可以看到,我不僅用fastai里現(xiàn)成的東西咖杂,也給你們看怎樣寫自己的東西庆寺。通常,這不需要多少代碼诉字。如果你學(xué)習(xí)課程第二部分懦尝,里面很多地方就像這樣里的一樣,會教你怎樣用fastai庫里的東西壤圃,當(dāng)然陵霉,這里是怎樣寫庫里的代碼。越來越多地埃唯,我們會學(xué)寫自己的代碼。

好了鹰晨,保存了這些預(yù)測值墨叛。我們來在第一個文件上執(zhí)行 PIL.Image.open,它顯示在這里模蜡。這是我們生成的一個圖片樣例漠趁。


image.png

現(xiàn)在我按照常規(guī)訓(xùn)練critic。重啟Jupyter notebook來釋放內(nèi)存很麻煩忍疾。如果你知道是什么占用了大量的GPU闯传,你可以直接把它設(shè)成None,這是一個簡單的方法卤妒。


image.png

我們對這個learner做了這樣的處理甥绿,然后運(yùn)行g(shù)c.collect,這會讓Python回收在用的內(nèi)存则披。做完之后共缕,內(nèi)存就正常了。你可以使用所有的GPU內(nèi)存了士复。
如果你用nvidia-smi查看內(nèi)存图谷,你看不出它被釋放了翩活,因為PyTorch還占用著它們做緩存,但是這些內(nèi)存已經(jīng)可以用了便贵。這樣菠镇,你不用重啟notebook了。
image.png

我們要創(chuàng)建一個critic承璃。和以前一樣利耍,它只是一個普通文件夾中的image item list,這個classes是image_gen 和 images绸硕。我們要做一個隨機(jī)的分割得到一個驗證集堂竟,因為我們想知道critic在驗證集上表現(xiàn)如何。我們像之前一樣用label_from_folder玻佩,做一些tranform出嘹,data bunch,normalize咬崔。這樣我們得到了一個標(biāo)準(zhǔn)的分類器税稼。這是里面的一些圖片:


image

這是一個真的圖片、真的圖片垮斯、生成圖片郎仆、生成圖片等等,我們要區(qū)分出真?zhèn)巍?/p>

我們還是像以前一樣要使用binary cross entropy兜蠕。但是扰肌,這里我們不再使用ResNet。在課程第二部分熊杨,我們再詳細(xì)講原因曙旭。這里需要說的是當(dāng)你再次回顧這一點(diǎn)時,需要特別小心晶府,generator和cirtic不能都用相同的方向推進(jìn)桂躏,比如讓權(quán)重增長到失去控制。我們需要用一種叫spectral normalization的東西讓GAN正常運(yùn)行川陆,我們會在課程第二部分學(xué)習(xí)這個剂习。

不管怎樣,如果你用gan_critic较沪,fastai會給你一個適合GAN的二元分類器鳞绕。我懷疑我們可以在這里用一個ResNet,我們要創(chuàng)建一個帶spectral norm的預(yù)訓(xùn)練ResNet尸曼。


image.png

希望快點(diǎn)就能做到猾昆。我們會拭目以待。但是現(xiàn)在骡苞,最好的方法是用gan_critic楷扬。一個GAN critic在計算損失時,會用一種和取均值略有不同的方式烘苹,所以現(xiàn)在在做GAN時片部,你要用AdaptiveLoss封裝你的損失函數(shù)。還是一樣廊鸥,你會在課程第二部分看到細(xì)節(jié)。現(xiàn)在辖所,只要知道這是你要做的惰说,它很管用。

除了那個有點(diǎn)奇怪的損失函數(shù)缘回,和有點(diǎn)奇怪的架構(gòu)之外吆视,其它的東西都是一樣的。我們可以稱之為我們創(chuàng)建的判別器酥宴,因為我們用了略微不同的架構(gòu)和損失函數(shù)啦吧,metric也略有不同。這是和GAN版本準(zhǔn)確率等價的critics拙寡。然后我們可以訓(xùn)練它授滓,你可以看到它區(qū)分差的圖片和好圖片的準(zhǔn)確率是98%。也就是在辨認(rèn)殘次圖片和好圖片上的準(zhǔn)確率肆糕。但確實我們沒看到數(shù)字般堆,因為這是生成圖像, generator已經(jīng)知道怎樣去掉上面的數(shù)字擎宝。


image.png

完成 GAN [1:09:52]

讓我們來結(jié)束這個游戲吧郁妈。我們已經(jīng)預(yù)訓(xùn)練了生成器浑玛,現(xiàn)在需要開始乒乓乒乓...绍申,每個模型都訓(xùn)練一點(diǎn)。每個模型上訓(xùn)練分配的時間以及應(yīng)該使用的學(xué)習(xí)率顾彰,依然沒有清晰明確的取值辦法极阅,更多依賴于經(jīng)驗。我們創(chuàng)建了一個GANLearner涨享,

image.png

需要傳入你的generator和critic對象筋搏,我們在這里就直接加載了。
image.png
就是我們剛剛訓(xùn)練好的厕隧。
然后你運(yùn)行l(wèi)earn.fit時奔脐,會自動計算出訓(xùn)練生成網(wǎng)絡(luò)的時間以及何時切換去訓(xùn)練判別器峦朗。它會來回地切換波势。

image.png

關(guān)于這里的權(quán)重(weights_gen=(1.,50.))尺铣。我們不僅用critic做損失函數(shù)凛忿。如果我們只用critic做損失函數(shù)侄非,GAN會很擅長創(chuàng)建看起來真實的圖片,但它這些圖片與原始圖片毫無關(guān)系福澡。其實我們把像素?fù)p失和critic損失加到一起除秀,這兩個損失的尺度不同册踩,我們應(yīng)把像素?fù)p失乘上一個50到300的數(shù)暂吉,這樣一個范圍通常是有效的慕的。

另外,關(guān)于GAN的其他方面判导,GAN在訓(xùn)練中不應(yīng)使用學(xué)習(xí)率動量優(yōu)化算法』蓿基于動量的訓(xùn)練不太可行朦蕴。因為你不停在generator和critic間切換,很難用上動量訓(xùn)練赴恨∮杲龋可能有使用動量的方式额港,但沒見過有人這樣做過移斩。所以向瓷,當(dāng)你創(chuàng)建Adam優(yōu)化器時,這個動量的參數(shù)(betas=(0.,...))朱躺,你要設(shè)成0室琢。

所以只要你用了GAN就使用這些超參數(shù),應(yīng)該就行的通涯肩,這就是GANLearner的功能。


image.png

你可以執(zhí)行fit,它會訓(xùn)練一會兒贷腕。


image.png

image

GAN里一個難點(diǎn)是這些損失度沒有意義瞒斩。你不能期望隨著generator變好這些值會下降,因為隨著generator變好瀑梗,對critic來說谤职,任務(wù)越來越難柬帕,隨著critic變好陷寝,對generator來說越來越難凤跑。這些損失值會保持不變仔引。很難知道它們做得怎么樣咖耘,這是訓(xùn)練GAN時一個困難的地方儿倒。要知道它們做得怎么樣的唯一的方式是時不時地看看這些實際的結(jié)果彻犁。不過我沒有凰慈,如果你在這里運(yùn)行show_img=True森篷,
image.png

它會在每個epoch后打印出一個樣本豺型。我們沒有把它放到notebook里,這對repo來說太大了坎藐,但是你可以試試哼绑。我把結(jié)果放到了最后,就是這里蛀恩。

image.png

image

應(yīng)該說結(jié)果很漂亮。已經(jīng)知道怎樣去掉這些數(shù)字席揽,但現(xiàn)在我們已經(jīng)沒法知道這里原本是什么寸谜。
image.png

它確實很漂亮地銳化了把這只小貓熊痴。但也有問題果善,這里有一些奇怪的噪聲。確實比原來的糟糕的圖片好多了惜论。
image.png

要把左邊的圖變成高分辨率是一個困難的任務(wù)馆类。但有一些明顯的問題乾巧。像這里(第三行)沟于,這里應(yīng)該是眼球旷太,但它們沒有供璧。
image.png

為什么睡毒?因為我們的critic不知道眼球。即使它們知道钠至,它也不知道眼球非常重要棕洋。我們關(guān)心眼睛掰盘。當(dāng)我們看到一個沒有眼睛的貓愧捕,它一點(diǎn)也不可愛。但判別器不知道這是一個重要的特征邮偎。特別是因為判別器不是一個預(yù)訓(xùn)練的網(wǎng)絡(luò)禾进,所以我有點(diǎn)懷疑如果用預(yù)訓(xùn)練的網(wǎng)絡(luò)替代判別器艇拍,一個在imageNet上預(yù)訓(xùn)練的網(wǎng)絡(luò)卸夕,同時也兼容GAN快集,這樣的網(wǎng)絡(luò)效果可能會更好碍讨。不過這種做法顯然也會有缺點(diǎn)。課間休息后覆获,我會演示怎樣找到貓的眼球瓢省。

提問: 對什么樣的問題勤婚,你不使用U-Net馒胆? [1:14:48]

U-Net用于你的輸出的大小和輸入的大小接近的時睦尽,而且某種程度上一致時当凡,交叉連接是沒有意義的浪慌。如果那個程度的空間分辨率對于輸出,沒有必要佛掖。所以任何一種生成模型,比如圖像分割拴魄,就是一種生成模型匹中,它生成的圖片,是原本物體的遮罩(mask)豪诲。所以幾乎任何你想要的輸出的分辨率和保真度和輸入相當(dāng)顶捷,這種東西對于分類器沒有意義。在分類器里面屎篱,你只想要下采樣路徑服赎,因為最后你只想要一個數(shù)字,代表是貓還是狗或者其他寵物交播。

Wasserstein GAN [1:15:59]

在結(jié)束GAN之前重虑,講下這里有一個你們可能有興趣讀的notebook lesson7-wgan.ipynb。幾年前GAN剛出現(xiàn)時缺厉,人們一般用它憑空創(chuàng)建一些圖片关贵,我認(rèn)為這沒有什么用處。但是我想這是一個好的研究練習(xí)。所以我們實現(xiàn)了這個WGAN paper,它第一次做出了一些成果暂氯,也不難辣吃,你會看到如何用fastai庫實現(xiàn)它宵蕉,這很有趣缝左。因為我們使用的是LSUN_BEDROOMS數(shù)據(jù)集,我們放在了URL里浦徊。你尅看到很多臥室冕香,很多很多臥室。使用的方法务漩,就是Silva寫的方法妖混。我們在這個例子中使用的方法,只是想創(chuàng)造一個臥室兽间,所以我們實際上做的是帜羊,給生成器的輸入卖宠,不是處理過的圖片刺洒,而是隨機(jī)噪聲抹剩。生成器的任務(wù)是伺通,把隨機(jī)噪聲變成判別器無法區(qū)分輸出的圖片和真實的臥室侧但,我們沒有做任何預(yù)訓(xùn)練,或其他加速和簡化的東西,就是一個很傳統(tǒng)的方法挣磨。但可以看到,還是用了GANLearner荐操,實際上是WGAN版本持痰,一種老式的方法肺孵,只需要循規(guī)蹈矩輸入數(shù)據(jù)給生成器和判別器瑰艘,然后調(diào)用fit()紫新,就可以看到圖片顯示出來了聪铺。在第一個epoch后谜疤,以及兩三個輪次后,都沒有很好的臥室圖片成福∧刖郑可以看到,在早期闷叉,這種GAN做不出什么大不了的東西擦俐,但是最終訓(xùn)練了幾個小時后,出來了一些像臥室的圖片握侧。所以這是個你可以搗鼓的notebook,很有意思嘿期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末品擎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子备徐,更是在濱河造成了極大的恐慌萄传,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秀菱,居然都是意外死亡振诬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門衍菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赶么,“玉大人,你說我怎么就攤上這事脊串”枭耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵琼锋,是天一觀的道長放闺。 經(jīng)常有香客問我,道長缕坎,這世上最難降的妖魔是什么怖侦? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谜叹,結(jié)果婚禮上础钠,老公的妹妹穿的比我還像新娘。我一直安慰自己叉谜,他們只是感情好旗吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著停局,像睡著了一般很钓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上董栽,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天码倦,我揣著相機(jī)與錄音,去河邊找鬼锭碳。 笑死袁稽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的擒抛。 我是一名探鬼主播推汽,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歧沪!你這毒婦竟也來了歹撒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诊胞,失蹤者是張志新(化名)和其女友劉穎暖夭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迈着,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年竭望,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕菠。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咬清,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糕韧,到底是詐尸還是另有隱情枫振,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布萤彩,位于F島的核電站粪滤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雀扶。R本人自食惡果不足惜杖小,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愚墓。 院中可真熱鬧予权,春花似錦、人聲如沸浪册。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村象。三九已至笆环,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厚者,已是汗流浹背躁劣。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留库菲,地道東北人账忘。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像熙宇,于是被迫代替她去往敵國和親鳖擒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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