ImageNet Classification with Deep Convolutional Neural Networks

Author:Alex Krizhevsky ; Ilya Sutskever ; Geoffrey E. Hinton

摘要

本文训练了一个大规模的深度卷积神经网络来将ImageNet LSVRC-2010比赛中的包含120万幅高分辨率的图像数据集分为1000种不同类别。在测试集上,本文所得的top-1和top-5错误率分别为37.5%和17.0%,该测试结果大大优于当前的最佳水平。本文的神经网络包含6千万个参数和65万个神经元,包含了5个卷积层,其中有几层后面跟着最大池化(max-pooling)层,以及3个全连接层,最后还有一个1000维的softmax层。为了加快训练速度,本文使用了不饱和神经元以及一种高效的基于GPU的卷积运算方法。为了减少全连接层的过拟合,本文采用了最新的正则化方法“dropout”,该方法被证明非常有效。我们以该模型的变体参加了ILSVRC-2012比赛,相比第二名26.2%,我们以15.3%的top-5测试错误率获胜。

1 引言

当前的目标识别方法基本上都使用了机器学习方法。为了提高目标识别方法的性能,我们可以收集更大的数据集,学习更强大的模型,使用更好的技术来防止过拟合。直到目前,带标签的图像的数据集都相对较小——都仅仅在成千上万的数量级上(例如,NORB[16],Caltech-101/256 [8, 9]和CIFAR-10/100 [12])。简单的识别任务在这样大小的数据集上可以被解决的相当好,特别是如果他们进行带标签的转换来增广数据集。例如,目前在MNIST数字识别任务上(<0.3%)的最好准确率已经接近了人类水平[4]。但现实情况的目标呈现出很大的变化,因此为了学习识别它们,有必要使用更大的训练数据集。实际上,人们也已广泛地认识到小图像数据集的缺点(例如,Pinto et al. [21]),但收集上百万图像的标注数据仅在最近才变得的可能。新的更大的数据集包括由数十万张全分割图像的LabelMe[23]和包含超过22000类的1500万张带标签高分辨率图像ImageNet[6]组成。

为了从数以百万计的图像中学习出数千种的目标,我们需要一个有很强学习能力的模型。然而,目标识别任务的巨大复杂性意味着,即使在ImageNet这样大的数据集也不能完成任务,因此我们的模型也要有许多先验知识来弥补所有我们没有的数据。卷积神经网络(CNNs)构成了一个这样的模型[16, 11, 13, 18, 15, 22, 26]。卷积神经网络的学习能力可以通过改变网络的广度和深度来控制,并且它们都能对图像的本质做出强大而又正确的判别(即统计的稳定性和像素位置的依赖性)。因此,与具有层次大小相似的标准前馈神经网络,CNNs有更少的连接和参数,因此它更容易训练,尽管在理论上cnn的最佳性能可能比标准前馈神经网络差一点。

尽管CNN具有引人注目的特性,尽管它们的局部架构相当有效,但大规模地应用于高分辨率图像消耗资源仍然过多。幸运的是,目前的GPU,搭配了高度优化的2维卷积计算,已经足够强大到帮助大规模CNN的训练,最新的数据集例如ImageNet包含足够的标注样本来训练不会严重的过拟合的模型。

本文具体的贡献如下:我们在ILSVRC-2010和ILSVRC-2012[2]的ImageNet子集上训练了到目前为止最大的卷积神经网络,并取得了迄今为止在这些数据集上报道过的最好结果。我们编写了高度优化的2维卷积的GPU计算以及卷积神经网络训练中所有其他运算,这些都已公开提供。我们的网络包含许多新的不寻常的特性,这些特性提高了神经网络的性能并减少了训练时间,详见第三节。即使使用了120万带标签的训练样本,网络的大小仍然使过拟合成为一个严重的问题,因此本文使用了许多有效的防止过拟合的技术,详见第四节。本文最终的网络包含5个卷积层和3个全连接层,深度似乎是非常重要的:我们发现移除任何一层卷积层(每个卷积层包含的参数不超过模型参数的1%)都会导致更差的性能。

最后,网络的大小主要受限于目前GPU的内存容量和我们愿意忍受的训练时间。本文的网络在两个GTX 580 3GB GPU上训练五六天。本文所有的实验表明,如果有更快的GPU、更大的数据集,结果可以更好。

2 数据集

ImageNet数据集包含有大概22000种类别共150多万带标签的高分辨率图像。这些图像是从网络上收集得来,由亚马逊的Mechanical Turkey的众包工具进行人工标记。从2010年开始,作为Pascal视觉目标挑战的一部分,ImageNet大规模视觉识别挑战(ImageNet Large-Scale Visual Recognition Challenge ,ILSVRC)比赛每年都会举行。ILSVRC采用ImageNet的子集,共包含一千个类别,每个类别包含大约1000幅图像。总的来说,大约有120万张训练图像,5万张验证图像以及15万张测试图像。

ILSVRC-2010是ILSVRC竞赛中唯一可以获得测试集标签公开的版本,因此本文大多数实验都是在这个版本上运行的。由于我们也使用我们的模型参加了ILSVRC-2012竞赛,因此在第六节我们也报告了模型在这个版本的数据集上的结果,该测试集标签不可获取。在ImageNet上通常使用两种错误率:top-1和top-5,top-5错误率是指测试图像的正确标签不在模型认为的最可能的前五个标签中的测试图像的百分数。

ImageNet包含各种不同分辨率的图像,而我们的系统要求固定的输入维度。因此,我们将图像进行下采样到固定的256×256分辨率。给定一个矩形图像,我们首先缩放图像短边长度为256,然后从结果图像中裁剪中心的256×256大小的图像块。除了将图像减去训练集的均值图像外,本文不对图像做任何其它的预处理。因此本文直接在每个像素的原始RGB值上进行训练。

3 架构

本文网络结构详见图2。它包含8层学习层——5层卷积层和三层全连接层。下面将描述该网络结构的一些创新和新的特征。3.1节至3.4节根据他们的重要性从大到小排序。

3.1 ReLU非线性

通常使用一个关于输入x的函数模拟神经元的输出f。这种标准函数是f(x) = tanh(x)或f(x) = (1 + e−x)−1。考虑到梯度下降的训练时间,这些饱和的非线性函数比不饱和的非线性函数f(x) = max(0,x)更慢。根据Nair和Hinton[20]的说法,本文将这种非线性特征神经元称为修正线性单元(ReLU)。采用ReLU的深度卷积神经网络训练时间比同样情况下使用tanh单元的速度要快几倍。在图1中,对于一个特定的四层卷积网络,在CIFAR-10数据集上达到25%的训练误差所需要的迭代次数可以证实这一点。这幅图表明,如果我们采用传统的饱和神经元模型,我们将不能在如此大的神经网络上实验该工作。

本文不是第一个考虑在CNNs中寻找传统神经模型替代方案的。例如,Jarrett等人[11]考虑使用非线性函数f(x) = |tanh(x)|,在数据集Caltech-101上,与基于局部平均池化的对比归一化结合取得了很好地效果。但是,在这个数据集上他们主要关心的就是防止过拟合,而本文用ReLUs主要是对训练集的拟合进行加速。快速学习对由大规模数据集上训练出大模型的性能有相当大的影响。

图1

图1:使用ReLU(实线)的四层卷积神经网络在CIFAR-10数据集上达到25%的训练误差比使用tanh神经元的等价网络(虚线)快六倍。为了使训练尽可能快,每个网络的学习率是单独选择的。没有采用任何类型的正则化。影响的大小随着网络结构的变化而变化,这一点已得到证实,但使用ReLU的网络都比等价的饱和神经元快几倍。

3.2 多GPU训练

单个GTX580 GPU只有3G内存,这限制了可以在GTX580上进行训练的网络最大规模。事实证明120万训练样本图像用来进行网络训练是足够的,但是这个任务对一个GPU来说太大了。因此我们将网络分布在两个GPU上。当前的GPU都能很方便地进行交叉GPU并行,因为它们可以直接相互读写内存,而不用经过主机内存。我们采用的并行模式本质上来说就是在每一个GPU上放二分之一的核(或者神经元),我们还使用了另一个技巧:只有某些层才能进行GPU之间的通信。这就意味着,例如第三层的输入为第二层的所有特征图。但是,第四层的输入仅仅是第三层在同一GPU上的特征图。在交叉验证时,连接模式的选择是一个问题,而这个也恰好允许我们精确地调整通信的数量,直到他占计算数量的一个合理比例。

最终的结构有点像Ciresan等[5]采用的柱状卷积神经网络,但是本文的列不是独立的(见图2)。与每个卷积层拥有本文一半的核,并且在一个GPU上训练的网络相比,这种组合让本文的top-1和top-5错误率分别下降了1.7%和1.2%。本文的2-GPU网络训练时间比一个GPU的时间都要略少。

3.3 局部响应归一化

ReLU具有让人满意的特性,它不需要通过输入归一化来防止饱和。只要一些训练样本产生一个正输入给一个ReLU,那么在那个神经元中学习就会开始。然而,我们仍然发现接下来的局部响应归一化有助于增加泛化性能。这里,对同一个空间位置的n个邻接核特征图(kernel maps)求和,N是该层的核的总数目。核特征图的顺序显然是任意的,并且在训练之前就已决定了的。这种响应归一化实现了侧抑制的一种形式,侧抑制受启发于一种在真实神经中发现的形式,对利用不同核计算得到的神经输出之间的大的活跃度生成竞争。常量k,n,α,β是超参数,它们的值通过验证集确定;我们设k=2,n=5,α=0.0001,β=0.75。我们在特定的层使用的ReLU非线性之后应用了这种归一化(请看3.5小节)。


局部响应归一化公式

这个方案与Jarrett等人[11]的局部对比度归一化方案有一定的相似性,但我们更恰当的称其为“亮度归一化”,因为本文没有减去均值。响应归一化将top-1和top-5的错误率分别降低了1.4%和1.2%。我们也在CIFAR-10数据集上验证了这个方案的有效性:一个四层的CNN网络在未归一化的情况下错误率是13%,在归一化的情况下是11%。

3.4 重叠池化

CNN中的池化层归纳了同一核特征上相邻组神经元的输出。习惯上,相邻池化单元归纳的区域是不重叠的(例如[17, 11, 4])。更确切的说,池化层可看作由池化单元网格组成,网格间距为s个像素,每个网格归纳池化单元中心位置z×z大小的邻居。如果设置s=z,我们会得到通常在CNN中采用的传统局部池化。如果设置s<z,我们会得到重叠池化。这就是我们网络中使用的方法,设置s=2,z=3。这个方案分别降低了top-1 0.4%,top-5 0.3%的错误率,与非重叠方案s=2,z=2相比,输出的维度是相等的。我们在训练过程中通常观察采用重叠池化的模型,发现它更难过拟合。

3.5 整体结构

现在我们准备描述我们的CNN的整体架构。如图2所示,我们的网络包含8个带权重的层;前5层是卷积层,剩下的3层是全连接层。最后一层全连接层的输出传递给一个1000维softmax层,softmax会产生1000类标签的分布。我们的网络最大化多项逻辑回归的目标,这等价于最大化预测分布下训练样本正确标签的对数概率的均值。

第2,4,5卷积层的核只与位于同一GPU上的前一层的核映射相连接(看图2)。第3卷积层的核与第2层的所有核映射相连。全连接层的神经元与前一层的所有神经元相连。第1,2卷积层之后是响应归一化层。3.4节描述的这种最大池化层在响应归一化层和第5卷积层之后。ReLU非线性应用在每个卷积层和全连接层的输出上。

第一层卷积层使用96个大小为11x11x3的卷积核对224x224x3的输入图像以4个像素为步长(这是核特征图中相邻神经元感受域中心之间的距离)进行滤波。第二层卷积层将第一层卷积层的输出(经过响应归一化和池化)作为输入,并使用256个大小为5x5x48的核对它进行滤波。第三层、第四层和第五层的卷积层在没有任何池化或者归一化层介于其中的情况下相互连接。第三层卷积层有384个大小为3x3x256的核与第二层卷积层的输出(已归一化和池化)相连。第四层卷积层有384个大小为3x3x192的核,第五层卷积层有256个大小为 的核。每个全连接层有4096个神经元。

图2

图2 本文CNN的结构图示,明确地描述了两个GPU之间的职责。一个GPU运行图上方的层,另一个运行图下方的层。两个GPU只在特定的层通信。网络的输入是150,528维的,网络剩余层中的神经元数目分别是253440,186624,64896,64896,43264,4096,4096,1000

4 减少过拟合

本文的神经网络结构有6千万个参数。尽管ILSVRC的1000个类别使得每一个训练样本利用10bit的数据就可以将图像映射到标签上,但是如果没有大量的过拟合,是不足以学习这么多参数的。接下来,本文描述了两种对抗过拟合的主要的方法。

4.1 数据增强

图像数据上最简单常用的用来减少过拟合的方法是使用标签保留变换(例如[25, 4, 5])来人工增大数据集。我们使用了两种独特的数据增强方式,这两种方式都可以从原始图像通过非常少的计算量产生变换的图像,因此变换图像不需要存储在硬盘上。在我们的实现中,变换图像通过CPU的Python代码生成,而此时GPU正在训练前一批图像。因此,实际上这些数据增强方案是计算免费的。

第一种数据增强方式包括生成图像变换和水平翻转。我们从256×256图像上通过随机提取224 × 224的图像块实现了这种方式,然后在这些提取的图像块上进行训练。这个让我们的训练集增大了2048倍((256-224)2*2=2048),尽管产生的这些训练样本显然是高度相互依赖的。如果不使用这个方法,本文的网络会有大量的过拟合,这将会迫使我们使用更小的网络。在测试时,网络通过提取5个224x224块(四个边角块和一个中心块)以及它们的水平翻转(因此共十个块)做预测,然后网络的softmax层对这十个块做出的预测取均值。

第二种数据增强方式包括改变训练图像的RGB通道的强度。特别地,我们在整个ImageNet训练集上对RGB像素值集合执行PCA。对每一幅训练图像,本文加上多倍的主成分,倍数的值为相应的特征值乘以一个均值为0标准差为0.1的高斯函数产生的随机变量。因此对每一个RGB图像像素Ix,y=[IRx,y , IGx,y , IBx,y]T加上如下的量,
[p1,p2,p3][α1λ12λ23λ3]T
pi,λi分别是RGB像素值3 × 3协方差矩阵的第i个特征向量和特征值,αiαi是前面提到的随机变量。对于某个训练图像的所有像素,每个αi只获取一次,直到图像进行下一次训练时才重新获取。这个方案近似抓住了自然图像的一个重要特性,即光照的颜色和强度发生变化时,目标特性是不变的。这个方案降低了top 1错误率1%

4.2 失活(Dropout)

结合多种不同模型的预测结果是一种可以降低测试误差的非常成功的方法[1,3],但是这对于已经要花很多天来训练的大规模神经网络来说显得太耗费时间了。但是,有一种非常有效的模型结合的方法,训练时间只需要原先的两倍。最新研究的技术,叫做“dropout”[10],它将每一个隐藏神经元的输出以50%的概率设为0。这些以这种方式被“踢出”的神经元不会参加前向传递,也不会加入反向传播。因此每次有输入时,神经网络采样一个不同的结构,但是所有这些结构都共享权值。这个技术降低了神经元之间复杂的联合适应性,因为一个神经元不是依赖于另一个特定的神经元的存在的。因此迫使要学到在连接其他神经元的多个不同随机子集的时候更鲁棒性的特征。在测试时,本文使用所有的神经元,但对其输出都乘以了0.5,对采用多指数dropout网络生成的预测分布的几何平均数来说这是一个合理的近似。

本文在图2中的前两个全连接层使用dropout。如果不采用dropout,本文的网络将会出现大量的过拟合。Dropout大致地使达到收敛的迭代次数增加了一倍。

5 学习细节

我们使用随机梯度下降来训练我们的模型,样本的batch size为128,动量为0.9,权重衰减为0.0005。我们发现少量的权重衰减对于模型的学习是重要的。换句话说,权重衰减不仅仅是一个正则项:它减少了模型的训练误差。权重w的更新规则是
image.png

i是迭代索引,v是动量变量,ε是学习率,
image.png

是在点ωi,目标对ω求得的导数的第i个batch:Di的均值。

本文对每一层的权值使用均值为0、标准差为0.01的高斯分布进行初始化。对第二层、第四层、第五层卷积层以及全连接的隐藏层使用常数1初始化神经元偏置项。这个初始化通过给ReLUs提供正输入加快了学习的初始阶段。本文对剩余的层使用常数0初始化神经元偏置项。

本文对所有层使用相同的学习速率,这个由在整个学习过程中手动地调整得到。我们采用启发式算法:当验证错误率停止降低就将当前学习速率除以10。本文的学习速率初始值设为0.01,在终止之前减小了三次。本文训练该网络对120万的图像训练集大约进行了90个周期,使用了两个NVIDIA GTX 580 3GB GPU,花费了5到6天的时间。

图3

图3 第一层卷积层对224x224x3的输入图像使用96个大小为11x11x3的卷积核学习得到的特征图。上面的48个卷积核在GPU1上学习,下面的48个卷积核在GPU2上学习。详见6.1节

6 结果

我们在ILSVRC-2010上的结果概括为表1。我们的神经网络取得了top-1 37.5%,top-5 17.0%的错误率。在ILSVRC-2010竞赛中最佳结果是top-1 47.1%,top-5 28.2%,采用的方法是对六个基于不同特征训练得到的稀疏编码模型的预测结果求平均数[2],此后最好的结果是45.7%和25.7%,采用的方法是对基于从两种密集采样特征计算得到的Fisher向量(FVs),训练得到两个分类器,所得的预测结果求平均数[24]。


表1

表1:ILSVRC-2010测试集上的结果对比。斜体是其它方法取得的最好结果。

我们也用我们的模型参加了ILSVRC-2012竞赛并在表2中报告了我们的结果。由于ILSVRC-2012的测试集标签不是公开的,我们不能报告我们尝试的所有模型的测试错误率。在本段的其余部分,我们会使用验证误差率和测试误差率互换,因为在我们的实验中它们的差别不会超过0.1%(看图2)。本文中描述的CNN取得了top-5 18.2%的错误率。五个类似的CNN预测的平均误差率为16.4%。我们在最后的池化层之后增加一个额外的第6个卷积层,使用整个ImageNet Fall 2011的数据(15M图像,22000种类别)作为分类数据预训练得到的一个CNN,再经过微调,用ILSVRC-2012对该CNN进行测试得到的错误率为16.6%。对上述的五个在整个Fall 2011数据集上预训练过的CNN,得到的预测求平均得到的错误率结果为15.3%。当时第二的队伍得到的错误率为26.2%,使用的方法是对基于从多种密集采样特征计算得到的FVs,训练得到多个分类器的预测值求平均[7]。


表2

表2:ILSVRC-2012验证集和测试集的误差对比。斜线部分是其它人取得的最好的结果。带星号的是“预训练的”对ImageNet 2011秋季数据集进行分类的模型。更多细节请看第六节。

最后,我们也报告了我们在ImageNet 2009秋季数据集上的误差率,ImageNet 2009秋季数据集有10,184个类,890万张图像。在这个数据集上我们按照惯例用一半的图像来训练,一半的图像来测试。由于没有确定的测试集,我们的分割必然与前面作者使用的不一样,但是这并不会明显地影响结果。我们在该数据集上得到top-1和top-5错误率分别为67.4%和40.9%,这个结果是由在上述网络的最后一个池化层加了第六层卷积层所得到的。之前在这个数据集上最好的结果是78.1%和60.9%[19]。

6.1 定性评估

图3显示了网络的两个数据连接层学习到的卷积核。网络学习到了大量的频率核、方向选择核,也学到了各种颜色点。注意两个GPU表现出的专业化,3.5小节中描述的限制连接的结果。GPU1上的核主要是没有颜色的,而GPU2上的核主要是针对颜色的。这种特殊化在每次运行时都会发生,并且独立于任何特定随机权值初始化(模除GPU的重编号)。在图4的左边部分,我们通过在8张测试图像上计算它的top-5预测定性地评估了网络学习到的东西。注意即使是不在图像中心的目标也能被网络识别,例如左上角的小虫。大多数top-5标签都显得很合理。例如,只有别的种类的猫被似是而非贴上豹子的标签。在一些情况下(窗格、樱桃)会存在对照片的意图的判断的含糊不清。


图4

图4:(左)8张ILSVRC-2010测试图像和我们的模型认为最可能的5个标签。每张图像的下面是它的正确标签,正确标签的概率用红条表示(如果正确标签在top 5中)。(右)第一列是5张ILSVRC-2010测试图像。剩下的列展示了6张训练图像,这些图像在最后的隐藏层的特征向量与测试图像的特征向量有最小的欧氏距离。

另一种探讨网络的视觉知识的方法就是考虑最终图像在最后4096维隐藏层产生的特征激活度。如果两幅图像生成的特征激活向量之间有较小的欧式距离,我们可以认为神经网络的更高层特征认为它们是相似的。图4显示了根据这种测度下的五幅测试集图像和六幅跟他们最相似的训练集图像。注意在像素水平,第二列中检索到的训练图像一般地不会和第一列的查询图像相近。例如,检索到的狗和大象以多种姿势出现。我们在补充材料中展示更多测试图像的结果。

使用欧氏距离计算4096维、实值向量之间的相似度效率较低,但是可以通过训练一个自动编码器来将这些向量压缩为短的二进制编码而提高效率。 这个相比将自动编码器直接应用到原始像素上,是一个更加好的图像检索方法[14],前者没有利用图像的标签,因此会倾向于检索到有相似边界模式的图像,而不论他们语义上是否相似。

7 探讨

我们的结果表明一个大型深度卷积神经网络在一个具有高度挑战性的数据集上仅使用有监督学习可以取得破纪录的结果。值得注意的是,如果移除一个卷积层,我们的网络性能会降低。例如,移除任何中间层都会引起网络损失大约2%的top-1性能。因此深度对于实现我们的结果非常重要。

为了简化本文的实验,我们没有使用任何无监督的预训练,尽管我们认为它会有所帮助,尤其是我们可以在标签数据没有发生相应增长的情况下,获得足够的计算资源来增大我们网络的大小,能够有足够的计算能力去显著地增加网络的大小。到目前为止,由于我们使用更大的网络网络、训练了更长时间,本文的结果已经有所提高,但我们仍然有很多需求来进行时空下人类视觉系统的研究。最后我们想在视频序列上使用非常大规模的深度卷积网络,视频序列的时序结构会提供许多有帮助的信息,而这些信息在静态图像上是丢失了或者不那么明显。

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

推荐阅读更多精彩内容