CNN卷積神經網絡應用:人臉識別


轉載:@blog:http://blog.csdn.net/u012162613/article/details/43169019

參考:pickle — Python object serializationDeepLearning Getting started

一、python讀取"***.pkl.gz"文件

用到Python里的gzip以及cPickle模塊,簡單的使用代碼如下,如果想詳細了解可以參考上面給出的鏈接。

#以讀取mnist.pkl.gz為例  
import gzip,cPickle,  
f = gzip.open('mnist.pkl.gz', 'rb')  
train_set, valid_set, test_set = cPickle.load(f)  
f.close()  

其實就是分兩步,先讀取gz文件,再讀取pkl文件。pkl文件的應用正是下文要講的,我們用它來保存機器學習算法訓練過程中的參數。

二、機器學習算法在訓練過程中如何保存參數?

我們知道,機器學習算法的計算量特別大,跑起程序來少則幾十分鍾,多則幾小時甚至幾天,中間如果有什么狀況(比如電腦過熱重啟、程序出現一些小bug...)程序就會中斷,如果你沒把參數定時保存下來,前面的訓練就當白費了,所以很有必要在程序中加入定時保存參數的功能,這樣下次訓練就可以將參數初始化為上次保存下來的結果,而不是從頭開始隨機初始化。
那么如何保存模型參數?可以將參數深復制,或者調用python的數據永久存儲cPickle模塊,原理不多說,直接使用就行。(注:python里 有cPickle和pickle,cPickle基於c實現,比pickle快。)
直接用一個例子來說明如何使用:
import cPickle
a = [1, 2, 3]
b = {4:5, 6:7}

#保存,cPickle.dump函數。/ab是路徑,ab是保存的文件的名字,如果本來就有ab這個文件,將被覆寫,如果沒有,則創建。
#'wb'表示以二進制可寫的方式打開。dump中的-1表示使用highest protocol。  
write_file = open('ab', 'wb')
cPickle.dump(a, write_file, -1)
cPickle.dump(b, write_file, -1)
write_file.close()

#讀取,cPickle.load函數。
read_file = open('ab', 'rb')
a_1 = cPickle.load(read_file)
b_1 = cPickle.load(read_file)
print a_1, b_1
read_file.close()
[1, 2, 3] {4: 5, 6: 7}

在deeplearning算法中,因為用到GPU,經常是將參數聲明為shared變量,因此必須用上get_value()、set_value,例如有w、v、u三個shared變量,使用代碼如下:

import cPickle  
#保存  
write_file = open('path', 'wb')    
cPickle.dump(w.get_value(borrow=True), write_file, -1)    
cPickle.dump(v.get_value(borrow=True), write_file, -1)    
cPickle.dump(u.get_value(borrow=True), write_file, -1)   
write_file.close()  
  
#讀取  
read_file = open('path')  
w.set_value(cPickle.load(read_file), borrow=True)  
v.set_value(cPickle.load(read_file), borrow=True)  
u.set_value(cPickle.load(read_file), borrow=True)  
read_file.close()  

一個實例:

下面我以一個實際的例子來說明如何在程序中加入保存參數的功能。以 deeplearnig.net上的邏輯回歸為例,它的代碼地址: logistic_sgd.py。這個程序是將邏輯回歸用於MNIST分類,程序運行過程並不會保存參數,甚至運行結束時也不保存參數。怎么做可以保存參數?
在logistic_sgd.py代碼里最后面的sgd_optimization_mnist()函數里,有個while循環,里面有一句代碼:
if this_validation_loss < best_validation_loss:  

這句代碼的意思就是判斷當前的驗證損失是否小於最佳的驗證損失,是的話,下面會更新best_validation_loss,也就是說當前參數下,模型比之前的有了優化,因此我們可以在這個if語句后面加入保存參數的代碼:

save_params(classifier.W,classifier.b)  

save_params函數定義如下:

def save_params(param1,param2):  
    import cPickle  
    write_file = open('params', 'wb')   
    cPickle.dump(param1.get_value(borrow=True), write_file, -1)  
    cPickle.dump(param2.get_value(borrow=True), write_file, -1)  
    write_file.close()  

當然參數的個數根據需要去定義。在logistic_sgd.py中參數只有classifier.W,classifier.b,因此這里定義為save_params(param1,param2)。

在logistic_sgd.py里我加入了save_params(classifier.W,classifier.b),運行了3次epoch,中斷掉程序,在代碼所在的文件夾下,多出了一個params文件,我們來看看這個文件里是什么東西:

import cPickle  
f=open('params')  
w=cPickle.load(f)  
b=cPickle.load(f)  
  
#w大小是(n_in,n_out),b大小時(n_out,),b的值如下,因為MINST有10個類別,n_out=10,下面正是10個數  
array([-0.0888151 ,  0.16875755, -0.03238435, -0.06493175,  0.05245609,  
        0.1754718 , -0.0155049 ,  0.11216578, -0.26740651, -0.03980861])  
也就是說,params文件確實保存了我們訓練過程中的參數。
 
那么如何用保存下來的參數來初始化我們的模型的參數呢?
在logistic_sgd.py中的class LogisticRegression(object)下,self.W和self.b本來是初始化為0的,我們可以在下面加上幾行代碼,這樣就可以用我們保存下來的params文件來初始化參數了:
class LogisticRegression(object):  
    def __init__(self, input, n_in, n_out):  
        self.W = theano.shared(  
            value=numpy.zeros(  
                (n_in, n_out),  
                dtype=theano.config.floatX  
            ),  
            name='W',  
            borrow=True  
        )  
        self.b = theano.shared(  
            value=numpy.zeros(  
                (n_out,),  
                dtype=theano.config.floatX  
            ),  
            name='b',  
            borrow=True  
        )  
#!!!  
#加入的代碼在這里,程序運行到這里將會判斷當前路徑下有沒有params文件,有的話就拿來初始化W和b  
    if os.path.exists('params'):  
        f=open('params')  
        self.W.set_value(cPickle.load(f), borrow=True)  
        self.b.set_value(cPickle.load(f), borrow=True)  

轉載:@blog:http://blog.csdn.net/u012162613/article/details/43226127

計算機視覺、機器學習任務中,經常跟圖像打交道,在C++上有成熟的OpenCV可以使用,在Python中也有一個圖像處理庫PIL(Python Image Library),當然PIL沒有OpenCV那么多功能(比如一些人臉檢測的算法),不過在Python上,我們用PIL進行一些基本的圖像讀取與保存工作就行了,因為算法方面,Python有很多強大的算法庫(機器學習庫sklearn、深度學習庫theano)。

本文以一個人臉圖像數據庫Olivetti Faces為例,展示如何使用PIL模塊、cPickle模塊將這個圖像數據庫讀取並保存為pkl文件。

一、人臉圖像庫Olivetti Faces介紹

Olivetti Faces是紐約大學的一個比較小的人臉庫,由40個人的400張圖片構成,即每個人的人臉圖片為10張。每張圖片的灰度級為8位,每個像素的灰度大小位於0-255之間,每張圖片大小為64×64。如下圖,這個圖片大小是1190*942,一共有20*20張人臉,故每張人臉大小是(1190/20)*(942/20)即57*47=2679:

二、利用Python PIL、cPickle讀取和保存 Olivetti Faces

首先使用 PIL.Image打開獲取這張圖片,為了便於數值計算,將其轉化為 numpy.array類型,然后每張圖片攤成一個一維向量1*2679,因為有400張,所以得到了400*2679的numpy.array,接着使用 cPickle模塊,將轉化得到的numpy.array保存為 pkl文件。注意這是不帶label的數據,我們可以人工地給它們類別0~39,每個類別有10個樣本,故新建一個400*1的label,作為每張圖片對應的類別。
代碼如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM