AlexNet(pytorch實(shí)現(xiàn))

二、AlexNet

在這里插入圖片描述
在imagenet上的圖像分類challenge上大神Alex提出的alexnet網(wǎng)絡(luò)結(jié)構(gòu)模型贏得了2012屆的冠軍遥昧,振奮人心,利用CNN實(shí)現(xiàn)了圖片分類,別人用傳統(tǒng)的機(jī)器學(xué)習(xí)算法調(diào)參跳到半死也就那樣鸥诽,Alex利用CNN精度遠(yuǎn)超傳統(tǒng)的網(wǎng)絡(luò)。
在這里插入圖片描述

1. conv1階段DFD(data flow diagram):
在這里插入圖片描述

在這里插入圖片描述
第一層輸入數(shù)據(jù)為原始的2272273的圖像箕憾,這個(gè)圖像被11113的卷積核進(jìn)行卷積運(yùn)算牡借,卷積核對(duì)原始圖像的每次卷積都生成一個(gè)新的像素。卷積核沿原始圖像的x軸方向和y軸方向兩個(gè)方向移動(dòng)袭异,移動(dòng)的步長(zhǎng)是4個(gè)像素钠龙。因此,卷積核在移動(dòng)的過(guò)程中會(huì)生成(227-11)/4+1=55個(gè)像素(227個(gè)像素減去11御铃,正好是54碴里,即生成54個(gè)像素,再加上被減去的11也對(duì)應(yīng)生成一個(gè)像素)上真,行和列的5555個(gè)像素形成對(duì)原始圖像卷積之后的像素層咬腋。共有96個(gè)卷積核,會(huì)生成555596個(gè)卷積后的像素層睡互。96個(gè)卷積核分成2組根竿,每組48個(gè)卷積核陵像。對(duì)應(yīng)生成2組555548的卷積后的像素層數(shù)據(jù)。這些像素層經(jīng)過(guò)relu1單元的處理寇壳,生成激活像素層醒颖,尺寸仍為2組5555*48的像素層數(shù)據(jù)。

這些像素層經(jīng)過(guò)pool運(yùn)算(池化運(yùn)算)的處理九巡,池化運(yùn)算的尺度為33图贸,運(yùn)算的步長(zhǎng)為2,則池化后圖像的尺寸為(55-3)/2+1=27冕广。 即池化后像素的規(guī)模為272796疏日;然后經(jīng)過(guò)歸一化處理,歸一化運(yùn)算的尺度為55撒汉;第一卷積層運(yùn)算結(jié)束后形成的像素層的規(guī)模為272796沟优。分別對(duì)應(yīng)96個(gè)卷積核所運(yùn)算形成。這96層像素層分為2組睬辐,每組48個(gè)像素層挠阁,每組在一個(gè)獨(dú)立的GPU上進(jìn)行運(yùn)算。

反向傳播時(shí)溯饵,每個(gè)卷積核對(duì)應(yīng)一個(gè)偏差值侵俗。即第一層的96個(gè)卷積核對(duì)應(yīng)上層輸入的96個(gè)偏差值。

2. conv2階段DFD(data flow diagram):

在這里插入圖片描述

在這里插入圖片描述
第二層輸入數(shù)據(jù)為第一層輸出的272796的像素層丰刊,為便于后續(xù)處理隘谣,每幅像素層的左右兩邊和上下兩邊都要填充2個(gè)像素;27x27x96的像素?cái)?shù)據(jù)分成27x27x48的兩組像素?cái)?shù)據(jù)啄巧,兩組數(shù)據(jù)分別再兩個(gè)不同的GPU中進(jìn)行運(yùn)算寻歧。每組像素?cái)?shù)據(jù)被5x5x48的卷積核進(jìn)行卷積運(yùn)算,卷積核對(duì)每組數(shù)據(jù)的每次卷積都生成一個(gè)新的像素秩仆。卷積核沿原始圖像的x軸方向和y軸方向兩個(gè)方向移動(dòng)码泛,移動(dòng)的步長(zhǎng)是1個(gè)像素。因此澄耍,卷積核在移動(dòng)的過(guò)程中會(huì)生成(27-5+2x2)/1+1=27個(gè)像素噪珊。(27個(gè)像素減去5,正好是22齐莲,在加上上下痢站、左右各填充的2個(gè)像素,即生成26個(gè)像素铅搓,再加上被減去的5也對(duì)應(yīng)生成一個(gè)像素)瑟押,行和列的27x27個(gè)像素形成對(duì)原始圖像卷積之后的像素層。共有256個(gè)5x5x48卷積核星掰;這256個(gè)卷積核分成兩組多望,每組針對(duì)一個(gè)GPU中的27x27x48的像素進(jìn)行卷積運(yùn)算嫩舟。會(huì)生成兩組27x27x128個(gè)卷積后的像素層。這些像素層經(jīng)過(guò)relu2單元的處理怀偷,生成激活像素層家厌,尺寸仍為兩組27x27x128的像素層。

這些像素層經(jīng)過(guò)pool運(yùn)算(池化運(yùn)算)的處理椎工,池化運(yùn)算的尺度為3x3饭于,運(yùn)算的步長(zhǎng)為2,則池化后圖像的尺寸為(57-3)/2+1=13维蒙。 即池化后像素的規(guī)模為2組13x13x128的像素層掰吕;然后經(jīng)過(guò)歸一化處理,歸一化運(yùn)算的尺度為5*5颅痊;第二卷積層運(yùn)算結(jié)束后形成的像素層的規(guī)模為2組13x13x128的像素層殖熟。分別對(duì)應(yīng)2組128個(gè)卷積核所運(yùn)算形成。每組在一個(gè)GPU上進(jìn)行運(yùn)算斑响。即共256個(gè)卷積核菱属,共2個(gè)GPU進(jìn)行運(yùn)算。

反向傳播時(shí)舰罚,每個(gè)卷積核對(duì)應(yīng)一個(gè)偏差值纽门。即第一層的96個(gè)卷積核對(duì)應(yīng)上層輸入的256個(gè)偏差值。

3. conv3階段DFD(data flow diagram):

在這里插入圖片描述

在這里插入圖片描述
第三層輸入數(shù)據(jù)為第二層輸出的2組1313128的像素層营罢;為便于后續(xù)處理赏陵,每幅像素層的左右兩邊和上下兩邊都要填充1個(gè)像素;2組像素層數(shù)據(jù)都被送至2個(gè)不同的GPU中進(jìn)行運(yùn)算愤钾。每個(gè)GPU中都有192個(gè)卷積核瘟滨,每個(gè)卷積核的尺寸是33256候醒。因此能颁,每個(gè)GPU中的卷積核都能對(duì)2組1313128的像素層的所有數(shù)據(jù)進(jìn)行卷積運(yùn)算。卷積核對(duì)每組數(shù)據(jù)的每次卷積都生成一個(gè)新的像素倒淫。卷積核沿像素層數(shù)據(jù)的x軸方向和y軸方向兩個(gè)方向移動(dòng)伙菊,移動(dòng)的步長(zhǎng)是1個(gè)像素。因此敌土,運(yùn)算后的卷積核的尺寸為(13-3+12)/1+1=13(13個(gè)像素減去3镜硕,正好是10,在加上上下返干、左右各填充的1個(gè)像素兴枯,即生成12個(gè)像素,再加上被減去的3也對(duì)應(yīng)生成一個(gè)像素)矩欠,每個(gè)GPU中共1313192個(gè)卷積核财剖。2個(gè)GPU中共1313384個(gè)卷積后的像素層悠夯。這些像素層經(jīng)過(guò)relu3單元的處理,生成激活像素層躺坟,尺寸仍為2組1313192像素層沦补,共1313*384個(gè)像素層。

4. conv4階段DFD(data flow diagram):

在這里插入圖片描述
在這里插入圖片描述
第四層輸入數(shù)據(jù)為第三層輸出的2組1313192的像素層咪橙;為便于后續(xù)處理夕膀,每幅像素層的左右兩邊和上下兩邊都要填充1個(gè)像素;2組像素層數(shù)據(jù)都被送至2個(gè)不同的GPU中進(jìn)行運(yùn)算美侦。每個(gè)GPU中都有192個(gè)卷積核产舞,每個(gè)卷積核的尺寸是33192。因此菠剩,每個(gè)GPU中的卷積核能對(duì)1組1313192的像素層的數(shù)據(jù)進(jìn)行卷積運(yùn)算庞瘸。卷積核對(duì)每組數(shù)據(jù)的每次卷積都生成一個(gè)新的像素。卷積核沿像素層數(shù)據(jù)的x軸方向和y軸方向兩個(gè)方向移動(dòng)赠叼,移動(dòng)的步長(zhǎng)是1個(gè)像素擦囊。因此,運(yùn)算后的卷積核的尺寸為(13-3+12)/1+1=13(13個(gè)像素減去3嘴办,正好是10瞬场,在加上上下、左右各填充的1個(gè)像素涧郊,即生成12個(gè)像素贯被,再加上被減去的3也對(duì)應(yīng)生成一個(gè)像素),每個(gè)GPU中共1313192個(gè)卷積核妆艘。2個(gè)GPU中共1313384個(gè)卷積后的像素層彤灶。這些像素層經(jīng)過(guò)relu4單元的處理,生成激活像素層批旺,尺寸仍為2組1313192像素層幌陕,共1313*384個(gè)像素層。

5. conv5階段DFD(data flow diagram):

在這里插入圖片描述

在這里插入圖片描述
第五層輸入數(shù)據(jù)為第四層輸出的2組1313192的像素層汽煮;為便于后續(xù)處理搏熄,每幅像素層的左右兩邊和上下兩邊都要填充1個(gè)像素;2組像素層數(shù)據(jù)都被送至2個(gè)不同的GPU中進(jìn)行運(yùn)算暇赤。每個(gè)GPU中都有128個(gè)卷積核心例,每個(gè)卷積核的尺寸是33192。因此鞋囊,每個(gè)GPU中的卷積核能對(duì)1組1313192的像素層的數(shù)據(jù)進(jìn)行卷積運(yùn)算止后。卷積核對(duì)每組數(shù)據(jù)的每次卷積都生成一個(gè)新的像素。卷積核沿像素層數(shù)據(jù)的x軸方向和y軸方向兩個(gè)方向移動(dòng)溜腐,移動(dòng)的步長(zhǎng)是1個(gè)像素译株。因此微饥,運(yùn)算后的卷積核的尺寸為(13-3+12)/1+1=13(13個(gè)像素減去3,正好是10古戴,在加上上下欠橘、左右各填充的1個(gè)像素窜管,即生成12個(gè)像素租谈,再加上被減去的3也對(duì)應(yīng)生成一個(gè)像素),每個(gè)GPU中共1313128個(gè)卷積核申钩。2個(gè)GPU中共1313256個(gè)卷積后的像素層叉袍。這些像素層經(jīng)過(guò)relu5單元的處理始锚,生成激活像素層,尺寸仍為2組1313128像素層喳逛,共1313*256個(gè)像素層瞧捌。

2組1313128像素層分別在2個(gè)不同GPU中進(jìn)行池化(pool)運(yùn)算處理。池化運(yùn)算的尺度為33润文,運(yùn)算的步長(zhǎng)為2姐呐,則池化后圖像的尺寸為(13-3)/2+1=6。 即池化后像素的規(guī)模為兩組66128的像素層數(shù)據(jù)典蝌,共66*256規(guī)模的像素層數(shù)據(jù)曙砂。

6. fc6階段DFD(data flow diagram):

在這里插入圖片描述

在這里插入圖片描述
第六層輸入數(shù)據(jù)的尺寸是66256,采用66256尺寸的濾波器對(duì)第六層的輸入數(shù)據(jù)進(jìn)行卷積運(yùn)算骏掀;每個(gè)66256尺寸的濾波器對(duì)第六層的輸入數(shù)據(jù)進(jìn)行卷積運(yùn)算生成一個(gè)運(yùn)算結(jié)果鸠澈,通過(guò)一個(gè)神經(jīng)元輸出這個(gè)運(yùn)算結(jié)果;共有4096個(gè)66256尺寸的濾波器對(duì)輸入數(shù)據(jù)進(jìn)行卷積運(yùn)算截驮,通過(guò)4096個(gè)神經(jīng)元輸出運(yùn)算結(jié)果笑陈;這4096個(gè)運(yùn)算結(jié)果通過(guò)relu激活函數(shù)生成4096個(gè)值;并通過(guò)drop運(yùn)算后輸出4096個(gè)本層的輸出結(jié)果值葵袭。

由于第六層的運(yùn)算過(guò)程中涵妥,采用的濾波器的尺寸(66256)與待處理的feature map的尺寸(66256)相同,即濾波器中的每個(gè)系數(shù)只與feature map中的一個(gè)像素值相乘眶熬;而其它卷積層中妹笆,每個(gè)濾波器的系數(shù)都會(huì)與多個(gè)feature map中像素值相乘块请;因此娜氏,將第六層稱為全連接層。

第五層輸出的66256規(guī)模的像素層數(shù)據(jù)與第六層的4096個(gè)神經(jīng)元進(jìn)行全連接墩新,然后經(jīng)由relu6進(jìn)行處理后生成4096個(gè)數(shù)據(jù)贸弥,再經(jīng)過(guò)dropout6處理后輸出4096個(gè)數(shù)據(jù)。

7. fc7階段DFD(data flow diagram):

在這里插入圖片描述

第六層輸出的4096個(gè)數(shù)據(jù)與第七層的4096個(gè)神經(jīng)元進(jìn)行全連接海渊,然后經(jīng)由relu7進(jìn)行處理后生成4096個(gè)數(shù)據(jù)绵疲,再經(jīng)過(guò)dropout7處理后輸出4096個(gè)數(shù)據(jù)哲鸳。

8. fc8階段DFD(data flow diagram):

在這里插入圖片描述
第七層輸出的4096個(gè)數(shù)據(jù)與第八層的1000個(gè)神經(jīng)元進(jìn)行全連接,經(jīng)過(guò)訓(xùn)練后輸出被訓(xùn)練的數(shù)值盔憨。

Alexnet網(wǎng)絡(luò)中各個(gè)層發(fā)揮的作用如下表所述:


在這里插入圖片描述

實(shí)現(xiàn)代碼

#model.py

import torch.nn as nn
import torch


class AlexNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):   
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(  #打包
            nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),  # input[3, 224, 224]  output[48, 55, 55] 自動(dòng)舍去小數(shù)點(diǎn)后
            nn.ReLU(inplace=True), #inplace 可以載入更大模型
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[48, 27, 27] kernel_num為原論文一半
            nn.Conv2d(48, 128, kernel_size=5, padding=2),           # output[128, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[128, 13, 13]
            nn.Conv2d(128, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 128, kernel_size=3, padding=1),          # output[128, 13, 13]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[128, 6, 6]
        )
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            #全鏈接
            nn.Linear(128 * 6 * 6, 2048),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(2048, 2048),
            nn.ReLU(inplace=True),
            nn.Linear(2048, num_classes),
        )
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1) #展平   或者view()
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') #何教授方法
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)  #正態(tài)分布賦值
                nn.init.constant_(m.bias, 0)

下載數(shù)據(jù)集

DATA_URL = 'http://download.tensorflow.org/example_images/flower_photos.tgz'

下載完后執(zhí)行下面腳本徙菠,將數(shù)據(jù)集進(jìn)行分類

#spile_data.py

import os
from shutil import copy
import random


def mkfile(file):
    if not os.path.exists(file):
        os.makedirs(file)


file = 'flower_data/flower_photos'
flower_class = [cla for cla in os.listdir(file) if ".txt" not in cla]
mkfile('flower_data/train')
for cla in flower_class:
    mkfile('flower_data/train/'+cla)

mkfile('flower_data/val')
for cla in flower_class:
    mkfile('flower_data/val/'+cla)

split_rate = 0.1
for cla in flower_class:
    cla_path = file + '/' + cla + '/'
    images = os.listdir(cla_path)
    num = len(images)
    eval_index = random.sample(images, k=int(num*split_rate))
    for index, image in enumerate(images):
        if image in eval_index:
            image_path = cla_path + image
            new_path = 'flower_data/val/' + cla
            copy(image_path, new_path)
        else:
            image_path = cla_path + image
            new_path = 'flower_data/train/' + cla
            copy(image_path, new_path)
        print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing bar
    print()

print("processing done!")

之后應(yīng)該是這樣:


在這里插入圖片描述
train.py

import torch
import torch.nn as nn
from torchvision import transforms, datasets, utils
import matplotlib.pyplot as plt
import numpy as np
import torch.optim as optim
from model import AlexNet
import os
import json
import time


#device : GPU or CPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)


#數(shù)據(jù)轉(zhuǎn)換
data_transform = {
    "train": transforms.Compose([transforms.RandomResizedCrop(224),
                                 transforms.RandomHorizontalFlip(),
                                 transforms.ToTensor(),
                                 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),
    "val": transforms.Compose([transforms.Resize((224, 224)),  # cannot 224, must (224, 224)
                               transforms.ToTensor(),
                               transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}

#data_root = os.path.abspath(os.path.join(os.getcwd(), "../.."))  # get data root path
data_root = os.getcwd()
image_path = data_root + "/flower_data/"  # flower data set path
train_dataset = datasets.ImageFolder(root=image_path + "/train",
                                     transform=data_transform["train"])
train_num = len(train_dataset)

# {'daisy':0, 'dandelion':1, 'roses':2, 'sunflower':3, 'tulips':4}
flower_list = train_dataset.class_to_idx
cla_dict = dict((val, key) for key, val in flower_list.items())
# write dict into json file
json_str = json.dumps(cla_dict, indent=4)
with open('class_indices.json', 'w') as json_file:
    json_file.write(json_str)

batch_size = 32
train_loader = torch.utils.data.DataLoader(train_dataset,
                                           batch_size=batch_size, shuffle=True,
                                           num_workers=0)

validate_dataset = datasets.ImageFolder(root=image_path + "/val",
                                        transform=data_transform["val"])
val_num = len(validate_dataset)
validate_loader = torch.utils.data.DataLoader(validate_dataset,
                                              batch_size=batch_size, shuffle=True,
                                              num_workers=0)

test_data_iter = iter(validate_loader)
test_image, test_label = test_data_iter.next()
#print(test_image[0].size(),type(test_image[0]))
#print(test_label[0],test_label[0].item(),type(test_label[0]))


#顯示圖像,之前需把validate_loader中batch_size改為4
# def imshow(img):
#     img = img / 2 + 0.5  # unnormalize
#     npimg = img.numpy()
#     plt.imshow(np.transpose(npimg, (1, 2, 0)))
#     plt.show()
#
# print(' '.join('%5s' % cla_dict[test_label[j].item()] for j in range(4)))
# imshow(utils.make_grid(test_image))


net = AlexNet(num_classes=5, init_weights=True)

net.to(device)
#損失函數(shù):這里用交叉熵
loss_function = nn.CrossEntropyLoss()
#優(yōu)化器 這里用Adam
optimizer = optim.Adam(net.parameters(), lr=0.0002)
#訓(xùn)練參數(shù)保存路徑
save_path = './AlexNet.pth'
#訓(xùn)練過(guò)程中最高準(zhǔn)確率
best_acc = 0.0

#開始進(jìn)行訓(xùn)練和測(cè)試郁岩,訓(xùn)練一輪婿奔,測(cè)試一輪
for epoch in range(10):
    # train
    net.train()    #訓(xùn)練過(guò)程中,使用之前定義網(wǎng)絡(luò)中的dropout
    running_loss = 0.0
    t1 = time.perf_counter()
    for step, data in enumerate(train_loader, start=0):
        images, labels = data
        optimizer.zero_grad()
        outputs = net(images.to(device))
        loss = loss_function(outputs, labels.to(device))
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        # print train process
        rate = (step + 1) / len(train_loader)
        a = "*" * int(rate * 50)
        b = "." * int((1 - rate) * 50)
        print("\rtrain loss: {:^3.0f}%[{}->{}]{:.3f}".format(int(rate * 100), a, b, loss), end="")
    print()
    print(time.perf_counter()-t1)

    # validate
    net.eval()    #測(cè)試過(guò)程中不需要dropout问慎,使用所有的神經(jīng)元
    acc = 0.0  # accumulate accurate number / epoch
    with torch.no_grad():
        for val_data in validate_loader:
            val_images, val_labels = val_data
            outputs = net(val_images.to(device))
            predict_y = torch.max(outputs, dim=1)[1]
            acc += (predict_y == val_labels.to(device)).sum().item()
        val_accurate = acc / val_num
        if val_accurate > best_acc:
            best_acc = val_accurate
            torch.save(net.state_dict(), save_path)
        print('[epoch %d] train_loss: %.3f  test_accuracy: %.3f' %
              (epoch + 1, running_loss / step, val_accurate))

print('Finished Training')

在這里插入圖片描述

最后進(jìn)行預(yù)測(cè)

predict.py

import torch
from model import AlexNet
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
import json

data_transform = transforms.Compose(
    [transforms.Resize((224, 224)),
     transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# load image
img = Image.open("./sunflower.jpg")  #驗(yàn)證太陽(yáng)花
#img = Image.open("./roses.jpg")     #驗(yàn)證玫瑰花
plt.imshow(img)
# [N, C, H, W]
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)

# read class_indict
try:
    json_file = open('./class_indices.json', 'r')
    class_indict = json.load(json_file)
except Exception as e:
    print(e)
    exit(-1)

# create model
model = AlexNet(num_classes=5)
# load model weights
model_weight_path = "./AlexNet.pth"
model.load_state_dict(torch.load(model_weight_path))
model.eval()
with torch.no_grad():
    # predict class
    output = torch.squeeze(model(img))
    predict = torch.softmax(output, dim=0)
    predict_cla = torch.argmax(predict).numpy()
print(class_indict[str(predict_cla)], predict[predict_cla].item())
plt.show()

在這里插入圖片描述

參考自
d5224

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萍摊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子如叼,更是在濱河造成了極大的恐慌冰木,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笼恰,死亡現(xiàn)場(chǎng)離奇詭異踊沸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)社证,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門雕沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人猴仑,你說(shuō)我怎么就攤上這事审轮。” “怎么了辽俗?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵疾渣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我崖飘,道長(zhǎng)榴捡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任朱浴,我火速辦了婚禮吊圾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翰蠢。我一直安慰自己项乒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布梁沧。 她就那樣靜靜地躺著檀何,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上频鉴,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天栓辜,我揣著相機(jī)與錄音,去河邊找鬼垛孔。 笑死藕甩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的周荐。 我是一名探鬼主播辛萍,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羡藐!你這毒婦竟也來(lái)了贩毕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仆嗦,失蹤者是張志新(化名)和其女友劉穎辉阶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘩扼,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谆甜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了集绰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规辱。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栽燕,靈堂內(nèi)的尸體忽然破棺而出罕袋,到底是詐尸還是另有隱情,我是刑警寧澤碍岔,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布浴讯,位于F島的核電站,受9級(jí)特大地震影響蔼啦,放射性物質(zhì)發(fā)生泄漏榆纽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一捏肢、第九天 我趴在偏房一處隱蔽的房頂上張望奈籽。 院中可真熱鬧,春花似錦鸵赫、人聲如沸衣屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勾拉。三九已至煮甥,卻和暖如春盗温,著一層夾襖步出監(jiān)牢的瞬間藕赞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工卖局, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斧蜕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓砚偶,卻偏偏與公主長(zhǎng)得像批销,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子染坯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355