Lecture 2 圖像分類

注意:課程需要使用大量Python編程并使用Numpy 完成矩陣運(yùn)算技羔,所以學(xué)習(xí)本lecture的同時(shí)需要學(xué)習(xí)Python 和Numpy仔涩。使用教程:點(diǎn)擊這里

本課重點(diǎn):

  • 數(shù)據(jù)驅(qū)動(dòng)方法

  • K-最近鄰算法

  • 線性分類I——評(píng)分函數(shù)

0 引言

圖像分類是計(jì)算機(jī)視覺(jué)的核心任務(wù)耳高,計(jì)算機(jī)視覺(jué)領(lǐng)域中很多問(wèn)題(比如目標(biāo)檢測(cè)和分割)届搁,都可以被歸結(jié)為圖像分類問(wèn)題蚂子。圖像分類問(wèn)題萌庆,就是已有固定的分類標(biāo)簽集合燥透,然后對(duì)于輸入的圖像沙咏,從分類標(biāo)簽集合中找出一個(gè)分類標(biāo)簽辨图,最后把分類標(biāo)簽分配給該輸入圖像。

挑戰(zhàn)

計(jì)算機(jī)看到的圖像是一個(gè)像素矩陣肢藐,而人類給出的標(biāo)簽只是一個(gè)單詞故河,所以對(duì)計(jì)算機(jī)而言存在巨大的語(yǔ)義鴻溝。比如給計(jì)算機(jī)輸入下圖一張貓的圖片吆豹,計(jì)算機(jī)圖像分類模型會(huì)讀取該圖片鱼的,并計(jì)算該圖片屬于集合 {貓, 狗, 帽子, 杯子}中各個(gè)標(biāo)簽的概率。然而計(jì)算機(jī)讀取的圖像數(shù)據(jù)是一個(gè)由數(shù)字組成的巨大的3維數(shù)組痘煤。在下圖中凑阶,貓的圖像大小是寬248像素,高400像素速勇,有3個(gè)顏色通道晌砾,分別是紅、綠和藍(lán)(簡(jiǎn)稱RGB)烦磁。所以养匈,該圖像就包含了248X400X3=297600個(gè)數(shù)字,每個(gè)數(shù)字都是在范圍0-255之間的整型都伪,其中0表示全黑呕乎,255表示全白。我們的任務(wù)就是把這些數(shù)字變成一個(gè)簡(jiǎn)單的標(biāo)簽陨晶,比如“貓”猬仁。

圖1 計(jì)算機(jī)“眼”中的圖像

圖像分類算法要足夠健壯(魯棒,robust)先誉,要至少能夠適應(yīng)下述變化及組合:

  • 視角變化(Viewpoint variation):同一個(gè)物體湿刽,攝像機(jī)可以從多個(gè)角度來(lái)展現(xiàn)。
  • 大小變化(Scale variation):物體可視的大小通常是會(huì)變化的(不僅是在圖片中褐耳,在真實(shí)世界中大小也是變化的)诈闺。
  • 形變(Deformation):很多東西的形狀并非一成不變,會(huì)有很大變化铃芦。
  • 遮擋(Occlusion):目標(biāo)物體可能被擋住雅镊。有時(shí)候只有物體的一小部分(可以小到幾個(gè)像素)是可見(jiàn)的。
  • 光照條件(Illumination conditions):在像素層面上刃滓,光照的影響非常大仁烹。
  • 背景干擾(Background clutter):物體可能混入背景之中,使之難以被辨認(rèn)咧虎。
  • 類內(nèi)差異(Intra-class variation):一類物體的個(gè)體之間的外形差異很大卓缰,比如椅子。這一類物體有許多不同的對(duì)象,每個(gè)都有自己的外形征唬。

1 數(shù)據(jù)驅(qū)動(dòng)方法

如果采用硬編碼的方法編寫一個(gè)識(shí)別貓的算法震叮,可以輸入貓的圖片輸出標(biāo)簽“貓”,可以先獲取貓圖像的邊緣得到一些線條鳍鸵,然后定義規(guī)則比如三條線交叉是耳朵之類。然而這種方式的識(shí)別效果不好尉间,并且不能識(shí)別新的物體偿乖。

所以可以采用數(shù)據(jù)驅(qū)動(dòng)算法。即不具體寫出識(shí)別每個(gè)物體對(duì)應(yīng)的規(guī)則哲嘲,而是對(duì)每一類物體標(biāo)簽給計(jì)算機(jī)大量的圖片贪薪,采用機(jī)器學(xué)習(xí)的方法,計(jì)算機(jī)會(huì)收集所有的數(shù)據(jù)眠副,用某種方式總結(jié)画切,然后會(huì)生成一個(gè)分類器模型,總結(jié)出區(qū)分不同類物體的核心知識(shí)要素囱怕,然后用訓(xùn)練好的模型霍弹,識(shí)別新的圖像。過(guò)程如下:

  • 輸入:輸入是包含N個(gè)圖像的集合娃弓,每個(gè)圖像的標(biāo)簽是K種分類標(biāo)簽中的一種典格。這個(gè)集合稱為訓(xùn)練集。
  • 學(xué)習(xí):這一步的任務(wù)是使用訓(xùn)練集來(lái)學(xué)習(xí)每個(gè)類到底長(zhǎng)什么樣台丛。一般該步驟叫做訓(xùn)練分類器或者學(xué)習(xí)一個(gè)模型耍缴。
  • 評(píng)價(jià):讓分類器來(lái)預(yù)測(cè)它未曾見(jiàn)過(guò)的圖像的分類標(biāo)簽,把分類器預(yù)測(cè)的標(biāo)簽和圖像真正的分類標(biāo)簽 (基本事實(shí)) 對(duì)比挽霉,并以此來(lái)評(píng)價(jià)分類器的質(zhì)量防嗡。

最鄰近算法(Nearest Neighbor )

第一個(gè)分類器算法。訓(xùn)練過(guò)程只是簡(jiǎn)單的記住圖像數(shù)據(jù)和標(biāo)簽侠坎,預(yù)測(cè)的時(shí)候和訓(xùn)練數(shù)據(jù)中圖片比較找出最接近的輸出標(biāo)簽蚁趁。這個(gè)分類器和卷積神經(jīng)網(wǎng)絡(luò)沒(méi)有任何關(guān)系,實(shí)際中也極少使用硅蹦,但通過(guò)實(shí)現(xiàn)它荣德,可以對(duì)解決圖像分類問(wèn)題的方法有個(gè)基本認(rèn)識(shí)。

圖像分類數(shù)據(jù)集:CIFAR-10一個(gè)非常流行的圖像分類數(shù)據(jù)集童芹。這個(gè)數(shù)據(jù)集包含10種分類標(biāo)簽涮瞻,60000張32X32的小圖像,每張圖片含有一個(gè)標(biāo)簽假褪。這60000張圖像被分為包含50000張(每種分類5000張)圖像的訓(xùn)練集和包含10000張圖像的測(cè)試集署咽。假設(shè)現(xiàn)在我們用這50000張圖片作為訓(xùn)練集,將余下的10000作為測(cè)試集并打上標(biāo)簽,Nearest Neighbor算法將會(huì)拿著測(cè)試圖片和訓(xùn)練集中每一張圖片去比較宁否,然后將它認(rèn)為最相似的那個(gè)訓(xùn)練集圖片的標(biāo)簽賦給這張測(cè)試圖片窒升。結(jié)果如下圖所示,效果并不是特別好慕匠。

圖3 左邊:CIFAR-10數(shù)據(jù)庫(kù)的樣本圖像饱须;右邊:第一列是測(cè)試圖像,后面是使用Nearest Neighbor算法台谊,根據(jù)像素差異蓉媳,從訓(xùn)練集中選出的10張最類似的圖片

那么具體如何比較兩張圖片呢?

L1距離(曼哈頓距離)

在本例中锅铅,就是比較32x32x3的像素塊酪呻。最簡(jiǎn)單的方法就是逐個(gè)像素比較,最后將差異值全部加起來(lái)盐须。即將兩張圖片先轉(zhuǎn)化為兩個(gè)向量I_{1}I_{2}玩荠,然后計(jì)算他們的L1距離:

d_{1} (I_{1} ,I_{2} )=\sum_{p}\vert I_{1}^p -I_{2}^p \vert,其中p為像素點(diǎn)贼邓,I^p表示第p個(gè)像素點(diǎn)的值阶冈。

兩張圖片使用L1距離來(lái)進(jìn)行比較,即逐個(gè)像素求差值立帖,然后將所有差值加起來(lái)得到一個(gè)數(shù)值眼溶。如果兩張圖片一模一樣,那么L1距離為0晓勇,但是如果兩張圖片很是不同堂飞,那L1值將會(huì)非常大。下圖是僅一個(gè)RGB通道的4X4圖片計(jì)算L1距離绑咱。

圖4 4X4圖片L1距離計(jì)算
下面看具體編程如何實(shí)現(xiàn):
首先绰筛,我們將CIFAR-10的數(shù)據(jù)加載到內(nèi)存中,并分成4個(gè)數(shù)組:訓(xùn)練數(shù)據(jù)和標(biāo)簽描融,測(cè)試數(shù)據(jù)和標(biāo)簽铝噩。在下面的代碼中,Xtr(大小是50000x32x32x3)存有訓(xùn)練集中所有的圖像窿克,Xte(大小是10000x3072)存有測(cè)試集中所有的圖像骏庸,Ytr 是對(duì)應(yīng)的長(zhǎng)度為50000的1維數(shù)組,存有圖像對(duì)應(yīng)的分類標(biāo)簽(從0到9)年叮,Yte 對(duì)應(yīng)長(zhǎng)度為10000的1維數(shù)組:

Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # 這個(gè)函數(shù)可以加載CIFAR10的數(shù)據(jù)
# Xtr是一個(gè)50000x32x32x3的數(shù)組具被,一共50000個(gè)數(shù)據(jù),
# 每條數(shù)據(jù)都是32行32列的數(shù)組只损,數(shù)組每個(gè)元素都是一個(gè)三維數(shù)組一姿,表示RGB七咧。
# Xte是一個(gè)10000x32x32x3的數(shù)組;
# Ytr是一個(gè)長(zhǎng)度為50000的一維數(shù)組叮叹,Yte是一個(gè)長(zhǎng)度為10000的一維數(shù)組艾栋。
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) 
# Xtr_rows是50000x3072的數(shù)組,按每個(gè)像素點(diǎn)排列蛉顽,每個(gè)像素點(diǎn)有三個(gè)值蝗砾。
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) 
# Xte_rows是10000x3072的數(shù)組
''' shape會(huì)返回?cái)?shù)組的行和列數(shù)元組:(行數(shù),列數(shù))携冤,shape[0]表示行數(shù), 
Xtr.shape[0]會(huì)返回50000遥诉;Xtr.shape會(huì)返回(50000,32噪叙,32,3)
Xtr.reshape(50000霉翔,3072)會(huì)將Xtr 重構(gòu)成50000x3072數(shù)組睁蕾,等于 np.reshape(Xtr, (50000,3072))'''

現(xiàn)在我們得到所有的圖像數(shù)據(jù),每張圖片對(duì)應(yīng)一個(gè)長(zhǎng)度為3072的行向量债朵。接下來(lái)展示如何訓(xùn)練并評(píng)價(jià)一個(gè)分類器:

nn = NearestNeighbor() # 創(chuàng)建一個(gè)最鄰近分類器對(duì)象
nn.train(Xtr_rows, Ytr) # 用訓(xùn)練圖片數(shù)據(jù)和標(biāo)簽訓(xùn)練分類器
Yte_predict = nn.predict(Xte_rows) # 預(yù)測(cè)測(cè)試圖片的標(biāo)簽
# 并輸出預(yù)測(cè)準(zhǔn)確率子眶,是一個(gè)平均值
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )

我們常常使用準(zhǔn)確率作為評(píng)價(jià)標(biāo)準(zhǔn),它描述了我們預(yù)測(cè)正確的得分序芦。請(qǐng)注意以后我們實(shí)現(xiàn)的所有分類器都需要有這個(gè)接口函數(shù)(API):train(X, y) 函數(shù)臭杰。該函數(shù)使用訓(xùn)練集的數(shù)據(jù)和標(biāo)簽來(lái)進(jìn)行訓(xùn)練谚中。從其內(nèi)部來(lái)看渴杆,類應(yīng)該實(shí)現(xiàn)一些關(guān)于標(biāo)簽和標(biāo)簽如何被預(yù)測(cè)的模型。這里還有個(gè)predict(X) 函數(shù)宪塔,它的作用是預(yù)測(cè)輸入的新數(shù)據(jù)的分類標(biāo)簽磁奖。下面就是使用L1距離的Nearest Neighbor分類器的實(shí)現(xiàn):

import numpy as np

class NearestNeighbor(object):
  def __init__(self):
    pass

  def train(self, X, y):
    """ X 是 NxD 維的數(shù)組,每一行都是一個(gè)樣本某筐,比如一張圖片比搭,D 是樣本的數(shù)據(jù)維度;
    Y 是長(zhǎng)度為 N 的一維數(shù)組南誊。 """
    # 最鄰近分類器只是簡(jiǎn)單的記住所有的訓(xùn)練數(shù)據(jù)
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ X 是 NxD 維的數(shù)組身诺,每一行都是一個(gè)希望預(yù)測(cè)其標(biāo)簽的樣本 """
    num_test = X.shape[0]
    # 確保輸出的標(biāo)簽數(shù)據(jù)類型和輸入的標(biāo)簽格式一致,長(zhǎng)度是測(cè)試樣本數(shù)
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # 循環(huán)所有測(cè)試樣本數(shù)抄囚,即測(cè)試數(shù)組的行數(shù)
    for i in range(num_test):
      # 為第 i 張測(cè)試圖片找到最接近的訓(xùn)練圖片      
      # 使用 L1 距離 (差值的絕對(duì)值求和)
      '''self.Xtr - X[i,:] 利用傳播機(jī)制霉赡,求測(cè)試集第 i 張圖片對(duì)應(yīng)的行向量和
      訓(xùn)練集所有圖片行向量的差值,得到一個(gè)一個(gè)50000x3072的差值矩陣怠苔;
      abs(self.Xtr - X[i,:] )會(huì)將矩陣所有元素求絕對(duì)值同廉;
      然后axis = 1 會(huì)對(duì)差值矩陣按行求和,最終得到一個(gè)長(zhǎng)度為50000的一維
      數(shù)組,存放第 i 張圖片和訓(xùn)練集所有50000張圖片的L1距離迫肖。'''
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # 獲取距離最小的訓(xùn)練集圖片索引      
      Ypred[i] = self.ytr[min_index] # 預(yù)測(cè)第 i 張測(cè)試集圖片的標(biāo)簽時(shí)與其最接近的訓(xùn)練集圖片索引

    return Ypred

這段代碼的訓(xùn)練時(shí)間復(fù)雜度為 O(1)锅劝,因?yàn)橹皇呛?jiǎn)單的存儲(chǔ)數(shù)據(jù),不管數(shù)據(jù)多大蟆湖,都是一個(gè)相對(duì)固定的時(shí)間故爵;如果訓(xùn)練集有N個(gè)樣本,則預(yù)測(cè)時(shí)間復(fù)雜度為 O(N)隅津,因?yàn)闇y(cè)試圖片要和訓(xùn)練集每張圖片進(jìn)行比較诬垂。所以這是一個(gè)不好的分類器,分類器預(yù)測(cè)的時(shí)候要快伦仍,訓(xùn)練的時(shí)候可以慢结窘。

這段代碼跑CIFAR-10,準(zhǔn)確率能達(dá)到38.6%充蓝。這比隨機(jī)猜測(cè)的10%要好隧枫,但是比人類識(shí)別的水平和卷積神經(jīng)網(wǎng)絡(luò)能達(dá)到的95%還是差很多。(Kaggle算法競(jìng)賽排行榜)

L2距離(歐式距離)

另一個(gè)常用的方法是L2距離谓苟,從幾何學(xué)的角度官脓,可以理解為它在計(jì)算兩個(gè)向量間的歐式距離。L2距離的公式如下:

d_{2} (I_{1},I_{2})=\sqrt{\sum_{p}(I_{1}^p - I_{2}^p )^2 }

依舊是在計(jì)算像素間的差值涝焙,只是先求差值的平方卑笨,然后把這些平方全部加起來(lái),最后對(duì)這個(gè)和開(kāi)方仑撞。此時(shí)的代碼只需改動(dòng)一行:

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
'''np.square(self.Xtr - X[i,:]) 會(huì)對(duì)差值矩陣的每一個(gè)元素求平方'''

注意在這里使用了np.sqrt赤兴,但是在實(shí)際中可能不用。因?yàn)閷?duì)不同距離的絕對(duì)值求平方根雖然改變了數(shù)值大小隧哮,但依然保持了不同距離大小的順序搀缠。這個(gè)模型,正確率是35.4%近迁,比剛才低了一點(diǎn)艺普。

L1和L2比較
在 L1 距離更依賴于坐標(biāo)軸的選定,坐標(biāo)軸選擇不同L1距離也會(huì)跟著變化鉴竭,判定的數(shù)據(jù)歸類的邊界會(huì)更趨向于貼近坐標(biāo)系的軸來(lái)分割所屬區(qū)域歧譬,而 L2 的話相對(duì)來(lái)說(shuō)于坐標(biāo)系的關(guān)聯(lián)度沒(méi)那么大,會(huì)形成一個(gè)圓搏存,不跟隨坐標(biāo)軸變化瑰步;在面對(duì)兩個(gè)向量之間的差異時(shí),L2比L1更加不能容忍這些差異璧眠。也就是說(shuō)缩焦,相對(duì)于1個(gè)巨大的差異读虏,L2距離更傾向于接受多個(gè)中等程度的差異(因?yàn)闀?huì)把差值平方)。L1和L2都是在p-norm常用的特殊形式袁滥。

當(dāng)圖像中有特別在意的特征時(shí)可以選擇L1距離盖桥;當(dāng)對(duì)圖像中所有元素未知時(shí),L2距離會(huì)更自然一些题翻。最好的方式是兩種距離都嘗試揩徊,然后找出最好的那一個(gè)。

2 k-最近鄰分類器(k-Nearest Neighbor Classifier)

只用最相似的1張圖片的標(biāo)簽來(lái)作為測(cè)試圖像的標(biāo)簽很不合理嵌赠,可以使用k-Nearest Neighbor分類器塑荒。它的思想是:找最相似的k個(gè)圖片的標(biāo)簽,k中數(shù)量最多的標(biāo)簽作為對(duì)測(cè)試圖片的預(yù)測(cè)姜挺。當(dāng)k=1的時(shí)候齿税,k-Nearest Neighbor分類器就是上面所說(shuō)的最鄰近分類器。從直觀感受上就可以看到炊豪,更高的k值可以讓分類的效果更平滑偎窘,使得分類器對(duì)于異常值更有抵抗力。

圖5 NN分類器和5-NN分類器對(duì)比
上面示例展示了NN分類器和5-NN分類器的區(qū)別溜在。例子使用了2維的點(diǎn)來(lái)表示圖片,分成3類(紅他托、綠掖肋、藍(lán))。不同顏色區(qū)域代表的是使用L2距離的分類器的決策邊界赏参。在NN分類器中志笼,異常的數(shù)據(jù)點(diǎn)(比如:在藍(lán)色區(qū)域中的綠點(diǎn))制造出一個(gè)不正確預(yù)測(cè)的孤島。5-NN分類器將這些不規(guī)則都平滑了把篓,使得它針對(duì)測(cè)試數(shù)據(jù)的泛化(generalization)能力更好纫溃。注意,5-NN中也存在一些白色區(qū)域韧掩,這些區(qū)域是因?yàn)?個(gè)近鄰標(biāo)簽中的最高數(shù)相同導(dǎo)致的分類模糊(即圖像與兩個(gè)以上的分類標(biāo)簽綁定)紊浩。(比如:2個(gè)鄰居是紅色,2個(gè)鄰居是藍(lán)色疗锐,還有1個(gè)是綠色坊谁,所以無(wú)法判定是紅色還是藍(lán)色)。

2.1 超參數(shù)(hyperparameter)調(diào)優(yōu)

k-NN分類器需要設(shè)定k值滑臊,如何選擇k值最合適口芍?L1距離和L2距離選哪個(gè)比較好?還有不少選擇我們甚至都沒(méi)有考慮到(比如:點(diǎn)積)雇卷。所有這些選擇鬓椭,被稱為超參數(shù)颠猴。在基于數(shù)據(jù)進(jìn)行學(xué)習(xí)的機(jī)器學(xué)習(xí)算法設(shè)計(jì)中,超參數(shù)是很常見(jiàn)的小染。

一般說(shuō)來(lái)翘瓮,這些超參數(shù)只能在外部設(shè)置,不能自動(dòng)學(xué)習(xí)氧映,具體怎么設(shè)置或取值并不是顯而易見(jiàn)的春畔,需要嘗試不同的值,看哪個(gè)值表現(xiàn)最好就選哪個(gè)岛都。(特別注意:決不能使用測(cè)試集來(lái)進(jìn)行調(diào)優(yōu)律姨。如果使用測(cè)試集來(lái)調(diào)優(yōu),而且算法看起來(lái)效果不錯(cuò)臼疫,真正的危險(xiǎn)在于:算法實(shí)際部署后择份,性能可能會(huì)遠(yuǎn)低于預(yù)期。這種情況烫堤,稱之為算法對(duì)測(cè)試集過(guò)擬合荣赶。從另一個(gè)角度來(lái)說(shuō),如果使用測(cè)試集來(lái)調(diào)優(yōu)鸽斟,實(shí)際上就是把測(cè)試集當(dāng)做訓(xùn)練集拔创,由測(cè)試集訓(xùn)練出來(lái)的算法再預(yù)測(cè)測(cè)試集,性能自然會(huì)看起來(lái)很好富蓄,但實(shí)際部署起來(lái)效果就會(huì)差很多剩燥。所以,最終測(cè)試的時(shí)候再使用測(cè)試集立倍,可以很好地近似度量分類器的泛化性能灭红。)

測(cè)試數(shù)據(jù)集只能使用一次,而且是在訓(xùn)練完成后評(píng)價(jià)最終模型時(shí)使用口注,不可用來(lái)調(diào)優(yōu)变擒!

方法1:設(shè)置驗(yàn)證集

從訓(xùn)練集中取出一部分?jǐn)?shù)據(jù)用來(lái)調(diào)優(yōu),稱之為驗(yàn)證集(validation set)寝志。以CIFAR-10為例娇斑,可以用49000個(gè)圖像作為訓(xùn)練集,用1000個(gè)圖像作為驗(yàn)證集材部。驗(yàn)證集其實(shí)就是作為假的測(cè)試集來(lái)調(diào)優(yōu)悠菜。代碼如下:

# 假設(shè) Xtr_rows, Ytr, Xte_rows, Yte 還是和之前一樣
# Xtr_rows 是 50,000 x 3072 的矩陣
Xval_rows = Xtr_rows[:1000, :] # 取前 1000 個(gè)訓(xùn)練集樣本作為驗(yàn)證集
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # 剩下的 49,000 個(gè)作為訓(xùn)練集
Ytr = Ytr[1000:]

# 找出在驗(yàn)證集表現(xiàn)最好的超參數(shù) k 
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:
  # 使用一個(gè)明確的 k 值評(píng)估驗(yàn)證集
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # 這里假設(shè)一個(gè)修正過(guò)的 NearestNeighbor 類,可以把 k 值作為參數(shù)輸入
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # 把每個(gè) k 值和相應(yīng)的準(zhǔn)確率保存起來(lái)
  validation_accuracies.append((k, acc))

程序結(jié)束后败富,作圖分析出哪個(gè)k值表現(xiàn)最好悔醋,然后用這個(gè)k值來(lái)跑真正的測(cè)試集,并作出對(duì)算法的評(píng)價(jià)兽叮。

方法2:交叉驗(yàn)證

訓(xùn)練集數(shù)量較蟹医尽(因此驗(yàn)證集的數(shù)量更谢浮)時(shí),可以使用交叉驗(yàn)證的方法账阻。還是用剛才的例子蒂秘,如果是交叉驗(yàn)證集,我們就不是取1000個(gè)圖像淘太,而是將訓(xùn)練集平均分成5份姻僧,每份10000張圖片 ,其中4份用來(lái)訓(xùn)練蒲牧,1份用來(lái)驗(yàn)證撇贺。然后我們循環(huán)著取其中4份來(lái)訓(xùn)練,其中1份來(lái)驗(yàn)證冰抢,最后取所有5次驗(yàn)證結(jié)果的平均值作為算法驗(yàn)證結(jié)果松嘶。

圖6 訓(xùn)練集分成5份,輪流作為驗(yàn)證集
下面是5份交叉驗(yàn)證對(duì) k 值調(diào)優(yōu)的例子挎扰。針對(duì)每個(gè) k 值翠订,得到5次驗(yàn)證的準(zhǔn)確率結(jié)果,取其平均值遵倦,然后對(duì)不同 k 值的平均表現(xiàn)畫線連接尽超。本例中,當(dāng) k=7 的時(shí)算法表現(xiàn)最好(對(duì)應(yīng)圖中的準(zhǔn)確率峰值)梧躺。如果我們將訓(xùn)練集分成更多份數(shù)似谁,直線一般會(huì)更加平滑(噪音更少)。

圖7 交叉驗(yàn)證超參數(shù)調(diào)優(yōu)實(shí)例

實(shí)際情況下燥狰,深度學(xué)習(xí)不會(huì)使用交叉驗(yàn)證,主要是因?yàn)樗鼤?huì)耗費(fèi)較多的計(jì)算資源斜筐。一般直接把訓(xùn)練集按照50%-90%的比例分成訓(xùn)練集和驗(yàn)證集龙致。但是訓(xùn)練集數(shù)量不多時(shí)可以使用交叉驗(yàn)證,一般都是分成3顷链、5和10份目代。

2.2 k-Nearest Neighbor分類器的優(yōu)劣

優(yōu)點(diǎn):
易于理解,實(shí)現(xiàn)簡(jiǎn)單嗤练;算法的訓(xùn)練不需要花時(shí)間榛了,因?yàn)槠溆?xùn)練過(guò)程只是將訓(xùn)練集數(shù)據(jù)存儲(chǔ)起來(lái)。

缺點(diǎn):
1煞抬、測(cè)試要花費(fèi)大量時(shí)間霜大,因?yàn)槊總€(gè)測(cè)試圖像需要和所有存儲(chǔ)的訓(xùn)練圖像進(jìn)行比較在實(shí)際應(yīng)用中,關(guān)注測(cè)試效率遠(yuǎn)遠(yuǎn)高于訓(xùn)練效率革答;
2战坤、使用像素差異來(lái)比較圖像是不夠的曙强,圖片間L2距離小,更多的是被背景主導(dǎo)而不是圖片語(yǔ)義內(nèi)容本身主導(dǎo)途茫,往往背景相似圖片的L2距離就會(huì)小碟嘴。也就是說(shuō),在高維度數(shù)據(jù)上囊卜,基于像素的相似和基于感官上的相似非常不同娜扇。感官上不同的兩張圖片,可能有相同的L2距離栅组。
3雀瓢、維度災(zāi)難。k-NN 有點(diǎn)像訓(xùn)練數(shù)據(jù)把樣本空間分成幾塊笑窜,我們需要訓(xùn)練數(shù)據(jù)密集的分布在樣本空間里致燥,否則測(cè)試圖片的最鄰近點(diǎn)可能實(shí)際距離會(huì)非常遠(yuǎn),導(dǎo)致和最接近的訓(xùn)練集樣本實(shí)際上完全不同排截。但是如果使訓(xùn)練數(shù)據(jù)密集分布嫌蚤,需要的訓(xùn)練集數(shù)量指數(shù)倍增加,是數(shù)據(jù)維度的平方断傲。

2.3 實(shí)際應(yīng)用k-NN

1. 預(yù)處理數(shù)據(jù):對(duì)數(shù)據(jù)中的特征進(jìn)行歸一化(normalize)脱吱,讓其具有零均值(zero mean)和單位方差(unit variance)。本小節(jié)不討論认罩,是因?yàn)閳D像中的像素都是同質(zhì)的箱蝠,不會(huì)表現(xiàn)出較大的差異分布,不需要標(biāo)準(zhǔn)化處理垦垂。
2. 降維:如果數(shù)據(jù)是高維數(shù)據(jù)宦搬,考慮使用降維方法逾滥,比如PCA或者隨機(jī)投影稚伍。
3. 將數(shù)據(jù)隨機(jī)分入訓(xùn)練集和驗(yàn)證集:一般規(guī)律,70%-90% 數(shù)據(jù)作為訓(xùn)練集教寂。這個(gè)比例根據(jù)算法中有多少超參數(shù)页慷,以及這些超參數(shù)對(duì)于算法的預(yù)期影響來(lái)決定憔足。如果需要預(yù)測(cè)的超參數(shù)很多,那么就應(yīng)該使用更大的驗(yàn)證集來(lái)有效地估計(jì)它們酒繁;如果擔(dān)心驗(yàn)證集數(shù)量不夠滓彰,那么就嘗試交叉驗(yàn)證方法;如果計(jì)算資源足夠州袒,使用交叉驗(yàn)證更好(份數(shù)越多揭绑,效果越好,也更耗費(fèi)計(jì)算資源)郎哭。
4. 在驗(yàn)證集上調(diào)優(yōu):嘗試足夠多的k值洗做,嘗試L1和L2兩種范數(shù)計(jì)算方式弓叛。
5. 加速分類器:如果分類器跑得太慢,嘗試使用ANN庫(kù)(比如FLANN來(lái)加速這個(gè)過(guò)程诚纸,其代價(jià)是降低一些準(zhǔn)確率撰筷。
6. 對(duì)最優(yōu)的超參數(shù)做記錄:記錄最優(yōu)參數(shù)后,不要使用最優(yōu)參數(shù)的算法在完整的訓(xùn)練集上運(yùn)行并再次訓(xùn)練畦徘,這樣做會(huì)破壞對(duì)于最優(yōu)參數(shù)的估計(jì)毕籽。直接使用測(cè)試集來(lái)測(cè)試用最優(yōu)參數(shù)設(shè)置好的最優(yōu)模型,得到測(cè)試集數(shù)據(jù)的分類準(zhǔn)確率井辆,并以此作為你的k-NN分類器在該數(shù)據(jù)上的性能表現(xiàn)关筒。

3 線性分類I——評(píng)分函數(shù)

3.1 線性分類概述

k-NN 模型中訓(xùn)練過(guò)程中沒(méi)有使用任何參數(shù),只是單純的把訓(xùn)練數(shù)據(jù)存儲(chǔ)起來(lái)(參數(shù) k 是在預(yù)測(cè)中使用的杯缺,找出 k 個(gè)接近的圖片蒸播,然后找出標(biāo)簽最多的,并且 k 是超參數(shù)萍肆,是人為設(shè)定的袍榆。)。與之相對(duì)的是參數(shù)模型塘揣,參數(shù)模型往往會(huì)在訓(xùn)練完成后得到一組參數(shù)包雀,之后就可以完全扔掉訓(xùn)練數(shù)據(jù),預(yù)測(cè)的時(shí)候只需和這組參數(shù)做某種運(yùn)算亲铡,即可根據(jù)運(yùn)算結(jié)果做出判斷才写。線性分類器是參數(shù)模型里最簡(jiǎn)單的一種,但卻是神經(jīng)網(wǎng)絡(luò)里很重要的基礎(chǔ)模塊奖蔓。

線性分類的方法由兩部分組成赞草,一個(gè)是評(píng)分函數(shù)(score function),它是原始圖像數(shù)據(jù)到類別分值的映射吆鹤。另一個(gè)是損失函數(shù)(loss function)厨疙,它用來(lái)量化評(píng)分函數(shù)計(jì)算的分?jǐn)?shù)與真實(shí)標(biāo)簽之間的一致性。該方法可轉(zhuǎn)化為一個(gè)最優(yōu)化問(wèn)題檀头,在最優(yōu)化過(guò)程中轰异,通過(guò)更新評(píng)分函數(shù)的參數(shù)來(lái)最小化損失函數(shù)值岖沛。

評(píng)分函數(shù):從圖像到類別分值的參數(shù)化映射

評(píng)分函數(shù)將圖像的像素值映射為各個(gè)分類類別的得分暑始,得分高低代表圖像屬于該類別的可能性高低。上面的所有說(shuō)明都比較抽象婴削,下面以具體的例子說(shuō)明廊镜。

重新回到 k-NN 使用的CIFAR-10圖像分類數(shù)據(jù)集。假設(shè)我們的訓(xùn)練集有 N 個(gè)樣本唉俗,這里 N=50000嗤朴,每個(gè)樣本x_{i}\in R^D配椭,其中 i = 1,2,..N,這里的 D=3072雹姊;每個(gè)x_{i}對(duì)應(yīng)著一個(gè)標(biāo)簽y_{i}股缸,y_{i}在[1, K]上取值,K 表示總分類數(shù)吱雏,這里 K=10《匾觯現(xiàn)在可以定義評(píng)分函數(shù):f:R^D \rightarrow R^K,即把一個(gè)D 維的圖像映射為K 個(gè)類別的分?jǐn)?shù)歧杏。

直接能想到的一個(gè)模型就是參數(shù)和輸入數(shù)據(jù)相乘的形式镰惦。比如:

f(x_{i},W,b)=Wx_{i}+b,其中參數(shù)W被稱為權(quán)重犬绒,b被稱為偏差向量

在上面的公式中旺入,假設(shè)每個(gè)圖像數(shù)據(jù)都被拉長(zhǎng)為一個(gè)長(zhǎng)度為D的列向量,大小為[D x 1]凯力。其中大小為 [K x D] 的矩陣W和大小為 [K x 1] 的列向量b為該函數(shù)的參數(shù)(parameters)茵瘾。還是以CIFAR-10為例,x_{i}就包含了第 i 個(gè)圖像的所有像素信息沮协,這些信息被拉成為一個(gè)[3072 x 1]的列向量龄捡,W大小為[10x3072],b的大小為[10x1]慷暂。因此聘殖,輸入3072個(gè)數(shù)字(原始像素?cái)?shù)值),函數(shù)輸出10個(gè)數(shù)字(不同分類得到的分值)行瑞,是一個(gè)3072維到10維的映射奸腺。

注意:

  • 常常混用權(quán)重(weights)參數(shù)(parameters)這兩個(gè)術(shù)語(yǔ)血久,實(shí)際上數(shù)據(jù)和參數(shù)相乘突照,就相當(dāng)于數(shù)據(jù)占的比重,這個(gè)權(quán)重就是參數(shù)值氧吐;
  • 該方法的一個(gè)優(yōu)勢(shì)是訓(xùn)練數(shù)據(jù)是用來(lái)學(xué)習(xí)參數(shù)Wb的讹蘑,一旦訓(xùn)練完成,訓(xùn)練數(shù)據(jù)就可以丟棄筑舅,留下學(xué)習(xí)到的參數(shù)即可座慰。當(dāng)測(cè)試圖像時(shí)可以簡(jiǎn)單地把圖像數(shù)據(jù)輸入給函數(shù),函數(shù)計(jì)算出的分類分值來(lái)進(jìn)行分類翠拣;
  • 輸入數(shù)據(jù)(x_{i},y_{i})是給定且不可改變的版仔,但參數(shù)Wb是可改變的。目標(biāo)就是通過(guò)改變這些參數(shù),使得計(jì)算出來(lái)的分類分值情況和訓(xùn)練集中圖像數(shù)據(jù)的真實(shí)類別標(biāo)簽相符蛮粮;
  • 只需一個(gè)矩陣乘法和一個(gè)矩陣加法就能對(duì)一個(gè)測(cè)試數(shù)據(jù)分類益缎,這比k-NN中將測(cè)試圖像和所有訓(xùn)練數(shù)據(jù)做比較的方法快多了。

3.2 理解線性分類器

理解一:W是所有分類器的組合

圖8 實(shí)際計(jì)算評(píng)分函數(shù)

如上圖所示然想,將小貓的圖像像素?cái)?shù)據(jù)拉伸成一個(gè)列向量xi莺奔,這里為方便說(shuō)明,假設(shè)圖像只有4個(gè)像素(都是黑白像素变泄,不考慮RGB通道)弊仪,即 D=4;有3個(gè)分類(紅色代表貓杖刷,綠色代表狗励饵,藍(lán)色代表船,顏色僅代表分類滑燃,和RGB通道沒(méi)有關(guān)系)役听,即 K=3。W 矩陣乘列向量xi表窘,得到各個(gè)分類的分值典予。實(shí)際上,我們可以看到乐严,參數(shù)矩陣 W 相當(dāng)于是三個(gè)分類器的組合瘤袖,W 的每一行都是一個(gè)分類器,分別對(duì)應(yīng)貓昂验、狗捂敌、船。每個(gè)分類器的參數(shù)個(gè)數(shù)等于圖像數(shù)據(jù)的維度既琴,每個(gè)像素和對(duì)應(yīng)的參數(shù)相乘占婉,就表示該像素在該分類器中應(yīng)占的比重。需要注意的是甫恩,這個(gè) W 一點(diǎn)也不好:貓分類的分值非常低逆济。從上圖來(lái)看,算法倒是覺(jué)得這個(gè)圖像是一只狗磺箕。

抽象一點(diǎn)的說(shuō)法奖慌,線性分類器會(huì)計(jì)算圖像中3個(gè)顏色通道中所有像素的值與權(quán)重矩陣的乘積,從而得到分類分值松靡。根據(jù)我們對(duì)權(quán)重設(shè)置的值简僧,對(duì)于圖像中的某些位置的某些顏色,函數(shù)表現(xiàn)出喜好或者厭惡(根據(jù)每個(gè)權(quán)重的符號(hào)而定)击困。舉個(gè)例子涎劈,可以想象“船”分類就是被大量的藍(lán)色所包圍(對(duì)應(yīng)的就是水)。那么“船”分類器在藍(lán)色通道上的權(quán)重就有很多的正權(quán)重(它們的出現(xiàn)提高了“船”分類的分值)阅茶,而在綠色和紅色通道上的權(quán)重為負(fù)的就比較多(它們的出現(xiàn)降低了“船”分類的分值)蛛枚。從上面的小貓示例也能看出,貓分類器對(duì)第二個(gè)位置的像素比較“厭惡”脸哀,而恰好輸入的小貓圖像第二個(gè)位置像素值很大蹦浦,從而導(dǎo)致得到一個(gè)很低的分?jǐn)?shù)。(當(dāng)然撞蜂,這個(gè)分類器是錯(cuò)誤的盲镶。)

理解二:將線性分類器看做模板匹配

把權(quán)重W的每一行看作一個(gè)分類的模板,一張圖像對(duì)應(yīng)不同分類的得分蝌诡,是通過(guò)使用內(nèi)積(也叫點(diǎn)積)來(lái)比較圖像和模板溉贿,然后找到和哪個(gè)模板最相似。從這個(gè)角度來(lái)看浦旱,線性分類器就是在利用學(xué)習(xí)到的模板宇色,針對(duì)圖像做模板匹配。從另一個(gè)角度來(lái)看颁湖,可以認(rèn)為還是在高效地使用k-NN宣蠕,不同的是我們沒(méi)有使用所有的訓(xùn)練集的圖像來(lái)比較,而是每個(gè)類別只用了一張圖片(這張圖片是我們學(xué)習(xí)到的甥捺,而不是訓(xùn)練集中的某一張)抢蚀,而且我們會(huì)使用(負(fù))內(nèi)積來(lái)計(jì)算向量間的距離,而不是使用L1或者L2距離镰禾。

圖9 10個(gè)學(xué)習(xí)后的模板
上圖是以CIFAR-10為訓(xùn)練集皿曲,學(xué)習(xí)結(jié)束后的權(quán)重的例子∥庹欤可以看到馬的模板看起來(lái)似乎是兩個(gè)頭的馬谷饿,這是因?yàn)橛?xùn)練集中的馬的圖像中馬頭朝向各有左右造成的。線性分類器將這兩種情況融合到一起了妈倔;汽車的模板看起來(lái)也是將幾個(gè)不同的模型融合到了一個(gè)模板中博投,這個(gè)模板上的車是紅色的,是因?yàn)镃IFAR-10中訓(xùn)練集的車大多是紅色的盯蝴。線性分類器對(duì)于不同顏色的車的分類能力是很弱的毅哗,但是后面可以看到神經(jīng)網(wǎng)絡(luò)是可以完成這一任務(wù)的;船的模板如期望的那樣有很多藍(lán)色像素捧挺。如果圖像是一艘船行駛在大海上虑绵,那么這個(gè)模板利用內(nèi)積計(jì)算圖像將給出很高的分?jǐn)?shù)。

理解三:將圖像看做高維度的點(diǎn)

既然定義每個(gè)分類類別的分值是權(quán)重和圖像的矩陣乘積闽烙,那么每個(gè)分類類別的分?jǐn)?shù)就是這個(gè)空間中的一個(gè)線性函數(shù)的函數(shù)值翅睛。我們沒(méi)辦法可視化3072維空間中的線性函數(shù)声搁,但假設(shè)把這些維度擠壓到二維,那么就可以看看這些分類器在做什么了:


圖10 二維空間示意圖

其中每個(gè)圖像是一個(gè)點(diǎn)捕发,有3個(gè)分類器疏旨。以紅色的汽車分類器為例,紅線表示空間中汽車分類分?jǐn)?shù)為0的點(diǎn)的集合扎酷,紅色的箭頭表示分值上升的方向檐涝。所有紅線右邊的點(diǎn)的分?jǐn)?shù)值均為正,且線性升高法挨。紅線左邊的點(diǎn)分值為負(fù)谁榜,且線性降低。

從上面可以看到凡纳,W的每一行都是一個(gè)分類類別的分類器窃植。對(duì)于這些數(shù)字的幾何解釋是:如果改變其中一行的數(shù)字,會(huì)看見(jiàn)分類器在空間中對(duì)應(yīng)的直線開(kāi)始向著不同方向旋轉(zhuǎn)荐糜。而偏差b撕瞧,則允許分類器對(duì)應(yīng)的直線平移。需要注意的是狞尔,如果沒(méi)有偏差丛版,無(wú)論權(quán)重如何,在x_{i}=0時(shí)分類分值始終為0偏序。這樣所有分類器的線都不得不穿過(guò)原點(diǎn)页畦。

3.3 偏差和權(quán)重合并

分開(kāi)處理這兩個(gè)參數(shù)(權(quán)重參數(shù)W和偏差參數(shù)b)有點(diǎn)笨拙,一般常用的方法是把兩個(gè)參數(shù)放到同一個(gè)矩陣中研儒,同時(shí)列向量x_{i}就要增加一個(gè)維度豫缨,這個(gè)維度的數(shù)值是常量1,這就是默認(rèn)的偏差維度端朵。這樣新的公式就簡(jiǎn)化成下面這樣:

f(x_{i},W,b)=Wx_{i}

還是以CIFAR-10為例好芭,那么x_{i}的大小就變成[3073x1],而不是 [3072x1] 了冲呢,多出了包含常量1的1個(gè)維度舍败;W大小就是[10x3073]了,W中多出來(lái)的這一列對(duì)應(yīng)的就是偏差值b敬拓,具體見(jiàn)下圖:

圖11 W和b合并后的示意圖

通過(guò)右邊這樣做邻薯,就只需要學(xué)習(xí)一個(gè)權(quán)重矩陣,而不用去學(xué)習(xí)兩個(gè)分別裝著權(quán)重和偏差的矩陣乘凸。

3.4 圖像數(shù)據(jù)預(yù)處理

在上面的例子中厕诡,所有圖像都是使用的原始像素值(從0到255)。在機(jī)器學(xué)習(xí)中营勤,對(duì)于輸入的特征做歸一化(normalization)處理是常見(jiàn)的方式灵嫌。而在圖像分類的例子中壹罚,圖像上的每個(gè)像素可以看做一個(gè)特征。在實(shí)踐中寿羞,對(duì)每個(gè)特征減去平均值來(lái)中心化數(shù)據(jù)是非常重要的猖凛。在這些圖片的例子中,該步驟是根據(jù)訓(xùn)練集中所有的圖像計(jì)算出一個(gè)平均圖像值稠曼,然后每個(gè)圖像都減去這個(gè)平均值,這樣圖像的像素值就大約分布在[-127, 127]之間了客年。下一個(gè)常見(jiàn)步驟是霞幅,讓所有數(shù)值分布的區(qū)間變?yōu)閇-1, 1]。

3.5 線性分類器難以處理的情形

圖12 線性分類器難以處理的情形

這三種情形都無(wú)法找到合適的直線區(qū)分開(kāi)量瓜。case1是奇偶分類司恳,case3是有多個(gè)模型。

總結(jié)

  1. 圖像分類中的困難與挑戰(zhàn)绍傲;
  2. 數(shù)據(jù)驅(qū)動(dòng)方法扔傅、最鄰近算法、L1和L2距離烫饼;
  3. k-NN分類器猎塞、超參數(shù)調(diào)優(yōu)、k-NN的優(yōu)缺點(diǎn)與實(shí)際應(yīng)用杠纵;
  4. 線性分類的概念荠耽、評(píng)分函數(shù)的理解、參數(shù)合并比藻、數(shù)據(jù)預(yù)處理铝量。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银亲,隨后出現(xiàn)的幾起案子慢叨,更是在濱河造成了極大的恐慌,老刑警劉巖务蝠,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍谐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馏段,警方通過(guò)查閱死者的電腦和手機(jī)赠尾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毅弧,“玉大人气嫁,你說(shuō)我怎么就攤上這事」蛔” “怎么了寸宵?”我有些...
    開(kāi)封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵崖面,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我梯影,道長(zhǎng)巫员,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任甲棍,我火速辦了婚禮简识,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘感猛。我一直安慰自己七扰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布陪白。 她就那樣靜靜地躺著颈走,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咱士。 梳的紋絲不亂的頭發(fā)上立由,一...
    開(kāi)封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音序厉,去河邊找鬼锐膜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弛房,可吹牛的內(nèi)容都是我干的枣耀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庭再,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捞奕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拄轻,我...
    開(kāi)封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颅围,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后恨搓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體院促,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年斧抱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了常拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辉浦,死狀恐怖弄抬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宪郊,我是刑警寧澤掂恕,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布拖陆,位于F島的核電站,受9級(jí)特大地震影響懊亡,放射性物質(zhì)發(fā)生泄漏依啰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一店枣、第九天 我趴在偏房一處隱蔽的房頂上張望速警。 院中可真熱鬧,春花似錦鸯两、人聲如沸闷旧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸠匀。三九已至蕉斜,卻和暖如春逾柿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宅此。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工机错, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人父腕。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓弱匪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親璧亮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萧诫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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