- 機器學習算法在訓練過程中保存參數
轉載:@blog:http://blog.csdn.net/u012162613/article/details/43169019
參考:pickle — Python object serialization、DeepLearning 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文件的應用正是下文要講的,我們用它來保存機器學習算法訓練過程中的參數。
二、機器學習算法在訓練過程中如何保存參數?
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()
一個實例:
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])
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