【轉載】輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet、Xception

https://blog.csdn.net/u011995719/article/details/79100582


一 引言

二 輕量化模型

2.1 SqueezeNet

2.2 MobileNet

2.3 ShuffleNet

2.4 Xception

三 網絡對比

一 引言

自2012年AlexNet以來,卷積神經網絡(簡稱CNN)在圖像分類、圖像分割、目標檢測等領域獲得廣泛應用。隨著性能的要求越來越高,AlexNet已經無法滿足大家的需求,于是乎各路大牛紛紛提出性能更優越的CNN網絡,如VGG,GoogLeNet,ResNet,DenseNet等。由于神經網絡的性質,為了獲得更好的性能,網絡層數不斷增加,從7層AlexNet到16層VGG,再從16層VGG到GoogLeNet的22層,再從22層到152層ResNet,更有上千層的ResNet和DenseNet。雖然網絡性能得到了提高,但隨之而來的就是效率問題。

效率問題主要是模型的存儲問題和模型進行預測的速度問題(以下簡稱速度問題)

第一,存儲問題。數百層網絡有著大量的權值參數,保存大量權值參數對設備的內存要求很高;

第二,速度問題。在實際應用中,往往是毫秒級別,為了達到實際應用標準,要么提高處理器性能(看英特爾的提高速度就知道了,這點暫時不指望),要么就減少計算量。

只有解決CNN效率問題,才能讓CNN走出實驗室,更廣泛的應用于移動端。對于效率問題,通常的方法是進行模型壓縮(Model Compression),即在已經訓練好的模型上進行壓縮,使得網絡攜帶更少的網絡參數,從而解決內存問題,同時可以解決速度問題。

相比于在已經訓練好的模型上進行處理,輕量化模型模型設計則是另辟蹊徑。輕量化模型模型設計,主要思想在于設計更高效的“網絡計算方式”(主要針對卷積方式),從而使網絡參數減少的同時,不損失網絡性能。

本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet, MobileNet, ShuffleNet, Xception

(PS: 以上四種模型都不是模型壓縮方法!!)

以下是4個模型的作者團隊及發表時間

網絡 最早公開日期 發表情況 作者團隊 arXiv鏈接

SqueezeNet 2016.02 ICLR-2017 伯克利&斯坦福 https://arxiv.org/abs/1602.07360

MobileNet 2016.04 CVPR-2017 Google https://arxiv.org/abs/1704.04861

ShuffleNet 2016.06 N/A Face++ https://arxiv.org/abs/1707.01083

Xception 2016.10 CVPR-2017 Google https://arxiv.org/abs/1610.02357

其中ShuffleNet論文中引用了SqueezeNet、Xception、MobileNet;Xception 論文中引用了MobileNet

二 輕量化模型

由于這四種輕量化模型僅是在卷積方式上提出創新,因此本文僅對輕量化模型的創新點進行詳細描述,對模型實驗以及實現的細節感興趣的朋友,請到論文中詳細閱讀。

2.1 SqueezeNet

SqueezeNet由伯克利&斯坦福的研究人員合作發表于ICLR-2017,論文標題:

《SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE》

(http://blog.csdn.net/u011995719/article/details/78908755)

命名

從名字SqueezeNet就知道,本文的新意是squeeze,squeeze在SqueezeNet中表示一個squeeze層,該層采用1*1卷積核對上一層feature map進行卷積,主要目的是減少feature map的維數(維數即通道數,就是一個立方體的feature map,切成一片一片的,一共有幾片)。

創新點

1. 采用不同于傳統的卷積方式,提出fire module;fire module包含兩部分:squeeze層+expand層

創新點與inception系列的思想非常接近!首先squeeze層,就是1*1卷積,其卷積核數要少于上一層feature map數,這個操作從inception系列開始就有了,并美其名曰壓縮,個人覺得“壓縮”更為妥當。

Expand層分別用1*1 和3*3 卷積,然后concat,這個操作再inception系列里面也有。

—————————————-分割線———————————

SqueezeNet的核心在于Fire module,Fire module 由兩層構成,分別是squeeze層+expand層,如下圖1所示,squeeze層是一個1*1卷積核的卷積層,expand層是1*1 和3*3卷積核的卷積層,expand層中,把1*1 和3*3 得到的feature map 進行concat。

具體操作情況如下圖所示:

Fire module輸入的feature map為H*W*M的,輸出的feature map為H*M*(e1+e3),可以看到feature map的分辨率是不變的,變的僅是維數,也就是通道數,這一點和VGG的思想一致。

首先,H*W*M的feature map經過Squeeze層,得到S1個feature map,這里的S1均是小于M的,以達到“壓縮”的目的,詳細思想可參考Google的Inception系列。

其次,H*W*S1的特征圖輸入到Expand層,分別經過1*1卷積層和3*3卷積層進行卷積,再將結果進行concat,得到Fire module的輸出,為 H*M*(e1+e3)的feature map。

fire模塊有三個可調參數:S1,e1,e3,分別代表卷積核的個數,同時也表示對應輸出feature map的維數,在本文提出的SqueezeNet結構中,e1=e3=4s1 。

講完SqueezeNet的核心——Fire module,看看SqueezeNet的網絡結構,如下圖所示:

網絡結構設計思想,同樣與VGG的類似,堆疊的使用卷積操作,只不過這里堆疊的使用本文提出的Fire module(圖中用紅框部分)

看看Squezeenet的參數數量以及性能:

在這里可以看到,論文題目中提到的小于0.5M,是采用了Deep Compression進行模型壓縮之后的結果!!

看了上圖再回頭看一看論文題目:

SqueezeNet :AlexNet-level accuracy with 50x fewer parameters and <0.5MB

標!題!黨! SqueezeNet < 0.5MB, 這個是用了別的模型壓縮技術獲得的,很容易讓人誤以為SqueezeNet可以壓縮模型!!

SqueezeNet小結:

1 Fire module 與GoogLeNet思想類似,采用1*1卷積對feature map的維數進行“壓縮”,從而達到減少權值參數的目的;

2 采用與VGG類似的思想——堆疊的使用卷積,這里堆疊的使用Fire module

SqueezeNet與GoogLeNet和VGG的關系很大!

2.2 MobileNet

MobileNet 由Google團隊提出,發表于CVPR-2017,論文標題:

《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》(http://blog.csdn.net/u011995719/article/details/78850275)

命名

MobileNet的命名是從它的應用場景考慮的,顧名思義就是能夠在移動端使用的網絡模型。

創新點

1. 采用名為depth-wise separable convolution 的卷積方式代替傳統卷積方式,以達到減少網絡權值參數的目的。

通過采用depth-wise convolution的卷積方式,達到:1.減少參數數量 2.提升運算速度。(這兩點是要區別開的,參數少的不一定運算速度快!)

depth-wise convolution不是MobileNet提出來的,也是借鑒,文中給的參考文獻是 2014年的博士論文——《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》

depth-wise convolution 和 group convolution其實是一樣的,都是一個卷積核負責一部分feature map,每個feature map只被一個卷積核卷積。

———————————–分割線————————————-

MobileNets精華在于卷積方式——depth-wise separable convolution;采用depth-wise separable convolution,會涉及兩個超參:Width Multiplier和Resolution Multiplier這兩個超參只是方便于設置要網絡要設計為多小,方便于量化模型大小。

depth-wise convolution是將標準卷積分成兩步:第一步 Depthwise convolution,即逐通道的卷積,一個卷積核負責一個通道,一個通道只被一個卷積核“濾波”;

第二步,Pointwise convolution,將depthwise convolution得到的feature map再“串”起來 ,注意這個“串”是很重要的。“串”作何解?為什么還需要 pointwise convolution?作者說:However it only filters input channels, it does not combine them to create new features. Soan additional layer that computes a linear combination ofthe output of depthwise convolution via 1 × 1 convolutionis needed in order to generate these new features。

首先要承認一點:輸出的每一個feature map要包含輸入層所有feature map的信息。僅采用depthwise-convolution,是沒辦法做到這點,因此需要pointwise convolution的輔助。

“輸出的每一個feature map要包含輸入層所有feature map的信息” 這個是所有采用depth-wise convolution操作的網絡都要去解決的問題,ShuffleNet中的命名就和這個有關!詳細請看2.3

Standard convolution、depthwise convolution和pointwiseconvolution示意圖如下:

其中輸入的feature map有M個,輸出的feature map有N個。

Standard convolution呢,是采用N個大小為DK*DK的卷積核進行操作(注意卷積核大小是DK*DK, DK*DK*M是具體運算時候的大小!)

而depthwise convolution + pointwise convolution需要的卷積核呢?

Depthwise convolution :一個卷積核負責一個通道,一個通道只被一個卷積核卷積;則這里有M個DK*DK的卷積核;

Pointwise convolution:為了達到輸出N個feature map的操作,所以采用N個1*1的卷積核進行卷積,這里的卷積方式和傳統的卷積方式是一樣的,只不過采用了1*1的卷積核;其目的就是讓新的每一個feature map包含有上一層各個feature map的信息!在此理解為將depthwise convolution的輸出進行“串”起來。

————————————–分割線———————————-

下面舉例講解 Standard convolution、depthwise convolution和pointwise convolution 。

假設輸入的feature map 是兩個5*5的,即5*5*2;輸出feature map數量為3,大小是3*3(因為這里采用3*3卷積核)即3*3*3。

標準卷積,是將一個卷積核(3*3)復制M份(M=2), 是讓二維的卷積核(面包片)拓展到與輸入feature map一樣的面包塊形狀。例如,我們設置3個 3*3的卷積核,如下圖Kernel所示,但是在實際計算當中,卷積核并不是3*3*3這么多,而是3*3*2*3 ( w*h*c_in*c_out) 。也就是上面所說的把二維的卷積核拓展到與feature map一樣的面包塊形狀,如下圖的K1 擴展成 K11,K12 。

(注:不是復制M份,因為每個二維卷積核的參數是不一樣的,因此不是復制!感謝DSQ_17這位朋友指出錯誤。)

2018年3月15日補充:實際上,卷積核實際的尺寸應該是 w*h*c_in*c_out。往往,我們忽略掉c_in這個數,在設置卷積核數量時,也不會涉及到這個參數,但是在計算過程中是不能忽略的。

其中,w*h就是通常我們所說的卷積核大小,例如3*3,5*5,7*7等;c_out是平時我們講的卷積核個數,例如該卷積層設置了64個卷積核,則c_out = 64;而c_in則是等于上一層的feature map的數量。

Standard過程如下圖,X表示卷積,+表示對應像素點相加,可以看到對于O1來說,其與輸入的每一個feature map都“發生關系”,包含輸入的各個feature map的信息。

Depth-wise 過程如下圖,而Depthwise并沒有,可以看到depthwise convolution 得出的兩個feature map——fd1 和fd2分別只與i1和i2 “發生關系” ,這就導致違背上面所承認的觀點“輸出的每一個feature map要包含輸入層所有feature map的信息”,因而要引入pointwise convolution

那么計算量減少了多少呢?通過如下公式計算:

其中DK為標準卷積核大小,M是輸入feature map通道數,DF為輸入feature map大小,N是輸出feature map大小。本例中,DK=3,M=2,DF=5,N=3 , 參數的減少量主要就與卷積核大小DK有關。在本文MobileNet的卷積核采用DK=3,則大約減少了8~9倍計算量。

看看MobileNet的網絡結構,MobileNet共28層,可以發現這里下采樣的方式沒有采用池化層,而是利用depth-wise convolution的時候將步長設置為2,達到下采樣的目的。

1.0 MobileNet-224 與GoogLeNet及VGG-16的對比:

可以發現,相較于GoogLeNet,雖然參數差不多,都是一個量級的,但是在運算量上卻小于GoogLeNet一個量級,這就得益于 depth-wise convolution !

MobileNet小結:

1. 核心思想是采用depth-wise convolution操作,在相同的權值參數數量的情況下,相較于standard convolution操作,可以減少數倍的計算量,從而達到提升網絡運算速度的目的。

depth-wise convolution的思想非首創,借鑒于 2014年一篇博士論文:《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》

采用depth-wise convolution 會有一個問題,就是導致“信息流通不暢”,即輸出的feature map僅包含輸入的feature map的一部分,在這里,MobileNet采用了point-wise convolution解決這個問題。在后來,ShuffleNet采用同樣的思想對網絡進行改進,只不過把point-wise convolution換成了 channel shuffle,然后給網絡美其名曰 ShuffleNet~ 欲知后事如何,請看 2.3 ShuffleNet

2.3 ShuffleNet

ShuffleNet 是Face++團隊提出的,晚于MobileNet兩個月在arXiv上公開。論文標題:

《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 》

命名

一看名字ShuffleNet,就知道shuffle是本文的重點,那么shuffle是什么?為什么要進行shuffle?

shuffle具體來說是channel shuffle,是將各部分的feature map的channel進行有序的打亂,構成新的feature map,以解決group convolution帶來的“信息流通不暢”問題。(MobileNet是用point-wise convolution解決的這個問題)

因此可知道shuffle不是什么網絡都需要用的,是有一個前提,就是采用了group convolution,才有可能需要shuffle!! 為什么說是有可能呢?因為可以用point-wise convolution 來解決這個問題。

創新點

1. 利用group convolution 和 channel shuffle 這兩個操作來設計卷積神經網絡模型, 以減少模型使用的參數數量。

group convolutiosn非原創,而channel shuffle是原創。 channel shuffle因group convolution 而起,正如論文中3.1標題: . Channel Shuffle for Group Convolution;

采用group convolution 會導致信息流通不當,因此提出channel shuffle,所以channel shuffle是有前提的,使用的話要注意!

對比一下MobileNet,采用shuffle替換掉1*1卷積(注意!是1*1 Conv,也就是point-wise convolution;特別注意,point-wise convolution和 1*1 GConv是不同的),這樣可以減少權值參數,而且是減少大量權值參數 ,因為在MobileNet中,1*1卷積層有較多的卷積核,并且計算量巨大,MobileNet每層的參數量和運算量如下圖所示:

————————————–分割線———————————–

ShuffleNet的創新點在于利用了group convolution 和 channel shuffle,那么有必要看看group convolution 和channel shuffle

Group convolution

Group convolution 自Alexnet就有,當時因為硬件限制而采用分組卷積;之后在2016年的ResNeXt中,表明采用group convolution可獲得高效的網絡;再有Xception和MobileNet均采用depthwise convolution, 這些都是最近出來的一系列輕量化網絡模型。depth-wise convolution具體操作可見2.2 MobileNet里邊有簡介

如下圖(a)所示, 為了提升模型效率,采用group convolution,但會有一個副作用,即:“outputs from a certain channel are only derived from a small fraction of input channels.”

于是采用channel shuffle來改善各組間“信息流通不暢”問題,如下圖(b)所示。

具體方法為:把各組的channel平均分為g(下圖g=3)份,然后依次序的重新構成feature map

Channel shuffle 的操作非常簡單,接下來看看ShuffleNet,ShuffleNet借鑒了Resnet的思想,從基本的resnet 的bottleneck unit 逐步演變得到 ShuffleNet 的bottleneck unit,然后堆疊的使用ShuffleNet bottleneck unit獲得ShuffleNet;

下圖展示了ShuffleNet unit的演化過程

圖(a):是一個帶有depthwise convolution的bottleneck unit;

圖(b):作者在(a)的基礎上進行變化,對1*1 conv 換成 1*1 Gconv,并在第一個1*1 Gconv之后增加一個channel shuffle 操作;

圖(c): 在旁路增加了AVG pool,目的是為了減小feature map的分辨率;因為分辨率小了,于是乎最后不采用Add,而是concat,從而“彌補”了分辨率減小而帶來的信息損失。

文中提到兩次,對于小型網絡,多多使用通道,會比較好。

“this is critical for small networks, as tiny networks usually have an insufficient number of channels to process the information”

所以,以后若涉及小型網絡,可考慮如何提升通道使用效率

至于實驗比較,并沒有給出模型參數量的大小比較,而是采用了Complexity (MFLOPs)指標,在相同的Complexity (MFLOPs)下,比較ShuffleNet和各個網絡,還專門和MobileNet進行對比,由于ShuffleNet相較于MobileNet少了1*1 Conv(注意!少了1*1 Conv,也就是point-wise convolution),所以效率大大提高了嘛,貼個對比圖隨意感受一下好了

ShuffleNet小結:

1.與MobileNet一樣采用了depth-wise convolution,但是針對 depth-wise convolution帶來的副作用——“信息流通不暢”,ShuffleNet采用了一個channel shuffle 操作來解決。

在網絡拓撲方面,ShuffleNet采用的是resnet的思想,而mobielnet采用的是VGG的思想,2.1 SqueezeNet也是采用VGG的堆疊思想

2.4 Xception

Xception并不是真正意義上的輕量化模型,只是其借鑒depth-wise convolution,而depth-wise convolution又是上述幾個輕量化模型的關鍵點,所以在此一并介紹,其思想非常值得借鑒。

Xception是Google提出的,arXiv 的V1 于2016年10月公開。論文標題:

《Xception: Deep Learning with Depthwise Separable Convolutions 》

命名

Xception是基于Inception-V3的,而X表示Extreme,為什么是Extreme呢?因為Xception做了一個加強的假設,這個假設就是:

we make the following hypothesis: that the mapping of cross-channels correlations and spatial correlations in the feature maps of convolutional neural networks can be entirely decoupled

創新點

1. 借鑒(非采用)depth-wise convolution 改進Inception V3

既然是改進了Inception v3,那就得提一提關于inception的一下假設(思想)了。

“the fundamental hypothesis behind Inception is that cross-channel correlations and spatial correlations are sufficiently decoupled that it is preferable not to map them jointly”

簡單理解就是說,卷積的時候要將通道的卷積與空間的卷積進行分離,這樣會比較好。(沒有理論證明,只有實驗證明,就當它是定理,接受就好了,現在大多數神經網絡的論文都這樣。

———————————-分割線—————————————

既然是在Inception V3上進行改進的,那么Xception是如何一步一步的從Inception V3演變而來。

下圖1 是Inception module,圖2是作者簡化了的 inception module(就是只保留1*1的那條“路”,如果帶著avg pool,后面怎么進一步假設嘛~~~)

假設出一個簡化版inception module之后,再進一步假設,把第一部分的3個1*1卷積核統一起來,變成一個1*1的,后面的3個3*3的分別“負責”一部分通道,如圖3所示; 最后提出“extreme” version of an Inception ,module Xception登場,, 先用1*1卷積核對各通道之間(cross-channel)進行卷積,如圖4所示,

作者說了,這種卷積方式和depth-wise convolution 幾乎一樣。Depth-wise convolution 較早用于網絡設計是來自:Rigid-Motion Scatteringfor Image Classification,但是具體是哪一年提出,不得而知;至少2012年就有相關研究,再比如說AlexNet,由于內存原因,AlexNet分成兩組卷積 ;想深入了解Depth-wise convolution的可以查閱本論文2.Prior work,里面有詳細介紹。

Xception是借鑒Rigid-Motion Scatteringfor Image Classification 的Depth-wise convolution,是因為Xception與原版的Depth-wise convolution有兩個不同之處

第一個:原版Depth-wise convolution,先逐通道卷積,再1*1卷積; 而Xception是反過來,先1*1卷積,再逐通道卷積;

第二個:原版Depth-wise convolution的兩個卷積之間是不帶激活函數的,而Xception在經過1*1卷積之后會帶上一個Relu的非線性激活函數;

Xception 結構如上圖所示,共計36層分為Entry flow; Middle flow; Exit flow;

Entry flow 包含 8個conv;Middle flow 包含 3*8 =24個conv;Exit flow包含4個conv,所以Xception共計36層

文中Xception實驗部分是非常詳細的,實現細節可參見論文。

Xception小結:

Xception是基于Inception-V3,并結合了depth-wise convolution,這樣做的好處是提高網絡效率,以及在同等參數量的情況下,在大規模數據集上,效果要優于Inception-V3。這也提供了另外一種“輕量化”的思路:在硬件資源給定的情況下,盡可能的增加網絡效率和性能,也可以理解為充分利用硬件資源。

三 網絡對比

本文簡單介紹了四個輕量化網絡模型,分別是SqueezeNet、 MobileNet、 ShuffleNet和Xception,前三個是真正意義上的輕量化網絡,而Xception是為提升網絡效率,在同等參數數量條件下獲得更高的性能。

在此列出表格,對比四種網絡是如何達到網絡輕量化的。

網絡 實現輕量化技巧

SqueezeNet 1*1卷積核“壓縮”feature map數量

MobileNet Depth-wise convolution

ShuffleNet Depth-wise convolution

Xception 修改的Depth-wise convolution

這么一看就發現,輕量化主要得益于depth-wise convolution,因此大家可以考慮采用depth-wise convolution 來設計自己的輕量化網絡, 但是要注意“信息流通不暢問題”

解決“信息流通不暢”的問題,MobileNet采用了point-wise convolution,ShuffleNet采用的是channel shuffle。MobileNet相較于ShuffleNet使用了更多的卷積,計算量和參數量上是劣勢,但是增加了非線性層數,理論上特征更抽象,更高級了;ShuffleNet則省去point-wise convolution,采用channel shuffle,簡單明了,省去卷積步驟,減少了參數量。

學習了幾個輕量化網絡的設計思想,可以看到,并沒有突破性的進展,都是借鑒或直接使用前幾年的研究成果。希望廣大研究人員可以設計出更實在的輕量化網絡。

最后講一下讀后感,也可以認為是發(Shui)論文的idea:

1.繼續采用depth-wise convolution,主要設計一個方法解決“信息流通不暢”問題, 然后冠以美名XX-Net。(看看ShuffleNet就是)

2.針對depth-wise convolution作文章,卷積方式不是千奇百怪么?各種卷積方式可參考Github(https://github.com/vdumoulin/conv_arithmetic),挑一個或者幾個,結合起來,只要參數量少,實驗效果好,就可以發(Shui)論文。

3.接著第2,如果設計出來一個新的卷積方式,如果也存在一些“副作用”,再想一個方法解決這個副作用,再美其名曰XX-Net。就是自己“挖”個坑,自己再填上去。

以上純屬讀后感,寫得比較“隨意”,如果有什么地方描述有誤,請大家指出來,歡迎大家前來討論~

轉載請注明出處:

http://blog.csdn.net/u011995719/article/details/79100582

---------------------

作者:TensorSense

來源:CSDN

原文:https://blog.csdn.net/u011995719/article/details/79100582

版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

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

推薦閱讀更多精彩內容