卷积神经网络

关于花书中卷积网络的笔记记录于https://www.jianshu.com/p/5a3c90ea0807

卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络是受生物学上感受野的机制而提出。感受野(Receptive Field)主要是指听觉、视觉等神经系统中一些神经元的特性,即神经元只接受其所支配的刺激区域内的信号

卷积神经网络最早是主要用来处理图像信息。如果用全连接前馈网络来处理图像时,会存在以下两个问题:

  • 参数太多:如果输入图像大小为100 × 100 × 3(即图像高度为100,宽度为100,3个颜色通道:RGB)。在全连接前馈网络中,第一个隐藏层的每个神经元到输入层都有100 × 100 × 3 = 30000个相互独立的连接,每个连接都对应一个权重参数。随着隐藏层神经元数量的增多,参数的规模也会急剧增加。这会导致整个神经网络的训练效率会非常低,也很容易出现过拟合

  • 局部不变性特征:自然图像中的物体都具有局部不变性特征,比如尺度缩放、平移、旋转等操作不影响其语义信息。而全连接前馈网络很难提取这些局部不变特征,一般需要进行数据增强来提高性能。

目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性:局部连接,权重共享以及汇聚。这些特性使卷积神经网络具有一定程度上的平移、缩放和旋转不变性。

1、卷积

卷积(Convolution)是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积。

一维卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发生器每个时刻t 产生一个信号x_t,其信息的衰减率为w_k,即在k − 1个时间步长后,信息为原来的w_k倍。假设w_1 = 1,w_2 = 1/2,w_3 = 1/4,那么在时刻t收到的信号y_t为当前时刻产生的信息和以前时刻延迟信息的叠加:

\begin{aligned} y_{t} &=1 \times x_{t}+1 / 2 \times x_{t-1}+1 / 4 \times x_{t-2} \\ &=w_{1} \times x_{t}+w_{2} \times x_{t-1}+w_{3} \times x_{t-2} \\ &=\sum_{k=1}^{3} w_{k} \cdot x_{t-k+1} \end{aligned}

我们把w_{1}, w_{2}, \cdots称为滤波器(Filter)或卷积核(Convolution Kernel)。假设滤波器长度为m,它和一个信号序列x_1, x_2, \cdots的卷积为:

y_{t}=\sum_{k=1}^{m} w_{k} \cdot x_{t-k+1}

信号序列x和滤波器w的卷积定义为:

\mathbf{y}=\mathbf{w} \otimes \mathbf{x}

一般情况下滤波器的长度m远小于信号序列长度n,下图给出一个一维卷积示例,滤波器为[−1, 0, 1]

二维卷积经常用在图像处理中。因为图像为一个两维结构,所以需要将一维卷积进行扩展。给定一个图像X \in \mathbb{R}^{M \times N}和滤波器W \in \mathbb{R}^{m \times n},其卷积为:

y_{i j}=\sum_{u=1}^{m} \sum_{v=1}^{n} w_{u v} \cdot x_{i-u+1, j-v+1}

下图给出一个二维卷积示例:

注意这里的卷积运算并不是在图像中框定卷积核大小的方框并将各像素值与卷积核各个元素相乘并加和,而是先把卷积核旋转180度,再做上述运算。

在图像处理中,卷积经常作为特征提取的有效方法。一幅图像在经过卷积操作后得到结果称为特征映射(Feature Map)

最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的过滤器可以用来提取边缘特征

1.1、互相关

在机器学习和图像处理领域,卷积的主要功能是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征。在计算卷积的过程中,需要进行卷积核翻转(即上文提到的旋转180度)。在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。

互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。给定一个图像X \in \mathbb{R}^{M \times N}和卷积核W \in \mathbb{R}^{m \times n},它们的互相关为:

y_{i j}=\sum_{u=1}^{m} \sum_{v=1}^{n} w_{u v} \cdot x_{i+u-1, j+v-1}

互相关和卷积的区别仅在于卷积核是否进行翻转。因此互相关也可以称为不翻转卷积。当卷积核是可学习的参数时,卷积和互相关是等价的。因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积。事实上,很多深度学习工具中卷积操作其实都是互相关操作。

1.2、卷积的变种

在卷积的标准定义基础上,还可以引入滤波器的滑动步长零填充来增加卷积多样性,更灵活地进行特征抽取。

滤波器的步长(Stride)是指滤波器在滑动时的时间间隔。

零填充(Zero Padding)是在输入向量两端进行补零。

假设卷积层的输入神经元个数为n,卷积大小为m,步长为s,神经元两端各填补p个零,那么该卷积层的神经元数量为(n −m + 2p)/s + 1

一般常用的卷积有以下三类:

  • 窄卷积:步长s = 1,两端不补零p = 0,卷积后输出长度为n − m + 1
  • 宽卷积:步长s = 1,两端补零p = m − 1,卷积后输出长度n + m − 1
  • 等宽卷积:步长s = 1,两端补零p = (m − 1)/2,卷积后输出长度n。上图(b)就是等宽卷积的一个例子。

1.3、卷积的数学性质

因为卷积网络的训练也是基于反向传播算法,因此我们重点关注卷积的导数性质:

假设Y=W\otimes X

X \in \mathbb{R}^{M \times N}W \in \mathbb{R}^{m \times n}Y \in \mathbb{R}^{(M-m+1) \times(N-n+1)}。函数f(Y) \in \mathbb{R}为一个标量函数。

则由y_{i j}= {\sum_{u, v} w_{u v} x_{i+u-1, j+v-1}}有:

\begin{aligned} \frac{\partial f(Y)}{\partial w_{u v}} &=\sum_{i=1}^{M-m+1} \sum_{j=1}^{N-n+1} \frac{\partial y_{i j}}{\partial w_{u v}} \frac{\partial f(Y)}{\partial y_{i j}} \\ &=\sum_{i=1}^{M-m+1} \sum_{j=1}^{N-n+1} x_{i+u-1, j+v-1} \frac{\partial f(Y)}{\partial y_{i j}} \\ &=\sum_{i=1}^{M-m+1} \sum_{j=1}^{N-n+1} \frac{\partial f(Y)}{\partial y_{i j}} x_{u+i-1, v+j-1}\\ \end{aligned}

可以看出,f(Y)关于W的偏导数为X\frac{\partial f(Y)}{\partial Y}的卷积

\frac{\partial f(Y)}{\partial W}=\frac{\partial f(Y)}{\partial Y} \otimes X

同理得到:

\begin{aligned} \frac{\partial f(Y)}{\partial x_{s t}} &=\sum_{i=1}^{M-m+1} \sum_{j=1}^{N-n+1} \frac{\partial y_{i j}}{\partial x_{s t}} \frac{\partial f(Y)}{\partial y_{i j}} \\ &=\sum_{i=1}^{M-m+1} \sum_{j=1}^{N-n+1} w_{s-i+1, t-j+1} \frac{\partial f(Y)}{\partial y_{i j}} \end{aligned}

(s-i+1)<1\ or\ >m(t-j+1)<1\ or\ >n时,w_{s-i+1, t-j+1}=0,即相当于对W进行p=(M-m, N-n)的零填充。从而f(Y)关于X的偏导数为W\frac{\partial f(Y)}{\partial Y}的宽卷积

用互相关的“卷积”表示,即为(注意宽卷积运算具有交换性性质):

\begin{aligned} \frac{\partial f(Y)}{\partial X} &=\operatorname{rot} 180\left(\frac{\partial f(Y)}{\partial Y}\right) \tilde{\otimes} W \\ &=\operatorname{rot} 180(W) \tilde{\otimes} \frac{\partial f(Y)}{\partial Y}\\ \end{aligned}

2、卷积神经网络

2.1、用卷积来代替全连接

在全连接前馈神经网络中,如果第l层有n^{(l)}个神经元,第l − 1层有n^{(l−1)}个神经元,连接边有n^{(l)} × n^{(l−1)}个,也就是权重矩阵有n^{(l)} × n^{(l−1)}个参数。当n^{(l)}n^{(l−1)}都很大时,权重矩阵的参数非常多,训练的效率会非常低。

如果采用卷积来代替全连接,第l层的净输入z^{(l)}为第l − 1层活性值a^{(l−1)}和滤波器\mathbf{w}^{(l)} \in \mathbb{R}^{m}的卷积,即:

\mathbf{z}^{(l)}=\mathbf{w}^{(l)} \otimes \mathbf{a}^{(l-1)}+b^{(l)}

根据卷积的定义,卷积层有两个很重要的性质:

  • 局部连接:在卷积层(假设是第l层)中的每个神经元都只和下一层(第l − 1层)中某个局部窗口内的神经元相连,构成一个局部连接网络。卷积层和下一层之间的连接数大大减少,由原来的n^{(l)} × n^{(l−1)}个连接变为n^{(l)} \times m个连接,m为滤波器大小。

  • 权重共享:作为参数的滤波器w^{(l)}对于第l层的所有的神经元都是相同的。例如上图(b)中所有的同颜色连接上的权重是相同的。

由于局部连接和权重共享,卷积层的参数只有一个m维的权重w^{(l)}和1维的偏置b^{(l)},共m + 1个参数。参数个数和神经元的数量无关。此外,第l层的神经元个数不是任意选择的,而是满足n^{(l)}=n^{(l-1)}-m+1

2.2、卷积层

卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。

特征映射(Feature Map)为一幅图像(或其它特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征。为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征。

在输入层,特征映射就是图像本身。如果是灰度图像,就是有一个特征映射,深度D = 1;如果是彩色图像,分别有RGB三个颜色通道的特征映射,深度D = 3

不失一般性,假设一个卷积层的结构如下:

  • 输入特征映射组\mathbf{X} \in \mathbb{R}^{M \times N \times D}为三维张量(tensor),其中每个切片(slice)矩阵X^{d} \in \mathbb{R}^{M \times N}为一个输入特征映射,1 \leq d \leq D

  • 输出特征映射组\mathbf{Y} \in \mathbb{R}^{M^{\prime} \times N^{\prime} \times P}为三维张量(tensor),其中每个切片(slice)矩阵Y^{p} \in \mathbb{R}^{M^{\prime} \times N^{\prime}}为一个输出特征映射,1 \leq p \leq P

  • 卷积核\mathbf{W} \in \mathbb{R}^{m \times n \times D \times P}为四维张量,其中每个切片矩阵W^{p, d} \in \mathbb{R}^{m \times n}为一个两维卷积核,1 \leq d \leq D, 1 \leq p \leq P

为了计算输出特征映射Y^p,用卷积核W^{p, 1}, W^{p, 2}, \cdots, W^{p, D}分别对输入特征映射X^{1}, X^{2}, \cdots, X^{D}进行卷积,然后将卷积结果相加,并加上一个标量偏置b得到卷积层的净输入Z^p再经过非线性激活函数后得到输出特征映射Y^p

\begin{aligned} Z^{p} &=\mathbf{W}^{p} \otimes \mathbf{X}+b^{p}=\sum_{d=1}^{D} W^{p, d} \otimes X^{d}+b^{p} \\ Y^{p} &=f\left(Z^{p}\right)\\ \end{aligned}

在输入为\mathbf{X} \in \mathbb{R}^{M \times N \times D},输出为\mathbf{Y} \in \mathbb{R}^{M^{\prime} \times N^{\prime} \times P}的卷积层中,每个输出特征映射都需要D个滤波器以及一个偏置。假设每个滤波器的大小为m × n,那么共需要P \times D \times(m \times n)+P个参数。

2.3、汇聚层

汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,并从而减少参数数量。

常用的汇聚函数有两种:

  • 最大汇聚(Maximum Pooling):一般是取一个区域内所有神经元的最大值。

Y_{m, n}^{d}=\max _{i \in R_{m, n}^{d}} x_{i}

其中x_i为区域R_k^d内每个神经元的激活值。

  • 平均汇聚(Mean Pooling):一般是取区域内所有神经元的平均值。

Y_{m, n}^{d}=\frac{1}{\left|R_{m, n}^{d}\right|} \sum_{i \in R_{m, n}^{d}} x_{i}

可以看出,汇聚层不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野。

典型的汇聚层是将每个特征映射划分为2 × 2大小的不重叠区域,然后使用最大汇聚的方式进行下采样。汇聚层也可以看做是一个特殊的卷积层,卷积核大小为m × m,步长为s × s,卷积核为max函数或mean函数。过大的采样区域会急剧减少神经元的数量,会造成过多的信息损失。

2.4、典型卷积网络结构

一个典型的卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成。

目前常用卷积网络结构如图所示,一个卷积块为连续M个卷积层和b个汇聚层(M通常设置为2 ∼ 5b01)。一个卷积网络中可以堆叠N个连续的卷积块,然后在后面接着K个全连接层(N的取值区间比较大,比如1 ∼ 100或者更大;K一般为0 ∼ 2)。

目前,整个网络结构趋向于使用更小的卷积核(比如1 × 13 × 3)以及更深的结构(比如层数大于50)。此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用变得也越来越小,因此目前比较流行的卷积网络中,汇聚层的比例也逐渐降低,趋向于全卷积网络

3、参数学习

在全连接前馈神经网络中,梯度主要通过每一层的误差项δ进行反向传播,并进一步计算每层参数的梯度。在卷积神经网络中,主要有两种不同功能的神经层:卷积层和汇聚层。而参数为卷积核以及偏置,因此只需要计算卷积层中参数的梯度。

不失一般性,第l层为卷积层,第l − 1层的输入特征映射为\mathbf{X}^{(l-1)} \in \mathbb{R}^{M \times N \times D},通过卷积计算得到第l层的特征映射净输入\mathbf{Z}^{(l)} \in \mathbb{R}^{M^{\prime} \times N^{\prime} \times P},第l层的第p个特征映射净输入

Z^{(l, p)}=\sum_{d=1}^{D} W^{(l, p, d)} \otimes X^{(l-1, d)}+b^{(l, p)}

\frac{\partial f(Y)}{\partial W}=\frac{\partial f(Y)}{\partial Y} \otimes X得:

\begin{aligned} \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial W^{(l, p, d)}} &=\frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial Z^{(l, p)}} \otimes X^{(l-1, d)} \\ &=\delta^{(l, p)} \otimes X^{(l-1, d)} \end{aligned}

同理可得,损失函数关于第l层的第p个偏置b^{(l, p)}的偏导数为:

\frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial b^{(l, p)}}=\sum_{i, j}\left[\delta^{(l, p)}\right]_{i, j}

在卷积网络中,每层参数的梯度依赖其所在层的误差项\delta^{(l, p)}

3.1、误差项计算

卷积层和汇聚层中,误差项的计算有所不同,因此我们分别计算其误差项。

3.1.1、汇聚层的误差项

l层的第p个特征映射的误差项δ^{(l,p)}的具体推导过程如下:

\begin{aligned} \delta^{(l, p)} & \triangleq \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial Z^{(l, p)}} \\ &=\frac{\partial X^{(l, p)}}{\partial Z^{(l, p)}} \cdot \frac{\partial Z^{(l+1, p)}}{\partial X^{(l, p)}} \cdot \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial Z^{(l+1, p)}} \\ &=f_{l}^{\prime}\left(Z^{(l, p)}\right) \odot \operatorname{up}\left(\delta^{(l+1, p)}\right)\\ \end{aligned}

其中f^′_l (·)为第l层使用的激活函数导数,up为上采样函数(upsampling),与汇聚层中使用的下采样操作刚好相反。如果下采样是最大汇聚(max pooling),误差项\delta^{(l+1, p)}中每个值会直接传递到上一层对应区域中的最大值所对应的神经元,该区域中其它神经元的误差项的都设为0。如果下采样是平均汇聚(meanpooling),误差项\delta^{(l+1, p)}中每个值会被平均分配到上一层对应区域中的所有神经元上。

3.1.2、卷积层的误差项

l层的第d个特征映射的误差项δ^{(l,d)}的具体推导过程如下:

\begin{aligned} \delta^{(l, d)} & \triangleq \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial Z^{(l, d)}} \\ &=\frac{\partial X^{(l, d)}}{\partial Z^{(l, d)}} \cdot \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial X^{(l, d)}} \\ &=f_{l}^{\prime}\left(Z^{(l)}\right) \odot \sum_{p=1}^{P}\left(\operatorname{rot} 180\left(W^{(l+1, p, d)}\right) \tilde{\otimes} \frac{\partial \mathcal{L}(Y, \hat{Y})}{\partial Z^{(l+1, p)}}\right) \\ &=f_{l}^{\prime}\left(Z^{(l)}\right) \odot \sum_{p=1}^{P}\left(\operatorname{rot} 180\left(W^{(l+1, p, d)}\right) \tilde{\otimes} \delta^{(l+1, p)}\right) \end{aligned}

其中\tilde{\otimes}为宽卷积。

4、几种典型的卷积神经网络

4.1、LeNet-5

LeNet-5虽然提出的时间比较早,但是是一个非常成功的神经网络模型。基于LeNet-5 的手写数字识别系统在90年代被美国很多银行使用,用来识别支票上面的手写数字。LeNet-5 的网络结构如图:

不计输入层,LeNet-5共有7层,每一层的结构为:

  • 输入层:输入图像大小为32 × 32 = 1024。

  • C1层是卷积层,使用6个5×5的滤波器,得到6组大小为28×28=784的特征映射。因此,C1层的神经元数量为6×784=4704,可训练参数数量为6×25+6=156,连接数为156×784=122304(包括偏置在内,下同)。

  • S2层为汇聚层,采样窗口为2×2,使用平均汇聚,加一个非线性函数。神经元个数为6×14×14=1176,可训练参数数量为6×(1+1)=12,连接数为6×196×(4+1)=5880。

  • C3层为卷积层。LeNet-5中用一个连接表来定义输入和输出特征映射之间的依赖关系,如下图所示。共使用60个5×5的滤波器,得到16组大小为10×10的特征映射(如果不使用连接表,则需要96个5×5的滤波器)。神经元数量为16×100=1600,可训练参数数量为(60×25)+16 =1516,连接数为100×1516=151600。

  • S4层是一个汇聚层,采样窗口为2×2,得到16个5×5大小的特征映射,可训练参数数量为16×2=32,连接数为16×25×(4+1)=2000。

  • C5层是一个卷积层,使用120×16=1920个5×5的滤波器,得到120组大小为1×1的特征映射。C5层的神经元数量为120,可训练参数数量为1920×25+120=48120,连接数为120×(16×25+1)=48120。

  • F6层是一个全连接层,有84个神经元,可训练参数数量为84×(120+1)=10164。连接数和可训练参数个数相同,为10164。

  • 输出层:输出层由10个欧氏径向基函数(Radial Basis Function,RBF)函数组成。这里不再详述。

4.2、AlexNet

AlexNet是第一个现代深度卷积网络模型,其首次使用了很多现代深度卷积网络的一些技术方法,比如采用了ReLU作为非线性激活函数,使用Dropout防止过拟合,使用数据增强来提高模型准确率等。AlexNet 赢得了2012 年ImageNet 图像分类竞赛的冠军。

AlexNet的结构如图,包括5个卷积层、3个全连接层和1个softmax层。因为网络规模超出了当时的单个GPU的内存限制,AlexNet 将网络拆为两半,分别放在两个GPU上,GPU间只在某些层(比如第3层)进行通讯。

AlexNet的具体结构如下:

  • 输入层,大小为224×224×3的图像。

  • 第一个卷积层,使用两个大小为11×11×3×48的卷积核,步长s=4,零填充p=3,得到两个大小为55×55×48的特征映射组。

  • 第一个汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个27×27×48的特征映射组。

  • 第二个卷积层,使用两个大小为5×5×48×128的卷积核,步长s=1,零填充p=2,得到两个大小为27×27×128的特征映射组。

  • 第二个汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个13×13×128的特征映射组。

  • 第三个卷积层为两个路径的融合,使用一个大小为3×3×256×384的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×192的特征映射组。

  • 第四个卷积层,使用两个大小为3×3×192×192的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×192的特征映射组。

  • 第五个卷积层,使用两个大小为3×3×192×128的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×128的特征映射组。

  • 汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个大小为6×6×128的特征映射组。

  • 三个全连接层,神经元数量分别为4096,4096 和1000。

4.3、Inception网络

在卷积网络中,如何设置卷积层的卷积核大小是一个十分关键的问题。在Inception网络中,一个卷积层包含多个不同大小的卷积操作,称为Inception模块。Inception网络是由有多个inception模块和少量的汇聚层堆叠而成

v1版本的Inception模块,采用了4组平行的特征抽取方式,分别为1×1、3× 3、5×5的卷积和3×3的最大汇聚。同时,为了提高计算效率,减少参数数量,Inception模块在进行3×3、5×5的卷积之前、3×3的最大汇聚之后,进行一次1×1的卷积来减少特征映射的深度。如果输入特征映射之间存在冗余信息,1×1的卷积相当于先进行一次特征抽取

Inception网络最早的v1版本就是非常著名的GoogLeNet,并赢得了2014年ImageNet图像分类竞赛的冠军。

4.4、残差网络

残差网络(Residual Network,ResNet)是通过给非线性的卷积层增加直连边的方式来提高信息的传播效率

假设在一个深度网络中,我们期望一个非线性单元f(x; θ)可以去逼近一个目标函数h(x)。如果将目标函数拆分成两部分:恒等函数x和残差函数h(x) − x

h(\mathrm{x})=\mathrm{x}+(h(\mathrm{x})-\mathrm{x})

根据通用近似定理,一个由神经网络构成的非线性单元有足够的能力来近似逼近原始目标函数或残差函数,但实际中后者更容易学习

下图给出了一个典型的残差单元示例。残差单元由多个级联的(等长)卷积层和一个跨层的直连边组成,再经过ReLU激活后得到输出。残差网络就是将很多个残差单元串联起来构成的一个非常深的网络。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容